2011-05-03 16 views
5

EDIT: estúpida lógica mía se adelantó a mí. Los ninguno son solo los retornos de la llamada de comprensión. Ok, estoy ejecutando algunas pruebas en Python, y encontré un poco de diferencia en las órdenes de ejecución, lo que me lleva a entender cómo se implementa, pero me gustaría ejecutarlo por usted, gente amable para ver si estoy en lo cierto o si hay más. Considere este código:comprensión de la lista python VS por comportamiento

>>> a = ["a","b","c","d","e"] 
>>> def test(self,arg): 
...  print "testing %s" %(arg) 
...  a.pop() 
... 
>>>[test(elem) for elem in a] 
testing a 
testing b 
testing c 
[None, None, None] 
>>> a 
['a', 'b'] 
#now we try another syntax 
>>> a = ["a","b","c","d","e"] 
>>> for elem in a: 
...  print "elem is %s"%(elem) 
...  test(elem) 
... 
elem is a 
testing a 
elem is b 
testing b 
elem is c 
testing c 
>>> a 
['a', 'b'] 
>>> 

Ahora bien, este me dice que el de elem en una: Obtiene el siguiente elemento iterables continuación, se aplica el cuerpo, mientras que la comprensión llama de alguna manera la función en cada elemento de la lista antes de ejecutar realmente el código en la función, entonces la modificación de la lista de la función (pop) lleva a] none, none, none]

¿Es esto correcto? ¿que está sucediendo aquí?

gracias

+2

'test()' no devuelve nada, por lo tanto devuelve 'None'. (Por cierto, debe eliminar el parámetro 'self'.) –

+0

sí, estoy jugando, quería ver si eran realmente equivalentes ... pero aquí hay algo para el orden de ejecución. – cromestant

+6

Cambiar el tamaño de una colección (agregar o eliminar elementos) mientras se itera sobre ella es una ofensa punible. – delnan

Respuesta

4

Su función test no tiene ninguna declaración return, usándola en una lista de resultados de comprensión en una lista de None s. El indicador interactivo de Python imprime lo que sea que devuelva la última declaración.

Ejemplo:

Así que en realidad no hay diferencia en la forma en la lista de comprensión y for bucle en su trabajo cuestión.

0

Tiene que "c", y luego se quedó sin elementos en la lista. Como test no devuelve nada, obtienes [None, None, None].

1
>>> a = ["a","b","c","d","e"] 
>>> i = iter(a) 
>>> next(i) 
'a' 
>>> a.pop() 
'e' 
>>> next(i) 
'b' 
>>> a.pop() 
'd' 
>>> next(i) 
'c' 
>>> a.pop() 
'c' 
>>> next(i) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> 
Cuestiones relacionadas