0
点赞
收藏
分享

微信扫一扫

极客编程python入门-生成器


generator

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。


在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>


创建​L​​g​的区别仅在于最外层的​[]​​()​​L​是一个list,而​g​是一个generator


generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。


generator可以用函数来实现。

斐波拉契数列


def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a = b
b = a + b
n = n + 1
return 'done'


极客编程python入门-生成器_列表生成式


注意,赋值语句:

a, b = b, a + b

相当于:

t = (b, a + b) # t是一个tuple
a = t[0]
b = t[1]


def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'


这就是定义generator的另一种方法。如果一个函数定义中包含​yield​关键字,那么这个函数就不再是一个普通函数,而是一个generator函数,调用一个generator函数将返回一个generator:


最难理解的就是generator函数和普通函数的执行流程不一样。普通函数是顺序执行,遇到​return​语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用​next()​的时候执行,遇到​yield​语句返回,再次执行时从上次返回的​yield​语句处继续执行。


小结


generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。


要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。


generator函数的调用实际返回一个generator对象:


f = fib(100)    

print(f)


极客编程python入门-生成器_列表生成式_02



(练习)杨辉三角


def triangles():
L = [1]
while True:
yield L
L = [1] + [L[i] + L[i + 1] for i in range(len(L) - 1)] + [1]


# 期待输出:
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break

for t in results:
print(t)

if results == [
[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1],
[1, 7, 21, 35, 35, 21, 7, 1],
[1, 8, 28, 56, 70, 56, 28, 8, 1],
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
print('测试通过!')
else:
print('测试失败!')


极客编程python入门-生成器_python_03


学习别人代码。

举报

相关推荐

0 条评论