迭代器和生成器
2019-03-06 本文已影响0人
数据小黑升值记
Python 中的可迭代数据类型有:list,dic,tuple,set,可以适用dir函数查看可调用的方法。
- Iterable 可迭代的 -- > iter #只要含有iter方法的都是可迭代的
- [].iter() 迭代器 -- > next #通过next就可以从迭代器中一个一个的取值
- 迭代器协议 —— 内部含有next和iter方法的就是迭代器
迭代器的好处:
- 从容器类型中一个一个的取值,会把所有的值都取到。
- 节省内存空间,迭代器并不会在内存中再占用一大块内存, 而是随着循环 每次生成一个, 每次next每次给我一个
生成器
生成器函数
def gen():
for i in range(10):
yield i
g=gen()
此时g是一个生成器,只有通过next方法调用后才会一个个返回值
含有yield关键字的函数都是生成器函数
生成器函数的特点
- 调用之后函数内的代码不执行,返回生成器
- 每从生成器中取一个值就会执行一段代码,遇见yield就停止。
- 生成器函数 : 执行之后会得到一个生成器作为返回值
g=gen()
print(g)
b=g.__next__()
print(b)
c=g.__next__()
print(c)
执行上述代码,打印的结果如下:
<generator object gen at 0x000001F8B681F5C8>
0
1
此时的g只是一个生成器,只有调用了next方法才会有返回值
如何从生成器中取值:
- for :如果没有break会一直取直到取完
- next :每次只取一个
- send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
- 数据类型强制转换 :会一次性把所有数据都读到内存里
生成器表达式
- 模板: (条件成立想放在生成器中的值 for i in 可迭代的 if 条件)
g=(i for i in range(10))
d=[i for i in range(10)]
print(g)
print(d)
把圆括号变为方括号则变成了列表推导式,打印结果如下:
<generator object <genexpr> at 0x0000021DFE8DF5C8>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
列表推导式占用内存,推导式也可以添加条件筛选功能,如下:
[i*i for i in (1,2,3,4) if i%3 == 0]