生成器:
在python中,一遍循环一遍计算出结果的运算机制,称为生成器:generator要创建一个generator,有很多种方法,
第一种:只要把一个列表生成式的[]改成()即可
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
用next(g)打印出每一个generator的每一个元素
generator保存的是算法,每次调用next(g),就计算出下一个元素的值,知道计算出最后一个元素,没有更多元素时,
抛出StopIteration错误。
斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
>>> f = fib(6)
>>> f
<generator object fib at 0x104feaaa0>
这里,比较难理解的是generator和函数执行流程不一样。函数时顺序执行,遇到return语句或者租后一行函数语句就返回。而变成generator的函数,
在每次调用next()的时候执行,遇到yield语句返回,就在此执行时从上次返回的yield语句处继续执行。
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
迭代器:
直接作用于for循环的数据类型有:一类:结合数据类型,如list、tuple、dict、set、str等;
一类:generator,包括生成器和带yield的generator funtion
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable
可以使用isinstance()判断一个对象是否是Iterable对象;
本文深入讲解了Python中的生成器概念,介绍了如何通过列表生成式创建生成器,以及使用yield关键字定义生成器函数的方法。此外,还探讨了生成器与普通函数在执行流程上的不同之处。
2万+

被折叠的 条评论
为什么被折叠?



