【问题标题】:Concatenate while yielding在产生时连接
【发布时间】:2017-10-09 17:58:57
【问题描述】:

从 python 中的函数产生时如何连接两个项目?

基本情况:

import itertools

def test():
    for number in range(0,10):
        yield number

list(test()) # [0...9]

如果我想同时生成 number 和它的正方形 number**2 怎么办

import itertools

def test():
    for number in range(0,10):
        yield itertools.chain.from_iterable([
            number,number*2
        ])

list(test()) 

# [0,0,1,1,2,4,3,9,...] pretended
# <itertools.chain at 0x135decfd0> ... what I got

但是,从外部执行 itertools.chain.from_iterable([generator1, generator2]) 会产生预期的结果。

def first_list():
    for number in range(0,5):
        yield number

def second_list():
    for number in range(5,10):
        yield number

list(itertools.chain.from_iterable([first_list(), second_list()]))

【问题讨论】:

  • 为什么不简单:yield number &lt;newline&gt; yield number**2
  • 你不想连接,你想要一个双倍的收益......这是不同的。
  • 从外面他们出来串联

标签: python generator yield


【解决方案1】:

一个简单的方法是:

def test():
    for number in range(0,10):
        yield number 
        yield number**2

【讨论】:

    【解决方案2】:

    Python 3.3 还引入了yield from(另请参阅PEP-380)语法,它允许您执行以下操作:

    >>> def test():
    ...   for number in range(10):
    ...     yield from (number, number**2)
    ...
    >>> list(test())
    [0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]
    

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多