前端之家收集整理的这篇文章主要介绍了
Python yield 用法功能实例,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!
@H_
403_0@yield 简单说来就是一个
生成器,
生成器是这样一个
函数,它记住上一次返回时在
函数体中的位置。对
生成器
函数的第二次(或第 n 次)
调用跳转至该
函数中间,而上次
调用的所有局部变量都保持不变。
@H_
403_0@
生成器 是 一个
函数
@H_
403_0@
函数的所有参数都会保留
@H_
403_0@第二次
调用 此
函数 时
@H_
403_0@使用的参数是前一次保留下的.
@H_
403_0@
生成器还“记住”了它在流控制构造
@H_
403_0@
生成器不仅“记住”了它数据状态。
生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。由于连续性使您在执行框架间任意
跳转,而不总是返回到直接
调用者的上下文(如同
生成器那样),因此它仍是比较一般的。
@H_
403_0@yield
生成器的运行机制
@H_
403_0@当你问
生成器要一个数时,
生成器会执行,直至出现 yield 语句,
生成器把 yield 的参数给你,之后
生成器就不会往下继续运行。 当你问他要下一个数时,他会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复直至
退出函数。
@H_
403_0@例子:Python 排列,组合
生成器
@H_
403_0@#
生成全排列
# @param Python基础 - yield 用法详解
# @author 编程之家 jb51.cc|jb51.cc
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
# End www.jb51.cc
@H_
403_0@#
生成组合
# @param Python基础 - yield 用法详解
# @author 编程之家 jb51.cc|jb51.cc
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
# End www.jb51.cc
@H_
403_0@结果如下:
@H_
403_0@102 pvopf006 ~/test> ./generator.py
@H_
403_0@abc
@H_
403_0@--------------------
@H_
403_0@acb
@H_
403_0@bac
@H_
403_0@bca
@H_
403_0@cab
@H_
403_0@cba
@H_
403_0@可以看到,在第一个循环break后,
生成器没有继续执行,而第二个循环接着第一个循环执行