为了更加深刻的理解,我们再举一个例子。
#codingdef cube(n):
for i in range(n): yield i ** 3for i in cube(5): print i#output0182764
所以从理解函数的角度出发我们可以将yield类比为return,但是功能确实完全不同,在for循环中,会自动遵循迭代规则,每次调用next()函数,所以上面的结果不难理解。 生成器表达式:
生成器表达式来自于迭代和列表解析的组合,关于列表解析的概念和用法可以参见链接,生成器表达式和列表解析类似,但是他使用尖括号而不是方括号括起来的。如下代码:
>>> # 列表解析生成列表>>> [ x ** 3 for x in range(5)]
[0, 1, 8, 27, 64]>>> >>> # 生成器表达式>>> (x ** 3 for x in range(5))<generator object <genexpr> at 0x000000000315F678>>>> # 两者之间转换>>> list(x ** 3 for x in range(5))
[0, 1, 8, 27, 64]
就操作而言,生成器表如果使用大量的next()函数会显得十分不方便,for循环会自动出发next函数,所以可以按下面方式使用:
>>> for n in (x ** 3 for x in range(5)): print('%s, %s' % (n, n * n))
0, 01, 18, 6427, 72964, 4096>>> 两者比较
一个迭代既可以被写成生成器函数,也可以被协程生成器表达式,均支持自动和手动迭代。而且这些生成器只支持一个active迭代,也就是说生成器的迭代器就是生成器本身。 总结
想起了初中时候老师经常说的,眼观千遍,不如手动一遍。
不向静中参妙理,纵然颖悟也虚浮
立乎其大 和而不同
古之成大事者,不惟有超世之才,亦必有坚韧不拔之志
原文地址:https://www.cnblogs.com/cotyb/p/5260032.html