2017-05-10 4 views
9

Comment puis-je concaténer deux éléments en générant à partir d'une fonction en python?Concaténer tout en générant

Le cas de base:

import itertools 

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

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

si je veux donner à la fois la number et sa place 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 

faire Cependant itertools.chain.from_iterable([generator1, generator2]) de l'extérieur donne le résultat attendu.

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

Pourquoi ne pas simplement: 'Numéro rendement numéro de rendement ** 2'? – vaultah

+0

Vous ne voulez pas concaténer, vous voulez un rendement double ... c'est une différence. – Paebbels

+0

de l'extérieur, ils sortent concaténés –

Répondre

10

A manière mple est:

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

si je veux donner à la fois le nombre et le nombre carré ** 2

Vous pouvez simplement donner un tuple, comme dans

yield number, number ** 2 

Par exemple:

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

oui mais c'est une liste de tuples, je me demandais que vous ne pouviez pas concaténer directement tout en cédant –

+0

@ hydraulicferreira Ok, donc c'est ce que vous voulez faire. Vous voulez zipper les listes ensemble. –

+0

oui je suis innocent, je ne peux pas utiliser 'chain' car les objets ne sont pas encore sous forme de générateur à enchaîner. my bad –

10

Python 3.3 a également introduit le yield from (voir aussi PEP-380) syntaxe qui vous permet de faire quelque chose comme ceci:

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