Fabain4 IT路上的潜行者

Python yield使用

2016-09-12

  • 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


下一篇 Python Super使用

Comments