生成器
在python中,一边循环一边计算的机制,称为生成器:generator。它保存的是算法。
# 创建generator方法1:将列表生成式的[] 改为 ()>>> g = (x * x for x in range(10))>>> gat 0x1022ef630>#为了将结果快速显示出来,可以转化为列表>>>list(g)[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# 创建方法2: 通过函数实现,例:Fibonacci数列。def fib(max): n, a, b = 0, 0, 1 while n < max: yield b # 关键字是 yield a, b = b, a + b n = n+ 1 return 'done'
generator 与 函数 的执行流程不同。函数顺序执行,遇到 return 或是运行到最后一行语句,就会返回。 genrator在每次调用 next()的时候执行,再次执行时从上次返回的yield 处继续执行。例:
def odd(): print('step 1') yield (1) print('step 2') yield(2) print('step 3') yield(3)>>> o = odd();>>> next(o)step 11>>> next(o)step 23>>> next(o)step 35>>> next(o)Traceback (most recent call last): File "", line 1, in StopIteration
由上可知,next()函数一直执行到抛出 StopIteration
异常为止。
g = fib(6)while True: try: x = next(g) print('g:', x) except StopIteration as e: print('Generator return value:', e.value) break g: 1g: 1g: 2g: 3g: 5g: 8Generator return value: done
迭代器
区分: 可迭代对象:Iterable 与 迭代器 Iterator
- 可以直接作用于 for 循环的对象,统称为 可迭代对象:
Iterable
。判断方法:
>>>from collections import Iterable>>>isinstance([], Iterable)True>>>isinstance(100, Iterable)False
基本集合数据类型: list、tuple、dict、set、str
与 generator
。
- 可以被
next()
函数调用并不断返回下一个值的对象称为 迭代器:Iterator
。判断方法:
>>>from collection import Iterator>>>isinstance ((x for x in range(10), Iterator)True>>>isinstance([], Iterator)False
将list、tuple、dict、set、str
此类转为 Iterator
需要使用iter()
函数
>>>isinstance(iter([]), Iterator)True