yield 简单来说就是一个生成器,生成器是一个函数,它会记住上次返回时它在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转到函数的中间,使前一次调用的所有局部变量保持不变。
生成器是一个函数,
函数的所有参数都会保留,
第二次调用此函数时,
使用的参数是前一次保留下的。
生成器还“记住”了它在流控制构造。
生成器不只是“记住”它的数据状态。生成器还“记住”它在流控制构造中的位置(在命令式编程中,这样的构造不仅仅是数据值)。 Continuation 仍然相对通用,因为它允许你在执行帧之间任意跳转,而不是总是返回到直接调用者的上下文(如生成器所做的那样)。
yield生成器的运行机制
当你向生成器要一个数时,生成器会一直执行到yield语句出现,生成器会给你yield的参数,之后生成器就不会继续运行了。当你向他要下一个数时,他会从上次的状态开始运行,直到出现yield语句,给你参数,然后停止。重复此操作直到函数退出。
例子:Python 排列,组合生成器
生成全排列
def perm(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[:i] + items[i+1:]
for p in perm(rest, n-1):
yield v + p
生成组合
def comb(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[i+1:]
for c in comb(rest, n-1):
yield v + c
a = perm('abc')
for b in a:
print b
break
print '-'*20
for b in a:
print b
结果如下:
102 pvopf006 ~/test> ./generator.py
abc
--------------------
acb
bac
bca
cab
cba
可以看出,第一次循环break后,生成器并没有继续执行,第二次循环在第一次循环之后执行。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python try语句的执行原理11/08
- ♥ 面试Python工程师,这些编码题一定要背12/09
- ♥ python中如何掌握闭包的使用?01/11
- ♥ 什么是 python 守护线程12/31
- ♥ python中的SciPy是什么?08/30
- ♥ 如何在python中逐行遍历Dataframe09/09
内容反馈