जवाबों:
ऐसा नहीं है क्योंकि इसका कोई मतलब नहीं है; यह "x ++" को "x + = 1" के रूप में परिभाषित करने के लिए सही अर्थ बनाता है, x के पिछले बंधन का मूल्यांकन करता है।
यदि आप मूल कारण जानना चाहते हैं, तो आपको पुराने पायथन मेलिंग सूचियों के माध्यम से या तो फीका करना होगा या किसी ऐसे व्यक्ति से पूछना होगा जो वहाँ था (उदाहरण के लिए। गिदो), लेकिन यह तथ्य के बाद औचित्य के लिए पर्याप्त आसान है:
साधारण वेतन वृद्धि और गिरावट अन्य भाषाओं में उतनी आवश्यक नहीं है। आप for(int i = 0; i < 10; ++i)
पायथन में बहुत बार ऐसी चीजें नहीं लिखते हैं ; इसके बजाय आप जैसी चीजें करते हैं for i in range(0, 10)
।
चूंकि इसकी आवश्यकता लगभग नहीं है, इसलिए इसे अपने विशेष सिंटैक्स देने का बहुत कम कारण है; जब आपको वेतन वृद्धि की आवश्यकता होती है, +=
तो आमतौर पर ठीक होता है।
यह इस बात का निर्णय नहीं है कि क्या यह समझ में आता है, या क्या यह किया जा सकता है - यह करता है, और यह कर सकता है। यह सवाल है कि क्या लाभ भाषा के मूल वाक्य-विन्यास में जोड़ने लायक है। याद रखें, यह चार संचालक हैं - पोस्टिनक, पोस्टडेक, प्रीसिंक, प्रीके, और इनमें से प्रत्येक को अपनी कक्षा के अधिभार की आवश्यकता होगी; उन सभी को निर्दिष्ट करने की आवश्यकता है, और परीक्षण किया गया; यह भाषा में opcodes जोड़ देगा (एक बड़ा, और इसलिए धीमा, वीएम इंजन); हर वर्ग जो एक तार्किक वेतन वृद्धि का समर्थन करता है, उन्हें (शीर्ष पर +=
और -=
) लागू करने की आवश्यकता होगी ।
यह सब बेमानी है +=
और -=
इसलिए, यह शुद्ध नुकसान बन जाएगा।
i
सीधे-सीधे लूप हो सकते हैं - अगर आपको वास्तव में इसकी आवश्यकता है और केवल उदाहरण के लिए उपयोग नहीं किया जा सकता हैarray.append()
i++
और ++i
...
++
और --
उन तरीकों से उपयोग किया जा रहा है जिनके परिणामस्वरूप अपरिभाषित या अनिर्दिष्ट है। व्यवहार। वे जटिल, कठिन-से-सही ढंग से पार्स कोड लिखना संभव बनाते हैं।
यह मूल उत्तर मैंने लिखा है कंप्यूटिंग के लोकगीत से एक मिथक है : डेनिस रिची द्वारा "ऐतिहासिक रूप से असंभव" के रूप में चर्चित , एसीएम जुलाई 2012 के संचारकों के संपादकों को लिखे गए पत्रों में उल्लेख किया गया है : 10.1145 / 22024249.2209251
C इंक्रीमेंट / डिक्रीमेंट ऑपरेटरों का आविष्कार ऐसे समय में किया गया था जब C कंपाइलर बहुत स्मार्ट नहीं था और लेखक प्रत्यक्ष अभिप्राय बताना चाहते थे कि एक मशीन लैंग्वेज ऑपरेटर का उपयोग किया जाना चाहिए जो एक कंपाइलर के लिए मुट्ठी भर चक्रों को बचाता है जो हो सकता है
load memory
load 1
add
store memory
के बजाय
inc memory
और PDP-11 यहाँ तक कि "autoincrement" और "autoincrement आस्थगित" करने के लिए इसी निर्देश समर्थित *++p
और *p++
, क्रमशः। मैन्युअल रूप से खंड 5.3 देखें यदि बुरी तरह से उत्सुक।
चूंकि सी के सिंटैक्स में निर्मित उच्च-स्तरीय अनुकूलन चाल को संभालने के लिए कंपाइलर काफी स्मार्ट होते हैं, वे अब केवल एक सिंटैक्टिक सुविधा हैं।
पायथन में कोडांतरक को इरादे व्यक्त करने के गुर नहीं हैं क्योंकि यह एक का उपयोग नहीं करता है।
मैंने हमेशा यह मान लिया था कि अजगर के ज़ेन की इस रेखा के साथ क्या करना है:
एक होना चाहिए - और अधिमानतः केवल एक - स्पष्ट तरीका यह करने के लिए।
x ++ और x + = 1 ठीक एक ही काम करते हैं, इसलिए दोनों होने का कोई कारण नहीं है।
one--
शून्य है?
one--
वाक्य में एक है, लेकिन तुरंत बाद शून्य। तो यह 'कोन' यह भी संकेत देता है कि वेतन वृद्धि / अपवर्जन ऑपरेटर गैर-स्पष्ट हैं।
बेशक, हम यह कह सकते हैं कि "गुइडो ने इस तरह से निर्णय लिया", लेकिन मुझे लगता है कि प्रश्न वास्तव में उस निर्णय के कारणों के बारे में है। मुझे लगता है कि कई कारण हैं:
क्योंकि, पायथन में, पूर्णांक अपरिवर्तनीय होते हैं (इंट का + = वास्तव में एक अलग वस्तु देता है)।
इसके अलावा, ++ / - के साथ आपको पूर्व-बनाम वेतन वृद्धि / गिरावट के बारे में चिंता करने की आवश्यकता है, और इसे लिखने के लिए केवल एक और कीस्ट्रोक चाहिए x+=1
। दूसरे शब्दों में, यह बहुत कम लाभ की कीमत पर संभावित भ्रम से बचा जाता है।
42++
... कुछ इस तरह से (शाब्दिक स्थिरांक को संशोधित करना) वास्तव में कुछ पुराने फोरट्रान कंपाइलरों में संभव था (या इसलिए मैंने पढ़ा है): भविष्य के सभी उपयोग उस कार्यक्रम में उस शाब्दिक के बाद वास्तव में एक अलग मूल्य होगा। खुश डिबगिंग!
int
सामान्य रूप से सी एस अपरिवर्तनीय हैं। एक int
सी में बस स्मृति में एक जगह निर्दिष्ट करता है। और उस जगह पर बिट्स बहुत अधिक परस्पर हैं। उदाहरण के लिए, आप एक संदर्भ बना सकते हैं int
और उस संदर्भ के संदर्भ को बदल सकते हैं। यह परिवर्तन int
उस स्थान पर सभी संदर्भों (मूल चर सहित ) में दिखाई देता है। वही पायथन पूर्णांक ऑब्जेक्ट के लिए धारण नहीं करता है।
पाइथन स्पष्टता के बारे में बहुत कुछ है और कोई भी प्रोग्रामर --a
जब तक उस निर्माण को करने वाली भाषा नहीं सीख लेता , तब तक उसके अर्थ का सही अनुमान लगाने की संभावना नहीं है ।
पाइथन उन निर्माणों से बचने के बारे में भी है जो गलतियों को आमंत्रित करते हैं और ++
ऑपरेटरों को दोषों के समृद्ध स्रोत के रूप में जाना जाता है। पायथन में उन ऑपरेटरों के नहीं होने के लिए ये दो कारण पर्याप्त हैं।
पायथन जो निर्णय सिंटैक्टिकल माध्यमों के बजाय ब्लॉक को चिह्नित करने के लिए इंडेंटेशन का उपयोग करता है जैसे कि शुरुआत के कुछ रूप / अंत ब्रैकेटिंग या अनिवार्य एंड मार्किंग एक ही विचार पर काफी हद तक आधारित है।
दृष्टांत के लिए, 2005 में पायथन में एक सशर्त ऑपरेटर (सी: में cond ? resultif : resultelse
) को शुरू करने के बारे में चर्चा पर एक नज़र डालें । कम से कम पहला संदेश और उस चर्चा का निर्णय संदेश पढ़ें (जिसमें पहले एक ही विषय पर कई अग्रदूत थे)।
सामान्य ज्ञान: अक्सर उल्लिखित PEP "पायथन एक्सटेंशन प्रस्ताव" PEP 308 है । नियंत्रण रेखा का मतलब सूची की समझ है , जीई का अर्थ है जनरेटर अभिव्यक्ति (और चिंता न करें यदि वे आपको भ्रमित करते हैं, तो वे पायथन के कुछ जटिल स्थानों में से कोई नहीं हैं)।
अजगर के पास ++
ऑपरेटर क्यों नहीं है, इसकी मेरी समझ निम्नलिखित है: जब आप अजगर में इसे लिखते हैं तो आपको a=b=c=1
एक ही ऑब्जेक्ट पर इंगित करने वाले तीन चर (लेबल) मिलेंगे (जो मान 1 है)। आप आईडी फ़ंक्शन का उपयोग करके इसे सत्यापित कर सकते हैं जो ऑब्जेक्ट मेमोरी एड्रेस लौटाएगा:
In [19]: id(a)
Out[19]: 34019256
In [20]: id(b)
Out[20]: 34019256
In [21]: id(c)
Out[21]: 34019256
सभी तीन चर (लेबल) एक ही वस्तु की ओर इशारा करते हैं। अब एक चर को बढ़ाएँ और देखें कि यह स्मृति पतों को कैसे प्रभावित करता है:
In [22] a = a + 1
In [23]: id(a)
Out[23]: 34019232
In [24]: id(b)
Out[24]: 34019256
In [25]: id(c)
Out[25]: 34019256
आप उस चर को a
अब किसी अन्य वस्तु को चर के रूप में इंगित कर सकते हैं b
और c
। क्योंकि आपने इसका उपयोग किया है a = a + 1
यह स्पष्ट रूप से स्पष्ट है। दूसरे शब्दों में, आप लेबल करने के लिए पूरी तरह से एक और वस्तु प्रदान करते हैं a
। कल्पना कीजिए कि आप लिख सकते a++
हैं कि यह सुझाव देगा कि आपने a
नई वस्तु को चरने के लिए असाइन नहीं किया है, लेकिन पुराने को बढ़ाएं। यह सब सामान भ्रम की स्थिति को कम करने के लिए IMHO है। बेहतर समझ के लिए कि अजगर चर कैसे काम करता है:
पायथन में, एक फ़ंक्शन कॉलर द्वारा कथित कुछ तर्कों को संशोधित कर सकता है, लेकिन दूसरों को नहीं?
क्या पायथन कॉल-बाय-वैल्यू या कॉल-बाय-रेफरेंस है? न तो।
क्या पायथन मूल्य से, या संदर्भ से गुजरता है?
पायथन पास-दर-संदर्भ है या पास-बाय-वैल्यू है?
अजगर: मैं संदर्भ से एक चर कैसे पार करूं?
पायथन चरों और मेमोरी मैनेजमेंट को समझना
अजगर में पास-दर-मूल्य व्यवहार का अनुकरण करना
यह सिर्फ उस तरह से डिज़ाइन किया गया था। इन्क्रीमेंट और डीकरेक्शन ऑपरेटर के लिए शॉर्टकट हैं x = x + 1
। पायथन ने आमतौर पर एक डिजाइन रणनीति अपनाई है जो ऑपरेशन करने के वैकल्पिक साधनों की संख्या को कम करती है। संवर्धित असाइनमेंट पायथन में संचालकों / वेतन वृद्धि संचालकों के लिए निकटतम चीज है, और उन्हें पायथन 2.0 तक जोड़ा नहीं गया था।
return a[i++]
साथ बदल सकता है return a[i=i+1]
।
मैं अजगर के लिए बहुत नया हूं, लेकिन मुझे संदेह है कि इसका कारण भाषा के भीतर उत्परिवर्तनीय और अपरिवर्तनीय वस्तुओं के बीच जोर है। अब, मुझे पता है कि एक्स ++ आसानी से के रूप में एक्स = x + 1 व्याख्या की जा सकती है, लेकिन ऐसा लगता है कि आप incrementing रहे हैं यथा-स्थान एक वस्तु जो अपरिवर्तनीय हो सकता है।
बस मेरा अनुमान / एहसास / कूबड़।
x++
की x += 1
तुलना में करीब है x = x + 1
, इन दोनों के साथ-साथ उत्परिवर्तनीय वस्तुओं पर फर्क पड़ता है।
पहले, पायथन केवल अप्रत्यक्ष रूप से C से प्रभावित होता है; यह एबीसी से बहुत अधिक प्रभावित है , जो जाहिर तौर पर इन ऑपरेटरों के पास नहीं है , इसलिए इसे पायनियर में भी नहीं ढूंढना कोई बड़ी बात नहीं होनी चाहिए।
दूसरी बात यह है के रूप में अन्य लोगों ने कहा, वेतन वृद्धि और घटती द्वारा समर्थित हैं +=
और -=
पहले से ही।
तीसरा, एक ++
और --
ऑपरेटर सेट के लिए पूर्ण समर्थन में आमतौर पर उपसर्ग और उपसर्ग दोनों के संस्करणों का समर्थन करना शामिल है। सी और सी ++ में, यह सभी प्रकार के "प्यारे" निर्माणों को जन्म दे सकता है जो (मुझे) लगता है कि सादगी और सीधे-आगे की भावना के खिलाफ होना चाहिए जो पायथन को गले लगाता है।
उदाहरण के लिए, जबकि सी बयान while(*t++ = *s++);
एक अनुभवी प्रोग्रामर को सरल और सुरुचिपूर्ण लग सकता है, किसी को इसे सीखने के लिए, यह कुछ भी है लेकिन सरल है। उपसर्ग और उपसर्ग में वृद्धि और क्षय के मिश्रण में फेंक दें, और यहां तक कि कई पेशेवरों को थोड़ा रुकना और सोचना होगा।
मेरा मानना है कि यह पायथन पंथ से उपजा है कि "स्पष्ट रूप से निहित से बेहतर है"।
ऐसा इसलिए हो सकता है क्योंकि @GlennMaynard अन्य भाषाओं की तुलना में मामले को देख रहा है, लेकिन पायथन में, आप चीजों को अजगर की तरह करते हैं। यह एक 'क्यों' सवाल नहीं है। यह वहां है और आप चीजों को उसी प्रभाव के साथ कर सकते हैं x+=
। में अजगर के ज़ेन , यह दिया जाता है: "वहाँ केवल एक समस्या को हल करने का एक तरीका होना चाहिए।" कला में कई विकल्प महान हैं (अभिव्यक्ति की स्वतंत्रता) लेकिन इंजीनियरिंग में घटिया।
++
संचालकों का वर्ग साइड इफेक्ट के साथ अभिव्यक्ति है। यह कुछ ऐसा है जो आमतौर पर पायथन में नहीं पाया जाता है।
उसी कारण से पायथन में एक असाइनमेंट एक अभिव्यक्ति नहीं है, इस प्रकार सामान्य if (a = f(...)) { /* using a here */ }
मुहावरे को रोकना है ।
अंत में मुझे संदेह है कि ऑपरेटर पायथन संदर्भ शब्दार्थ के अनुरूप नहीं हैं। याद रखें, पायथन में सी / सी ++ से ज्ञात शब्दार्थ के साथ चर (या संकेत) नहीं हैं।
f(a)
जहां a
एक सूची है, कुछ अपरिवर्तनीय वस्तु।
हो सकता है कि एक बेहतर सवाल यह पूछा जाए कि ये ऑपरेटर सी। के। एंड आर कॉल इंक्रीमेंट और डिक्रीमेंट ऑपरेटरों को 'असामान्य' क्यों कहते हैं (धारा 2.8 पृष्ठ 46)। परिचय उन्हें 'अधिक संक्षिप्त और अक्सर अधिक कुशल' कहता है। मुझे संदेह है कि ये ऑपरेशन हमेशा पॉइंटर हेरफेर में सामने आते हैं, इसने भी उनके परिचय में एक भूमिका निभाई है। पायथन में यह शायद तय किया गया है कि वेतन वृद्धि को अनुकूलित करने की कोशिश करने का कोई मतलब नहीं था (वास्तव में मैंने अभी सी में एक परीक्षण किया था, और ऐसा लगता है कि जीसीसी द्वारा उत्पन्न विधानसभा दोनों मामलों में झुकाव के बजाय ऐडल का उपयोग करता है) और कोई नहीं है सूचक अंकगणित; इसलिए यह सिर्फ एक और तरीका है इसे करने के लिए और हम पायथन लोथ्स को जानते हैं।
जैसा कि मैंने इसे समझा, इसलिए आपको नहीं लगेगा कि स्मृति में मूल्य बदल गया है। c में जब आप x ++ करते हैं तो मेमोरी में x का मान बदल जाता है। लेकिन अजगर में सभी संख्याएं अपरिवर्तनीय होती हैं, इसलिए पता कि x अभी भी x x 1 नहीं है। जब आप x ++ लिखते हैं, तो आपको लगता है कि x परिवर्तन वास्तव में क्या होता है, x refrence को मेमोरी में किसी स्थान पर बदल दिया जाता है, जहां x + 1 संग्रहीत होता है या इस स्थान को फिर से बनाता है यदि doe's मौजूद नहीं है।
++
और से अलग बनाता है += 1
?
उस पृष्ठ पर पहले से ही अच्छे उत्तरों को पूरा करने के लिए:
मान लीजिए कि हम ऐसा करने का फैसला करते हैं, उपसर्ग (++i
) जो कि + और - ऑपरेटरों को तोड़ देगा।
आज, उपसर्ग ++
या --
कुछ भी नहीं करता है, क्योंकि यह दो बार (और कुछ नहीं) या दो बार (शून्य: खुद को रद्द करता है) के बिना संयुक्त ऑपरेटर को सक्षम करता है।
>>> i=12
>>> ++i
12
>>> --i
12
ताकि संभावित रूप से उस तर्क को तोड़ा जा सके।
अन्य उत्तरों ने वर्णन किया है कि पुनरावृत्तियों के लिए इसकी आवश्यकता क्यों नहीं है, लेकिन कभी-कभी यह उपयोगी होता है जब एक चर-इन-लाइन को बढ़ाने के लिए असाइन किया जाता है, तो आप ट्यूपल्स और कई असाइनमेंट का उपयोग करके समान प्रभाव प्राप्त कर सकते हैं:
b = ++a
हो जाता है:
a,b = (a+1,)*2
और b = a++
बन जाता है:
a,b = a+1, a
अजगर 3.8 काम का परिचय :=
ऑपरेटर, हमें प्राप्त करने के लिए अनुमति देता है foo(++a)
के साथ
foo(a:=a+1)
foo(a++)
हालांकि अभी भी मायावी है।
मुझे लगता है कि यह वस्तुओं की परस्परता और अपरिवर्तनीयता की अवधारणाओं से संबंधित है। अजगर में 2,3,4,5 अपरिवर्तनीय हैं। नीचे दी गई छवि को देखें। 2 इस अजगर प्रक्रिया तक आईडी तय की है।
x ++ का मतलब अनिवार्य रूप से C. की तरह इन-प्लेस इंक्रीमेंट होगा। C ++ में, x ++ इन-प्लेस इंक्रीमेंट करता है। तो, x = 3, और x ++ स्मृति में 3 से 4 तक वृद्धि करेगा, अजगर के विपरीत जहां 3 अभी भी स्मृति में मौजूद होगा।
इस प्रकार अजगर में, आपको स्मृति में एक मूल्य को फिर से बनाने की आवश्यकता नहीं है। इससे प्रदर्शन अनुकूलन हो सकते हैं।
यह एक कूबड़ आधारित उत्तर है।
मुझे पता है कि यह एक पुराना धागा है, लेकिन ++ i के लिए सबसे आम उपयोग मामला कवर नहीं किया गया है, जब कोई संकेत नहीं दिए जाते हैं तो मैन्युअल रूप से अनुक्रमित सेट किया जा रहा है। यह स्थिति यही है कि अजगर एन्यूमरेट प्रदान करता है ()
उदाहरण: किसी भी भाषा में, जब आप किसी सेट पर पुनरावृत्ति करने के लिए फोरचेक जैसे निर्माण का उपयोग करते हैं - उदाहरण के लिए, हम यहां तक कहेंगे कि यह एक अनियंत्रित सेट है और आपको उन्हें अलग-अलग बताने के लिए हर चीज के लिए एक अद्वितीय सूचकांक की आवश्यकता है,
i = 0
stuff = {'a': 'b', 'c': 'd', 'e': 'f'}
uniquestuff = {}
for key, val in stuff.items() :
uniquestuff[key] = '{0}{1}'.format(val, i)
i += 1
इस तरह के मामलों में, अजगर एक समृद्ध विधि प्रदान करता है, जैसे
for i, (key, val) in enumerate(stuff.items()) :