python中yield生成器用法详解
发布时间:2025-09-25 10:58:04
简单地说,yield是一个生成器。生成器就是这样一个函数。它记住上次返回时函数体中的位置。第二次(或第一次)生成器函数 n 第二次调用跳转到函数中间,并且上次调用的所有局部变量保持不变。
生成器是一个函数,
保留函数的所有参数,
第二次调用此函数时,
使用的参数是前一次保留的。
在流控结构中,生成器也“记住”了它。
生成器不仅“记住”了它的数据状态。 生成器还“记住”了它在流控制结构中的位置(在命令编程中,它不仅仅是数据值)。因为连续性让你在执行框架之间跳转,而不是总是回到直接调用器的上下文(就像生成器一样),所以还是比较一般的。
yield生成器的运行机制
当你要求生成器一个数字时,生成器将执行直到它出现 yield 句子,生成器把 yield 给你参数,然后生成器就不会继续下去了。 当你问他下一个数字时,他会从最后一个状态开始工作,直到yield语句出现,给你参数,然后停止。这样重复,直到函数退出。
例子:Python 排列,组合生成器
生成全排列
defperm(items,n=None): ifnisNone: n=len(items) foriinrange(len(items)): v=items[i:i+1] ifn==1: yieldv else: rest=items[:i]+items[i+1:] forpinperm(rest,n-1): yieldv+p
生成组合
defcomb(items,n=None): ifnisNone: n=len(items) foriinrange(len(items)): v=items[i:i+1] ifn==1: yieldv else: rest=items[i+1:] forcincomb(rest,n-1): yieldv+c a=perm('abc') forbina: printb break print'-'*20 forbina: printb
结果如下:
102pvopf006~/test>./generator.py abc -------------------- acb bac bca cab cba
由此可见,生成器在第一个循环break之后没有继续执行,而第二个循环则是第一个循环执行。
下一篇 返回列表