2012-08-01 15 views
17

Para un funcionamiento normal, map funciona bien:¿Por qué el mapa (imprimir, una_lista) no funciona?

def increment(n): 
    return n+1 
l = [1, 2, 3, 4, 5] 
l = map(increment, l) 
print l 
>>> [2, 3, 4, 5, 6] 

Sin embargo, si se trata de print que se coloca dentro de la función map:

l = [1, 2, 3, 4, 5] 
l = map(print, l) 
print l 

pitón se quejará:

l = map(print, l) 
      ^
SyntaxError: invalid syntax 

Lo que hace print especial? ¿No es print(x) también una llamada a función válida? El código anterior se prueba bajo python 2.7.

Respuesta

21

En Python 2.x, print es una afirmación, no una función. Si prueba esto en Python 3.x, funcionará.

En Python 2.x, puede decir print(x) y no es un error de sintaxis, pero en realidad no es una llamada de función. Al igual que 1 + (3) es lo mismo que 1 + 3, print(x) es lo mismo que print x en Python 2.x.

En Python 2.x se puede hacer esto:

def prn(x): 
    print x 

entonces usted puede hacer:

map(prn, lst) 

y funcionará. Tenga en cuenta que probablemente no desee hacer lst = map(prn, lst) porque prn() devuelve None, por lo que reemplazará su lista de valores con una lista de igual longitud que el valor None.

EDIT: otras dos soluciones para Python 2.x.

Si desea cambiar por completo el comportamiento de print, usted puede hacer esto:

from __future__ import print_function 

map(print, lst) 

Esto hace print en una función tal como es en Python 3.x, por lo que funciona con map().

O bien, puede hacer esto:

from pprint import pprint 

map(pprint, lst) 

pprint() es una función que imprime cosas y está disponible como un built-in. No estoy exactamente seguro de cómo es diferente del valor predeterminado print (dice que es una función de "impresión bonita" pero no estoy seguro de cómo exactamente eso lo hace diferente).

Además, de acuerdo con el estándar PEP 8, no se recomienda usar l como nombre de variable, así que estoy usando lst en lugar de mis ejemplos.

http://www.python.org/dev/peps/pep-0008/

+0

No explotará, pero es muy probable que no funcione como se esperaba. Supongo que clwen quería realmente imprimir cosas y no obtener ''. Si desea imprimirlo, debe iterar sobre el objeto del mapa. –

+0

No estoy seguro de lo que quiere decir con "no explotará" ... si intenta ejecutar 'map (print, [])' en Python 2.x obtendrá 'SyntaxError: sintaxis inválida' porque' print 'es una declaración. Debes haberlo probado en Python 3.x, donde 'print' es una función y es perfectamente legal pasarlo a' map() '. En Python 2.x 'map()' devuelve una lista, no un ''. – steveha

+0

Quise decir: Sí, estás en lo cierto, 'map (print, [])' no explotará (arroja una excepción) en Python 3. Pero aunque no lanza una excepción, el resultado probablemente no sea el que más Llegar. –

1

de su línea print l, supongo que esto es python2, donde print es no una función, que es una declaración.

4

Como han dicho otros, en Python 2.x print es una afirmación.Si realmente quieres hacer esto en Python 2.x puede utilizar pprint:

from pprint import pprint 
l = [1, 2, 3, 4, 5] 
p = map(pprint, l) 
1

Debido print no es una función.

pero se puede hacer de impresión-envoltura, por supuesto:

>>> def p(x): 
... print x 
... 
>>> l = [1, 2, 3, 4, 5] 
>>> l = map(p, l) 
1 
2 
3 
4 
5 
8

Una mejor manera de Correspondencia en 2.x habría que hacer

from __future__ import print_function 
+1

Si hace esto, ya no puede usar 'print' como una declaración en ese módulo. Mientras se entienda eso, esto es algo razonable de hacer. – steveha

0

Las respuestas anteriores trabajan para Python 2 , pero no en Python 3 con los cambios en el mapa y la función de impresión.

La solución a la que he llegado para lograr lo que quería map(print, lst) hacer en Python 3 es descomprimir la lista dentro de la llamada de impresión.

lst = [1, 2, 3] 
print(*lst, sep='\n') 

Salida:

1 
2 
3 

Puede encontrar más detalles en torno a este en mi respuesta a Use print inside lambda.

Cuestiones relacionadas