2012-08-01 14 views
17

Dla normalnego funkcjonowania, map działa dobrze:Dlaczego mapa (print, a_list) nie działa?

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

Jednak jeśli to print jest umieścić wewnątrz map funkcję:

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

python będą narzekać:

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

Co sprawia, print specjalne? Czy print(x) nie jest również prawidłowym wywołaniem funkcji? Powyższy kod jest testowany w python 2.7.

Odpowiedz

21

W języku Python 2.x, print to instrukcja, a nie funkcja. Jeśli spróbujesz tego w Pythonie 3.x, to zadziała.

W języku Python 2.x można powiedzieć: print(x) i nie jest to błąd składniowy, ale w rzeczywistości nie jest to wywołanie funkcji. Podobnie jak 1 + (3) jest taki sam jak 1 + 3, print(x) jest taki sam jak print x w Pythonie 2.x.

w Pythonie 2.x można to zrobić:

def prn(x): 
    print x 

Następnie można zrobić:

map(prn, lst) 

i będzie działać. Zauważ, że prawdopodobnie nie chcesz wykonywać lst = map(prn, lst) ponieważ prn() zwraca None, więc zastąpisz listę wartości tą samą długością o wartości tylko None.

EDYCJA: Dwa inne rozwiązania dla Python 2.x.

Jeśli chcesz całkowicie zmienić zachowanie print, można to zrobić:

from __future__ import print_function 

map(print, lst) 

To sprawia print do funkcji tak jak to jest w Pythonie 3.x, tak to działa z map().

Albo można to zrobić:

from pprint import pprint 

map(pprint, lst) 

pprint() to funkcja, która drukuje rzeczy i jest on dostępny jako wbudowany. Nie jestem do końca pewien, jak to się różni od domyślnego print (mówi, że jest to funkcja "ładnego druku", ale nie jestem pewien, jak dokładnie to czyni).

Ponadto, zgodnie ze standardem PEP 8, niezalecane jest używanie l jako nazwy zmiennej, dlatego w moich przykładach używam lst.

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

+0

Nie wybuchnie, ale najprawdopodobniej nie zadziała zgodnie z oczekiwaniami. Chyba clwen chciał wydrukować rzeczy i nie dostać '. Jeśli chcesz go wydrukować, musisz wykonać iterację nad obiektem mapy. –

+0

Nie jestem pewien, co masz na myśli mówiąc "to się nie podniesie" ... jeśli spróbujesz uruchomić 'map (print, [])' w Pythonie 2.x otrzymasz 'SyntaxError: invalid syntax' ponieważ' print 'jest stwierdzeniem. Musiałeś wypróbować to w Pythonie 3.x, gdzie 'print' jest funkcją i jest całkowicie legalne przekazanie go do' map() '. W Pythonie 2.x 'map()' zwraca listę, a nie ''. – steveha

+0

Miałem na myśli: Tak, masz rację, 'map (print, [])' nie będzie wysadzać w powietrze (wyrzucać wyjątku) w Pythonie 3. Ale chociaż nie rzuca wyjątku, wynik prawdopodobnie nie jest tym, czego chciał clwen dostać. –

1

Od linii print l, zakładam, że jest to python2, gdzie print jest nie funkcją, jest to stwierdzenie.

4

Jak powiedzieli inni, w Pythonie 2.x print jest oświadczenie.Jeśli naprawdę chcesz to zrobić w Pythonie 2.x można użyć pprint:

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

Ponieważ print nie jest funkcją.

Ale można zrobić wydruk opakowanie, oczywiście:

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

Lepszym sposobem Drukuj mapę w 2.x byłoby zrobić

from __future__ import print_function 
+1

Jeśli to zrobisz, nie będziesz już mógł użyć 'print' jako instrukcji w tym module. Tak długo, jak jest to zrozumiałe, jest to rozsądne. – steveha

0

Powyższe odpowiedzi pracować dla Pythona 2 , ale nie w Pythonie 3 ze zmianami zarówno mapy, jak i funkcji drukowania.

Rozwiązanie Mam przybył, aby osiągnąć to, co chciałem map(print, lst) zrobić w Pythonie 3 jest rozpakować listę wewnątrz zaproszenia druku.

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

wyjściowa:

1 
2 
3 

można znaleźć więcej szczegółów wokół to w mojej odpowiedzi na Use print inside lambda.