内容概要:

一、生成器

二、迭代器

三、json&pickle数据序列化

一、生成器generator

在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10],当然有很多方法,下面的方法就叫列表生成式。

>>> [ i*2 for i in range(6) ]
[0, 2, 4, 6, 8, 10]

当然还有其他方法:

>>> a=map(lambda x:x*2,range(6))
>>> for i in a:
... print(i)
...
0
2
4
6
8
10

lambbda版本

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator。

>>> ( i*2 for i in range(6) )
<generator object <genexpr> at 0x000000000106B360>

当我们把列表生成式变成了生产器,它会有__next__()方法(在2.7中是next()),此时我们每调用一次,就会生成一次数据:

>>> a=( i*2 for i in range(6) )
>>> a.__next__()
0
>>> a.__next__()
2
>>> a.__next__()
4
>>> a.__next__()
6
>>>

普通的生成器

定义:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

yield作用:使函数状态停留在yield关键字执行完之后的状态,并返回当前的迭代值,当我们使用next方法的时候,会重新唤醒该函数,并从之前保留的状态继续执行下去yield下面的代码;

后续还提到send方法,作用是给yield发送返回数据,让我们来看看普通生成器。

def gen():
a=1
while a<10:
res=yield a
print(res)
a+=1
a=gen()
print(a.__next__())#调用next方法唤醒函数
print("分割线====")
print(a.__next__())
a.send("拿去")#向yield发送返回值
print(a.__next__())
结果:
1
分割线====
None
2
拿去
None
4

通常我们在使用的生成器的时候并不使用next的方法,而是使用for循环取得返回值(tips:当生成器执行到最后时候使用next方法会抛出StopIteration异常,而for循环不会。);

def gen():
a=1
while a<10:
yield a
a+=1
for i in gen():
print(i)
结果:
1
2
3
4
5
6
7
8
9
二、迭代器

概念:

可迭代对象(Iterable)):可以被for循环的对象或者数据类型叫做可迭代对象,所以像listtupledictsetstr、generator都是可迭代对象,这些可迭代对象可以通过iter()方法成为迭代器;

迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器,生成器是迭代器,但迭代器不一定是生成器;

可以使用isinstance()判断一个对象是否是Iterator对象

>>> from collections import Iterator,Iterable
>>> isinstance([],Iterator)#不是迭代器返回false
False
>>> isinstance([],Iterable)#可迭代对象返回True
True
>>> isinstance((i*2 for i in range(6)),Iterator)#是迭代器
True
>>> isinstance((i*2 for i in range(6)),Iterable)
True

python基础6之迭代器&生成器、json&pickle数据序列化的更多相关文章

  1. day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数

    回顾下上次的内容 转码过程: 先decode  为 Unicode(万国码 ) 然后encode 成需要的格式     3.0 默认是Unicode  不是UTF-8 所以不需要指定  如果非要转为U ...

  2. Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)

    装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能        原则:        1.不能修改被装饰的函数的源代码.        2.不 ...

  3. 装饰器、生成器,迭代器、Json & pickle 数据序列化

    1. 列表生成器:代码例子 a=[i*2 for i in range(10)] print(a) 运行效果如下: D:\python35\python.exe D:/python培训/s14/day ...

  4. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  5. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  6. 7th,Python基础4——迭代器、生成器、装饰器、Json&pickle数据序列化、软件目录结构规范

    1.列表生成式,迭代器&生成器 要求把列表[0,1,2,3,4,5,6,7,8,9]里面的每个值都加1,如何实现? 匿名函数实现: a = map(lambda x:x+1, a) for i ...

  7. json&pickle数据序列化模块

    用于序列化的模块 json,通用的序列化方式,序列化成为str类型,支持所有语言识别,序列化的数据具有局限性. pickle,python的所有数据类型都可以被序列化,序列化为bites格式,只适用于 ...

  8. Json & pickle 数据序列化

    前提: 文本文件中只能写入字符串或ascii码格式的内容. info={'name':'zoe','age':18} f=open('test.txt','w') f.write(info) #在文本 ...

  9. Python3 json &pickle 数据序列化

    json 所有语言通用的信息交换格式 json.dumps()将list列表.dict字典.元组.函数等对象转换为可以存储的字符格式存入文件 json.dump(数据对象名,已以写方式打开的对象) 直 ...

随机推荐

  1. 从JVM字节码执行看重载和重写

    Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的 ...

  2. 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

  3. NOTIC: Invalid argument supplied for foreach()

    NOTIC: [2] Invalid argument supplied for foreach() Warning: Invalid argument supplied for foreach() ...

  4. Struts2学习笔记(1)---相关配置

    Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架. 1创建action对象(三种) 1 创建普通的类,不继承任何类, ...

  5. GUI—ST_emWin移植

    GUI-ST_emWin移植 一.st_emwin移植 1.stemwin源文件下载:ST官网 https://my.st.com/content/my_st_com/en/search.html#q ...

  6. JS文本框每隔4个数字加一个空格,银行卡号文本框

    <input type="text" onkeypress="return (function(key,that){return (key>47&&a ...

  7. linux 常见操作指令

    1.ssh root@ip ssh 登录 2.ll ls 列出当文件夹下 所以文件 3. cd ./xx 进入 xx 文件夹 4. vim vi xxx 进入 xx文件的 编辑模式. i 开始编辑 e ...

  8. IDEA新建spring boot项目没有Spring Initializr选项

    在settings -> Plugins 里面搜索spring boot,勾选上,然后再重启下idea,就可以了.如果Plugins里面没有spring boot的话,先安装下,再勾选. 参考( ...

  9. python 最基本的的单例模型的实现及应用

    在我们python开发过程很多 ,在很多地方都会用到单例模式,确保数据的唯一性,最简单的单例模式,我们可以模块导入的方式实现,因为导入文件,无论import多少次  都只导入一次模块. 方法一:装饰器 ...

  10. React Native:真机断点调试+跨域资源加载出错问题解决

    写在前面 闲来无事,折腾了一下React Native,相比之前,开发体验好了不少.但在真机断点调试那里遇到了跨域资源加载出错的问题,一番探索总算解决,目测是RN新版本调试服务的bug. 遇到类似问题 ...