美文网首页
[python] yield

[python] yield

作者: 原来是酱紫呀 | 来源:发表于2018-11-29 16:43 被阅读0次

20181129 qzd


yield的功能类似于return,但是不同之处在于它返回的是生成器。

1. 生成器

生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器)。

如果一个函数包含yield关键字,这个函数就会变为一个生成器。

生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。

由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值。

2. 基本操作

# 通过`yield`来创建生成器
def func():
   for i in xrange(10);
        yield i

# 通过列表来创建生成器
[i for i in xrange(10)]
# 调用如下
>>> f = func()
>>> f # 此时生成器还没有运行
<generator object func at 0x7fe01a853820>
>>> f.next() # 当i=0时,遇到yield关键字,直接返回
0
>>> f.next() # 继续上一次执行的位置,进入下一层循环
1
...
>>> f.next()
9
>>> f.next() # 当执行完最后一次循环后,结束yield语句,生成StopIteration异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

除了’next‘函数,生成器还支持’send‘函数。该函数可以向生成器传递参数。

>>> def func():
...     n = 0
...     while 1:
...         n = yield n #可以通过send函数向n赋值
... 
>>> f = func()
>>> f.next() # 默认情况下n为0
0
>>> f.send(1) #n赋值1
1
>>> f.send(2)
2
>>> 

3. 应用

最经典的例子,生成无限序列。
常规的解决方法是,生成一个满足要求的很大的列表,这个列表需要保存在内存中,很明显内存限制了这个问题。

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 yield和yield from用法总结

    python yield和yield from用法总结 yield 作用: 注: generator的next()...

  • python: yield

    python: yield

  • Python yield关键字

    Python中yield关键字解释 这篇文章关于python的yield关键字。并且文章中会解释什么是yield,...

  • Python yield

    参考:Python yield 使用浅析 - IBM 递归中使用yield 有时候yield就可以解决递归的问题,...

  • python-复盘-yield & return区别

    python-复盘-yield & return区别

  • python 生成器和协程

    yield 对于python生成器中的yield来说,yield item会产出一个值,提供给next()的调用方...

  • Python yield

    Python yield的用法详解 如何快速的对yield有一个初步的了解,那么首先我们可以先将yield看做是r...

  • yield(对比return)

    带有 yield 的函数在 Python 中被称之为 generator(生成器),return和yield的形式...

  • 重构Python代码tips

    将内部循环中的yield替换为yield from经常忽略的一个小窍门是 Python 的yield关键字有对应的...

  • Thread yield 方法

    yield 在其他语言例如 Python 或者 C# 也有协程的概念,在 Java 中 Thread.yield ...

网友评论

      本文标题:[python] yield

      本文链接:https://www.haomeiwen.com/subject/qtpfcqtx.html