结论:
yield 就是 记录一个 返回值 及其 返回位置,下次迭代从这个 位置 开始。带 yield 的函数更像是一个生成器,而不再是函数了。
实例:
首先定义一个如下函数
def gen():
print('line 1')
yield 1
print('line 2')
yield 2
print('line 3')
return 3
测试1
next(gen())
next(gen())
输出结果:
line 1
line 1
理解:next()每次调用了一个新的gen()对象实例
测试2
g = gen()
print(next(g))
print(next(g))
print(next(g,'End'))
输出结果:
line 1
line 2
line 3
理解:next()迭代赋予g的一个对象实例
测试3
g = gen()
print(next(g))
print(next(g))
print(next(g,'End'))
输出结果:
line 1
1
line 2
2
line 3
End
理解:同迭代元组对象相同,迭代打印。最后一个End赋值是因为next接收不到 return 的 3,不赋值会报错。
进阶:
def myMap(func, iterable):
for item in iterable:
yield func(item)
result = myMap(str, range(5))
print(result)
print(list(result))
输出结果:
<生成器对象地址>
['0','1','2','3','4']
经过上一个实例的三个测试,看到这里大家应该都能明白了。