知行编程网知行编程网  2022-11-20 04:00 知行编程网 隐藏边栏  2 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于python中yield生成器用法详解的相关知识,包括字符串格式化什么意思,以及迭代器这些编程知识,希望对大家有参考作用。

python中yield generator的使用详解

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后,生成器并没有继续执行,第二次循环在第一次循环之后执行。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享