पायथन 2.7 में प्रिंट स्वैच्छिक में कोष्ठक क्यों है?


98

पायथन 2.7 में दोनों निम्नलिखित समान करेंगे

print("Hello, World!") # Prints "Hello, World!"

print "Hello, World!" # Prints "Hello, World!"

हालांकि निम्नलिखित नहीं होगा

print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")

print "Hello,", "World!" # Prints the words "Hello, World!"

पायथन में 3.x कोष्ठक printअनिवार्य है, अनिवार्य रूप से इसे एक फ़ंक्शन बनाता है, लेकिन 2.7 में दोनों अलग-अलग परिणामों के साथ काम करेंगे। printपायथन 2.7 के बारे में मुझे और क्या पता होना चाहिए ?


7
पायथन में 2.x printवास्तव में एक विशेष कथन है, एक फ़ंक्शन नहीं। यह भी ऐसा क्यों है कि इसका उपयोग नहीं किया जा सकता है: lambda x: print xध्यान दें कि (expr)एक ट्यूपल (यह परिणाम expr) नहीं बनाता है , लेकिन ,करता है।

मैं एक फ़ंक्शन के रूप में प्रिंट के लिए समर्थन मान रहा हूं और एक बयान के रूप में प्रिंट करता है, अजगर के पुराने संस्करणों के साथ पीछे की संगतता बनाए रखना है, जबकि लोगों को अजगर की ओर पलायन करने के लिए नए वाक्यविन्यास का उपयोग करने के लिए प्रोत्साहित करना 3.
GWW

11
पीएस, 2.7 में प्रिंट फ़ंक्शन को सक्षम करने के लिए (और प्रिंट स्टेटमेंट व्यवहार नहीं है), आपको एक भविष्य का आयात करना होगा:from __future__ import print_function
जेफ मर्काडो

क्या दूसरा उदाहरण वास्तव में "हैलो, वर्ल्ड!" (अंतरिक्ष के बिना) या यह "हैलो, वर्ल्ड!" (अंतरिक्ष के साथ) उदाहरण के रूप में।
kapad

जवाबों:


107

पायथन में 2.x printवास्तव में एक विशेष कथन है और फ़ंक्शन नहीं है *।

यह भी ऐसा क्यों है इसका उपयोग नहीं किया जा सकता है: lambda x: print x

ध्यान दें कि (expr)एक Tuple नहीं बनता है (इसका परिणाम होता है expr), लेकिन ,करता है। इस संभावना के बीच print (x)और print (x, y)पायथन 2.7 में भ्रम की स्थिति पैदा होती है

(1)   # 1 -- no tuple Mister!
(1,)  # (1,)
(1,2) # (1, 2)
1,2   # 1 2 -- no tuple and no parenthesis :) [See below for print caveat.]

हालाँकि, जब printसे पाइथन 2.x में एक विशेष वाक्यविन्यास कथन / व्याकरण का निर्माण होता है, तब कोष्ठक के बिना, यह ,एक विशेष तरीके से व्यवहार करता है - और एक ट्यूपल नहीं बनाता है। printकथन का यह विशेष उपचार इसे अलग तरह से कार्य करने में सक्षम बनाता है यदि कोई अनुगामी है ,या नहीं।

खुश कोडिंग।


* printपायथन 2 में इस व्यवहार को पायथन 3 में बदला जा सकता है:

from __future__ import print_function

3
(expr) != tupleस्पष्टीकरण के लिए धन्यवाद :-)
हुब्रो

5

यह सब बहुत सरल है और आगे या पीछे की संगतता के साथ इसका कोई लेना देना नहीं है।

printसंस्करण 3 से पहले सभी पायथन संस्करणों में बयान के लिए सामान्य रूप है:

print expr1, expr2, ... exprn

(बदले में प्रत्येक अभिव्यक्ति का मूल्यांकन किया जाता है, एक स्ट्रिंग में परिवर्तित किया जाता है और उनके बीच एक स्थान के साथ प्रदर्शित किया जाता है।)

लेकिन याद रखें कि एक अभिव्यक्ति के चारों ओर कोष्ठक लगाना अभी भी वही अभिव्यक्ति है।

तो आप इसे इस प्रकार भी लिख सकते हैं:

print (expr1), (expr2), ... (expr3)

यह एक समारोह बुला के साथ कुछ नहीं करना है।


यह एक पूरी तरह से सही उत्तर है, मुझे यकीन नहीं है कि इसे इतना नीचे क्यों उतारा गया था।
मार्टिन पीटर्स

