2011-03-08 26 views
8
import itertools 
def _yield_sample(): 
    it = iter(itertools.combinations('ABCD', 2)) 
    it2 = iter(itertools.combinations('EFGH', 3)) 
    itc = itertools.chain(it,it2) 
    for x in itc: 
     yield x 

def main(): 
    for x in _yield_sample(): 
     print x 

Esto funciona para imprimir las combinaciones.itertools.chain para encadenar una lista iter?

>>> 
('A', 'B') 
('A', 'C') 
('A', 'D') 
... 

Pero esto:

def __position_combination(_count = [2,3,4,5]): 
    its = [] 
    for ct in _count: 
     it = iter(itertools.combinations('ABCDEFG', ct)) 
     its.append(it) 
    itc = itertools.chain(its) 
    for x in itc: 
     yield x 

def main(): 
    for x in __position_combination(): 
     print x 

no, lo que imprimirá

>>> 
<itertools.combinations object at 0x02179210> 
<itertools.combinations object at 0x02179240> 
<itertools.combinations object at 0x02179270> 

que tienen que volver a escribir código para hacer que funciona según lo exigido.

itc = itertools.chain(*its) 

Aquí es mi pregunta:

itertools.chain(iter, iter, iter) vs itertools.chain(*[iter,iter,iter]) 

¿Cuál es la diferencia entre ellos? De acuerdo con la documentation itertools.chain hace:

def chain(*iterables): 
    # chain('ABC', 'DEF') --> A B C D E F 
    for it in iterables: 
     for element in it: 
      yield element 

Así que, ¿por qué itertools.chain(iter, iter, iter) también trabaja aquí?
¿Significa iter, iter, iter = *(iter, iter, iter)?

Respuesta

3

¿significa iter, iter, iter = * (iter, iter, iter)?

No solo. Argumento desembalaje sólo funciona cuando se llama a una función, por lo que los siguientes dos llamadas son equivalentes:

f(1,2,3) 
f(*[1,2,3]) 

Pero *[1,2,3] no se compilará a menos que sea parte de una llamada. Usted puede mezclar argumentos normales (de posición) con las descomprimidos:

f(1,*[2,3]) 

lo que lo anterior también es equivalente a las dos llamadas anteriores.

+0

gracias por "argumento desempacar" – user478514

Cuestiones relacionadas