2017-05-10 24 views
9

我如何可以連接兩個項目從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()])) 
+11

爲什麼不乾脆:'產量號產量號** 2'? – vaultah

+0

你不想連接,你想要雙倍收益......這是一個區別。 – Paebbels

+0

從外面就出來級聯 –

回答

10

A si mple方法是:

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

,如果我想獲得的數量和它的平方數** 2

你可以簡單地得到一個元組,如

yield number, number ** 2 

例如:

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

是的,但是這是一個元組列表,我想知道,你不能直接串聯同時產生 –

+0

@raulferreira好了,這是你想要做什麼。你想一起壓縮列表。 –

+0

是的,我是無辜的,我不能因爲項目還沒有進入發電機的形式被鏈接使用'chain'。我的壞 –

10

的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]