-
Yield
Yield 的功能类似于return, 但是不同之处在于它返回的是生成器
-
生成器
生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器).
如果一个函数包含yield关键字,这个函数就会变为一个生成器.
生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用.
由于生成器也是一个迭代器,那么它就应该支持next方法获取下一个值.
举例:
# 通过yield来创建生成器
def func():
for i in xrange(10):
yield i
# 调用如下:
f = func()
print f #此时生成器没有运行
<generator object func at 0x7fe01a853820>
print f.next()
0
print f.next()
1
print f.next()
2
......
print f.next()
9
print f.next() #当执行完最后一次循环后,结束yield语句,生成StopItertion异常oTraceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
- 通过列表创建生成器
[i for i in xrange(10)]
- yield send使用
def func():
n = 0
while 1:
n = yield n #可以通过send函数向n赋值
f = func()
f.next()
0
f.send(1)
1
f.send(2)
2
- 应用
生成一个满足很大列表的要求,这个列表需要保存在内存中,很明显内存限制这个问题
def get_primes(start):
for element in magical_infinite_range(start):
if is_prime(element):
return element
def get_primes(number):
while True:
if is_prime(number):
yield number
number += 1