生成器
生成器(generator)
- 生成器含有yield关键字
- 可以记录当前函数中执行的位置,下一次继续执行
- next 和yield 是一对搭档
- next 是开始函数的执行
- yield 是停止函数的执行
- 生成器函数调用不会执行这个函数,而是返回一个生成器
- 所有的生成器都是迭代器
实例:监听文件的输入
def get_line():
f = open('file',encoding='utf-8')
while True:
line = f.readline().strip()
if line:
yield line.strip()
line_g = get_line()
for line in line_g:
print(line.split(','))
- send(参数)
- 相当于执行next,只不过传了一个值过去
- yield from
- 相当于循环可迭代的每一项
- 相当于for循环
- 后面跟可迭代的对象
实例1:
def demo():
for i in range(4):
yield i
g=demo() # g此时是一个生成器
g1=(i for i in g) #g1是一个生成器表达式
g2=(i for i in g1) #g2也是一个生成器表达式
print(list(g2)) #此时才开始对生成器取值,g2取值是在g1里面,g1又在g中取值,所以最后的结果是[0, 1, 2, 3]
print(list(g1)) #但是当此时g1在取值的时候,由于上面已经对g取过值了,所以结果是[]
执行结果:
[0, 1, 2, 3]
[]
实例2:
def add(n,i): return n+i def test(): for i in range(4): yield i g=test() for n in [1,10]: g=(add(n,i) for i in g) print(list(g))
执行结果:[20, 21, 22, 23]
解析: 上面可以拆分如下
def add(n,i): return n+i def test(): for i in range(4): yield i g=test() n=10 g = (add(n, i) for i in (add(n,i) for i in g)) #此时n为10 print(list(g))