यह इसके बारे में नहीं है print (expr1), (expr2), ... (expr3), यह print (expr1, expr2, ... , expr3)अजगर 2x में कानूनी क्यों है, जबकि यह 2.x मानकों के अनुसार नहीं होना चाहिए।
विनीत

5

जब हम UTF-8 की बात करते हैं तो यहां इसका दिलचस्प दुष्प्रभाव है।

>> greek = dict( dog="σκύλος", cat="γάτα" )
>> print greek['dog'], greek['cat']
σκύλος γάτα
>> print (greek['dog'], greek['cat'])
('\xcf\x83\xce\xba\xcf\x8d\xce\xbb\xce\xbf\xcf\x82', '\xce\xb3\xce\xac\xcf\x84\xce\xb1')

अंतिम प्रिंट हेक्साडेसिमल बाइट मूल्यों के साथ टपल है।


7
मुझे लगता है कि क्योंकि प्रिंट UTF-8 को सही ढंग से प्रिंट करता है, लेकिन जब यह आपके अंतिम प्रिंट की तरह एक टपल प्राप्त करता है, तो यह उस reprपर चलता है, जिस बिंदु पर यह संभवतः ASCII के लिए सभी स्ट्रिंग्स को एन्कोड करता है।
20

3
@Codemonkey, आप repr के बारे में सही हैं । आप ASCII के बारे में गलत हैं। ASCII पायथन के लिए डिफ़ॉल्ट एन्कोडिंग है। लेकिन मेरे पास पायथन लिपि की शुरुआत में है #encoding=utf-8, linux env LANG=en_US.UTF-8। इसलिए repr डिफ़ॉल्ट ASCII का उपयोग नहीं करते हैं, लेकिन utf-8 एन्कोडिंग।
कार्लो स्मिड

1
strविशेष string_escapeएन्कोडिंग के साथ पुन: एनकोड करें । स्ट्रिंग पहले से ही यूनिकोड -8 के रूप में यूनिकोड एनकोडेड थी।
त्ज़ोट

@ करलोस्मिड: मेरे कहने का मतलब यह था कि reprसंभवतः यह सुनिश्चित करने के लिए कदम उठाए गए हैं कि पाठ को ASCII (गैर-ASCII प्रतीकों से बचने के माध्यम से) का प्रतिनिधित्व किया जा सकता है, जरूरी नहीं कि स्ट्रिंग ASCII के रूप में एन्कोडेड हो। मुझे अभी भी नहीं पता कि यह पूरी तरह से सटीक है या नहीं।
हब्रो

सभी पायथन कंटेनर (सूची, तानाशाह, टपल, सेट) repr()एक स्ट्रिंग में परिवर्तित होने पर उनकी सामग्री को आउटपुट के रूप में शामिल करते हैं (वे लागू नहीं होते हैं __str__, केवल __repr__)। जो आप देख रहे हैं वह UTF-8 के लिए विशेष नहीं है; repr()एक स्ट्रिंग की आप वैध अजगर स्ट्रिंग शाब्दिक कि ASCII-सुरक्षित हैं देता है।
मार्टिन पीटर्स

2

मूल रूप से पायथन 3 से पहले पायथन में, प्रिंट एक विशेष वक्तव्य था जिसने तर्कों के रूप में सभी तारों को मुद्रित किया। तो print "foo","bar"बस "बार 'के बाद" प्रिंट' फू का मतलब था। इसके साथ समस्या यह थी कि यह कार्य करने के लिए आकर्षक था जैसे कि प्रिंट एक फ़ंक्शन था, और पायथन व्याकरण उस पर अस्पष्ट है, क्योंकि (a,b)एक ट्यूपल युक्त है aऔर bलेकिन foo(a,b)दो तर्कों के कार्य के लिए एक कॉल है।

इसलिए उन्होंने कार्यक्रमों को कम अस्पष्ट और अधिक नियमित बनाने के लिए 3 के लिए असंगत परिवर्तन किया।

(वास्तव में, मुझे लगता है कि 2.7 व्यवहार करता है जैसा कि 2.6 ने इस पर किया, लेकिन मैं निश्चित नहीं हूं।)


नहीं, यह एक फ़ंक्शन के रूप में उपयोग करने के लिए "आकर्षक" नहीं था। :) हालांकि, इसे एक फ़ंक्शन के रूप में उपयोग करना असंभव था, इसलिए आप उदाहरण के लिए [प्रिंट एक्स में एक्स के लिए] नहीं कर सकते।
लेन्नर्ट रीजब्रो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.