2012-08-01 16 views
17
normal işlevi için

, map iyi çalışıyor:Neden harita (yazdırma, a_list) çalışmıyor?

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

Ancak printmap işlevi içinde konduğunu ise:

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

piton şikayet:

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

kılan print özel? print(x) aynı zamanda geçerli bir işlev çağrısı yapmıyor mu? Yukarıdaki kod python 2.7 altında test edilmiştir.

cevap

21

Python 2.x'te, print bir işlevdir, bir işlev değil. Bunu Python 3.x'te denerseniz çalışır.

Python 2.x'te print(x) yazabilirsiniz ve bu bir sözdizimi hatası değildir, ancak aslında bir işlev çağrısı değildir. Sadece 1 + (3)1 + 3 ile aynıysa, print(x), Python 2.x'teki print x ile aynıdır.

def prn(x): 
    print x 

Sonra yapabilirsiniz:

map(prn, lst) 

ve işe yarayacak

Python 2.x bunu yapabilirsiniz. Muhtemelen prn()None döndürdüğü için lst = map(prn, lst) yapmak istemediğinizi unutmayın, böylece değerler listenizi sadece None değerinin aynı uzunlukta bir listesiyle değiştireceksiniz.

DÜZENLEME: Python 2.x için iki çözüm daha.

from __future__ import print_function 

map(print, lst) 

Bu Python 3.x olduğu gibi bir fonksiyonu haline print yapar, bu yüzden map() çalışır: tamamen print davranışını değiştirmek isterseniz

, bunu yapabilirsin.

Veya, bunu yapabilirsiniz:

from pprint import pprint 

map(pprint, lst) 

pprint() şeyler yazdıran bir fonksiyonudur ve bir yerleşik olarak kullanılabilir. Tam olarak, varsayılan print'dan farklı olduğundan emin değilim (bu, "güzel baskı" işlevi olduğunu söylüyor ancak bunun ne kadar farklı olduğunu tam olarak bilmiyorum).

Ayrıca, PEP 8 standardına göre, l değişken adı olarak kullanılması önerilmez, bu yüzden örneklerimde lst kullanıyorum. Çizginize print l itibaren

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

+0

Patlamayacak ama beklenildiği gibi çalışmayacak. Ben Clwen aslında bir şeyler yazdırmak istedim ve '<0x9a62aec> 'deki harita nesnesini almak istemedi. Yazdırmak isterseniz, harita nesnesi üzerinde yinelemek zorundasınız. –

+0

"Patlatmayacağım" ile ne kastettiğinizden emin değilim ... Eğer Python 2.x'te "map (print, [])" komutunu çalıştırmayı denerseniz, 'SyntaxError: geçersiz sözdizimi ' 'bir ifadedir. Python 3.x'te denemelisiniz, burada 'print' bir işlevdir ve 'map()' öğesine aktarmak için tamamen yasaldır. Python'da 2.x 'map()' bir liste döndürür, bir ''. – steveha

+0

Demek istediğim: Evet, haklısın, 'harita (baskı, [])' Python 3'de havaya uçurmayacak (istisna atmayacak) 3. Ama bir istisna atmasa da, sonuç muhtemelen clwen'in istediği şey değildir. almak. –

1

, bu printdeğil bir işlev, bir deyim olmasıdır python2 olduğunu varsayalım.

4

Diğerleri de söyledikleri gibi, Python 2.x'te print bir ifadedir.Eğer gerçekten Python 2.x bunu yapmak istiyorsanız pprint kullanabilirsiniz: bir işlev değil

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

print çünkü.

Ama tabii ki, baskı-sarmalayıcı yapabilirsiniz:

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

2.x baskı eşlemek için daha iyi bir yolu yukarıdaki cevapları Python 2 için çalışmak

from __future__ import print_function 
+1

Bunu yaparsanız, bu modüldeki 'print' ifadesini artık kullanamazsınız. Bu anlaşıldığı sürece, bunun yapılması makul bir şeydir. – steveha

0

yapmak olacaktır Python 3'te değil, hem harita hem de yazdırma işlevinde değişiklikler.

Python 3'te map(print, lst) yapmak istediklerime ulaşmak için geldiğim çözüm, yazdırma aramasının içindeki listeyi açmaktır.

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

Çıktı: Sen Use print inside lambda cevabım bu daha fazla ayrıntı bulabilirsiniz

1 
2 
3 

.