2012-08-01 9 views
17

एक सामान्य कार्य के लिए, map अच्छी तरह से काम करता है:क्यों नक्शा (प्रिंट, a_list) काम नहीं करता है?

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

हालांकि, यह printmap समारोह के अंदर डाल दिया जा रहा है कि अगर:

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

अजगर शिकायत:

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

क्या है print विशेष? print(x) भी एक वैध फ़ंक्शन कॉल नहीं है? उपरोक्त कोड पायथन 2.7 के तहत परीक्षण किया जाता है।

उत्तर

21

पायथन 2.x, print एक कथन है, एक समारोह नहीं है। यदि आप इसे Python 3.x में आज़माते हैं तो यह काम करेगा।

पायथन 2.x में, आप print(x) कह सकते हैं और यह वाक्यविन्यास त्रुटि नहीं है, लेकिन यह वास्तव में एक फ़ंक्शन कॉल नहीं है। जैसे 1 + (3)1 + 3 के समान है, print(x) Python 2.x में print x जैसा ही है।

पायथन 2.x में आप यह कर सकते हैं:

def prn(x): 
    print x 

तो फिर तुम कर सकते हैं:

map(prn, lst) 

और यह काम करेंगे। ध्यान दें कि आप शायद lst = map(prn, lst) नहीं करना चाहते हैं क्योंकि prn()None लौटाता है, इसलिए आप मूल्यों की अपनी सूची को केवल None मान की समान लंबाई वाली सूची के साथ बदल देंगे।

संपादित करें: पायथन 2.x के लिए दो अन्य समाधान।

आप पूरी तरह से print के व्यवहार में परिवर्तन करना चाहते हैं, तो आप ऐसा कर सकते हैं:

from __future__ import print_function 

map(print, lst) 

यह एक समारोह बस के रूप में यह अजगर 3.x में है में print बनाता है, तो यह map() साथ काम करता है।

या, आप यह कर सकते हैं:

from pprint import pprint 

map(pprint, lst) 

pprint() एक समारोह है कि चीजें प्रिंट है और यह एक में निर्मित के रूप में उपलब्ध है। मुझे बिल्कुल यकीन नहीं है कि यह डिफ़ॉल्ट print से अलग कैसे है (यह कहता है कि यह एक "सुंदर प्रिंट" फ़ंक्शन है लेकिन मुझे यकीन नहीं है कि यह वास्तव में इसे कैसे अलग करता है)।

इसके अलावा, पीईपी 8 मानक के अनुसार, l को एक चर नाम के रूप में उपयोग करने की अनुशंसा नहीं की जाती है, इसलिए मैं अपने उदाहरणों में lst का उपयोग कर रहा हूं।

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

+0

यह उड़ा नहीं जाएगा, लेकिन इसकी संभावना है कि यह अपेक्षा के अनुसार काम नहीं करेगा। मुझे लगता है कि क्लेन वास्तव में सामान प्रिंट करना चाहते थे और '' प्राप्त नहीं करना चाहते थे। यदि आप इसे प्रिंट करना चाहते हैं, तो आपको मानचित्र ऑब्जेक्ट पर फिर से चलना होगा। –

+0

मुझे यकीन नहीं है कि "यह उड़ा नहीं जाएगा" ... यदि आप पाइथन 2.x में 'मानचित्र (प्रिंट, [])' चलाने का प्रयास करते हैं, तो आपको यकीन नहीं है कि आपको 'सिंटेक्स त्रुटि: अमान्य वाक्यविन्यास' मिलेगा क्योंकि 'प्रिंट' 'एक बयान है। आपने इसे Python 3.x में आजमाया होगा, जहां 'print' एक फ़ंक्शन है और इसे 'map()' पर पास करने के लिए पूरी तरह से कानूनी है। पायथन 2.x 'मानचित्र()' में एक सूची लौटाती है, न कि ''। – steveha

+0

मेरा मतलब था: हाँ, आप सही हैं, 'मैप (प्रिंट, [])' पाइथन 3 में उड़ नहीं जाएगा (अपवाद फेंक देगा) लेकिन हालांकि यह अपवाद नहीं फेंकता है, नतीजा शायद यह नहीं है कि क्लेवेन क्या चाहता था लेना। –

1

अपनी लाइन print l से, मुझे लगता है इस को Python2, जहां printनहीं एक समारोह है, यह एक बयान है है।

4

जैसा कि अन्य ने कहा है, पाइथन 2.x print एक बयान है।क्या तुम सच में अजगर 2.x में ऐसा करना चाहते हैं, तो आप pprint उपयोग कर सकते हैं:

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

क्योंकि print एक समारोह नहीं है।

लेकिन आप प्रिंट आवरण बना सकते हैं, निश्चित रूप से:

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

एक बेहतर तरीका 2.x में प्रिंट मैप करने के लिए

from __future__ import print_function 
+1

यदि आप ऐसा करते हैं, तो आप उस मॉड्यूल में किसी कथन के रूप में 'प्रिंट' का उपयोग नहीं कर सकते हैं। जब तक यह समझा जाता है कि यह करने के लिए एक उचित बात है। – steveha

0

ऊपर जवाब अजगर 2 के लिए काम करने के लिए किया जाएगा , लेकिन पाइथन 3 में नहीं, दोनों मानचित्र और प्रिंट फ़ंक्शन में परिवर्तन के साथ।

पाइथन 3 में करने के लिए मैं जो समाधान चाहता हूं उसे प्राप्त करने के लिए मैं map(print, lst) प्राप्त करना चाहता हूं, प्रिंट कॉल के अंदर सूची को अनपैक करना है।

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

आउटपुट:

1 
2 
3 

आप Use print inside lambda करने के लिए अपने जवाब में इस की विस्तृत जानकारी प्राप्त पा सकते हैं।