1.生成器
特点:只负责生产,只能往前走,不能回退,生产结束时,若在生产,就报错StopIteration
列表生成式:a = [i for i in range(10)] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
生成器:一边循环一边计算的机制称为生成器 ,通过next()调用下一个元素
b = (i for i in range(10)) = <generator object <genexpr> at 0x000001A2AACF3048>
next(b) b.__next__() b.send('ok') for i in b: while True 这三种方法生产完成后,只有for不会报错StopIteration
print(i) next(b)
1.1.生成器的2种创建方式:
1 b = (i for i in range(10)) 2 3 def fib(max): 4 n,a,b=0,0,1 5 while n < max: 6 yield b 7 a,b=b,a+b 8 n += 1 9 10 def range(n): 11 count = 0 12 while count < n: 13 yield count 14 return 'ss' 15 count+=1 16 17 18 def fib(max): 19 n,a,b=0,0,1 20 while n <max: 21 sign = yield b 22 print(sign) 23 if sign == 'stop': 24 break 25 a,b=b,a+b 26 n += 1 27 b=fib(13) 28 next(b) 29 b.__next__() 30 b.send('ok') 31 b.send('stop')
总结:yield
1.函数有了yield之后,函数名加()就得到了一个生成器
2.函数有了yield之后,return在生成器里,代表生成器的终止直接报错
3.函数有了yield之后,函数的每个运行过程都可以拿到,处理大文件比较适合
return与yield的区别:
1.return 返回数据 并终止function
2.yield 返回数据 并冻结当前的执行过程,要想启动,就得next()。next()唤醒后,继续执行,直到遇到下一个yield
----------------------------------------------------
2.迭代器
2.1.可迭代对象(Iterable): list tuple dict set str
generator yield的generator function
判断是否是可迭代对象:---->可直接作用于for循环的对象是可迭代对象
>>> from collections import Iterable
>>> isinstance([1,2,3],Iterable)
True
2.2.迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
判断是否是迭代器:----->生成器是迭代器的一种。
>>> from collections import Iterator
>>> isinstance([1,2,3],Iterator)
False
>>> isinstance((i for i in range(10)),Iterator)
True
2.3.可迭代对象list tuple dict set str 使用iter()函数可以变成迭代器
>>> from collections import Iterator
>>> isinstance([1,2,3],Iterator)
False
>>> isinstance(iter([1,2,3]),Iterator)
True
2.4.迭代器对象表示一个数据流,不知道什么时候截止,不能使用len(),直到没有数据抛出StopIteration
数据流可以看作是一个有序序列,不知道长度,只能通过next()调用