पायथन में कोई ++ और - ऑपरेटर क्यों नहीं हैं?


442

पायथन में कोई ++और --ऑपरेटर क्यों नहीं हैं ?



क्योंकि
बेमानी

theres जैसे 4 अलग-अलग ++ ऑपरेटर्स कि सभी एक ही काम करते हैं। ओह और "सी ++" से "++" को हटाना अब एक अध: पतन की तरह लगता है
cmarangu

जवाबों:


443

ऐसा नहीं है क्योंकि इसका कोई मतलब नहीं है; यह "x ++" को "x + = 1" के रूप में परिभाषित करने के लिए सही अर्थ बनाता है, x के पिछले बंधन का मूल्यांकन करता है।

यदि आप मूल कारण जानना चाहते हैं, तो आपको पुराने पायथन मेलिंग सूचियों के माध्यम से या तो फीका करना होगा या किसी ऐसे व्यक्ति से पूछना होगा जो वहाँ था (उदाहरण के लिए। गिदो), लेकिन यह तथ्य के बाद औचित्य के लिए पर्याप्त आसान है:

साधारण वेतन वृद्धि और गिरावट अन्य भाषाओं में उतनी आवश्यक नहीं है। आप for(int i = 0; i < 10; ++i)पायथन में बहुत बार ऐसी चीजें नहीं लिखते हैं ; इसके बजाय आप जैसी चीजें करते हैं for i in range(0, 10)

चूंकि इसकी आवश्यकता लगभग नहीं है, इसलिए इसे अपने विशेष सिंटैक्स देने का बहुत कम कारण है; जब आपको वेतन वृद्धि की आवश्यकता होती है, +=तो आमतौर पर ठीक होता है।

यह इस बात का निर्णय नहीं है कि क्या यह समझ में आता है, या क्या यह किया जा सकता है - यह करता है, और यह कर सकता है। यह सवाल है कि क्या लाभ भाषा के मूल वाक्य-विन्यास में जोड़ने लायक है। याद रखें, यह चार संचालक हैं - पोस्टिनक, पोस्टडेक, प्रीसिंक, प्रीके, और इनमें से प्रत्येक को अपनी कक्षा के अधिभार की आवश्यकता होगी; उन सभी को निर्दिष्ट करने की आवश्यकता है, और परीक्षण किया गया; यह भाषा में opcodes जोड़ देगा (एक बड़ा, और इसलिए धीमा, वीएम इंजन); हर वर्ग जो एक तार्किक वेतन वृद्धि का समर्थन करता है, उन्हें (शीर्ष पर +=और -=) लागू करने की आवश्यकता होगी ।

यह सब बेमानी है +=और -=इसलिए, यह शुद्ध नुकसान बन जाएगा।


98
यह अक्सर सरणी [i ++] जैसी किसी चीज़ का उपयोग करने के लिए उपयोगी होता है, जिसे tidily + = / - = के साथ नहीं किया जाता है।
टर्नर हेस

102
@ टायस: यह पायथन में एक सामान्य पैटर्न नहीं है।
ग्लेन मेनार्ड

9
@ टायट्स चूंकि यह एक लूप के अंदर होगा, आप iसीधे-सीधे लूप हो सकते हैं - अगर आपको वास्तव में इसकी आवश्यकता है और केवल उदाहरण के लिए उपयोग नहीं किया जा सकता हैarray.append()
तोबियस किंजलर

31
मैं देख रहा हूं कि पठनीयता और पूर्वानुमेयता की बहुत बड़ी चिंता है। अपने सी दिनों में, मैंने देखा कि पर्याप्त कीड़े के बीच गलतफहमी से उपजी पर्याप्त कीड़े हैं i++और ++i...
चार्ल्स डफी

5
इस तथ्य के औचित्य में जोड़ने के लिए: जिस परियोजना पर मैं काम करता हूं, उस पर मैंने (किसी से भी अधिक अपने जीवन में) का सामना करना पड़ा, सी ++ कोड की एक उचित मात्रा के साथ समस्याओं से पीड़ित ++और --उन तरीकों से उपयोग किया जा रहा है जिनके परिणामस्वरूप अपरिभाषित या अनिर्दिष्ट है। व्यवहार। वे जटिल, कठिन-से-सही ढंग से पार्स कोड लिखना संभव बनाते हैं।
ब्रायन वंडेनबर्ग

84

यह मूल उत्तर मैंने लिखा है कंप्यूटिंग के लोकगीत से एक मिथक है : डेनिस रिची द्वारा "ऐतिहासिक रूप से असंभव" के रूप में चर्चित , एसीएम जुलाई 2012 के संचारकों के संपादकों को लिखे गए पत्रों में उल्लेख किया गया है : 10.1145 / 22024249.2209251


C इंक्रीमेंट / डिक्रीमेंट ऑपरेटरों का आविष्कार ऐसे समय में किया गया था जब C कंपाइलर बहुत स्मार्ट नहीं था और लेखक प्रत्यक्ष अभिप्राय बताना चाहते थे कि एक मशीन लैंग्वेज ऑपरेटर का उपयोग किया जाना चाहिए जो एक कंपाइलर के लिए मुट्ठी भर चक्रों को बचाता है जो हो सकता है

load memory
load 1
add
store memory

के बजाय

inc memory 

और PDP-11 यहाँ तक कि "autoincrement" और "autoincrement आस्थगित" करने के लिए इसी निर्देश समर्थित *++pऔर *p++, क्रमशः। मैन्युअल रूप से खंड 5.3 देखें यदि बुरी तरह से उत्सुक।

चूंकि सी के सिंटैक्स में निर्मित उच्च-स्तरीय अनुकूलन चाल को संभालने के लिए कंपाइलर काफी स्मार्ट होते हैं, वे अब केवल एक सिंटैक्टिक सुविधा हैं।

पायथन में कोडांतरक को इरादे व्यक्त करने के गुर नहीं हैं क्योंकि यह एक का उपयोग नहीं करता है।


4
जावास्क्रिप्ट है ++। मुझे नहीं लगता कि यह एक "चालबाज को इरादे व्यक्त करने की चाल है।" साथ ही, पायथन में बायटेकोड है। इसलिए मुझे लगता है कि इसका कारण कुछ और है।
नाथन डेविस

13
यह "कंपाइलर को संकेत प्रदान करना" व्यवसाय वास्तव में एक मिथक है। सच कहूँ तो, यह किसी भी भाषा के लिए एक बेवकूफ है और यह निम्नलिखित दो उपदेशों का उल्लंघन करता है: 1. आप कंप्यूटर को पढ़ने के लिए कोड नहीं करते हैं, आप पढ़ने के लिए किसी अन्य इंजीनियर के लिए कोड करते हैं। और 2. आप पढ़ने के लिए एक सक्षम इंजीनियर के लिए कोड नहीं करते हैं, आप एक सक्षम इंजीनियर के लिए कोड को पढ़ते हैं, जबकि 3 बजे समाप्त हो जाता है और कैफीन पर बंद हो जाता है।

3
@ tgm1024 निष्पक्ष होने के लिए, जब आप प्रति सेकंड 1030 वर्ण, आधे-द्वैध टेलेटाइप पर कोडिंग करते हैं, तो आप कोड करते हैं ताकि आप इसे अगले सप्ताह से पहले कुंजी दे सकें।
msw

4
@ tgm1024 यूनिक्स और सी ने पीडीपी -11 पर अपने प्रारंभिक विकास के थोक को देखा, जो उपयोगकर्ता संचार के लिए अविश्वसनीय रूप से धीमी गति से उपयोग किया गया था। जब आप सही मर जाते हैं कि आज मशीन के लिए कोडिंग ज्यादातर मूर्खतापूर्ण है, तो यह मानव / मशीन इंटरफ़ेस था जो अड़चन था। यह काम करना मुश्किल है कि धीरे-धीरे अगर आपको कभी नहीं करना है।
msw

65

मैंने हमेशा यह मान लिया था कि अजगर के ज़ेन की इस रेखा के साथ क्या करना है:

एक होना चाहिए - और अधिमानतः केवल एक - स्पष्ट तरीका यह करने के लिए।

x ++ और x + = 1 ठीक एक ही काम करते हैं, इसलिए दोनों होने का कोई कारण नहीं है।


10
one--शून्य है?
आंद्रे होल्जनर

25
one--वाक्य में एक है, लेकिन तुरंत बाद शून्य। तो यह 'कोन' यह भी संकेत देता है कि वेतन वृद्धि / अपवर्जन ऑपरेटर गैर-स्पष्ट हैं।
विक्टर के

14
@EralpB यदि आप + = हटाते हैं, तो आप x + = 10. जैसी चीजें नहीं कर सकते हैं। ++ का अधिक सामान्य मामला है
रोरी

8
इसके अलावा: "स्पष्ट है निहित से बेहतर है"।
बेर

2
निश्चित रूप से समान नहीं है, क्योंकि x + = 1 कोई अभिव्यक्ति नहीं है - यह एक कथन है - और यह किसी भी चीज का मूल्यांकन नहीं करता है। आप ऐसा नहीं कर सकते हैं: 'पंक्ति [col ++] = a; पंक्ति [col ++] = b '। C ++ में प्री-इंक और पोस्ट इंक सामान का उल्लेख नहीं है।
उरी

38

बेशक, हम यह कह सकते हैं कि "गुइडो ने इस तरह से निर्णय लिया", लेकिन मुझे लगता है कि प्रश्न वास्तव में उस निर्णय के कारणों के बारे में है। मुझे लगता है कि कई कारण हैं:

  • यह बयानों और अभिव्यक्तियों को एक साथ मिलाता है, जो अच्छा अभ्यास नहीं है। Http://norvig.com/python-iaq.html देखें
  • यह आमतौर पर लोगों को कम पठनीय कोड लिखने के लिए प्रोत्साहित करता है
  • भाषा कार्यान्वयन में अतिरिक्त जटिलता, जो पहले से ही उल्लेख के अनुसार पायथन में अनावश्यक है

12
खुशी है कि किसी ने अंततः कथन बनाम अभिव्यक्ति पहलू का उल्लेख किया। सी असाइनमेंट में एक अभिव्यक्ति है और इसलिए यह ++ ऑपरेटर है। पायथन असाइनमेंट में एक स्टेटमेंट होता है, इसलिए यदि यह ++ था , तो इसे असाइनमेंट स्टेटमेंट होने की आवश्यकता होगी, (और भी कम उपयोगी या आवश्यक)।
मार्टीन्यू सेप

सहमत - अगर वे बयान थे, तो कम से कम यह पोस्ट और पूर्व-ऑपरेटरों के बीच अंतर के बारे में बात करने के लिए बिल्कुल व्यर्थ हो जाएगा।
क्राउन

17

क्योंकि, पायथन में, पूर्णांक अपरिवर्तनीय होते हैं (इंट का + = वास्तव में एक अलग वस्तु देता है)।

इसके अलावा, ++ / - के साथ आपको पूर्व-बनाम वेतन वृद्धि / गिरावट के बारे में चिंता करने की आवश्यकता है, और इसे लिखने के लिए केवल एक और कीस्ट्रोक चाहिए x+=1। दूसरे शब्दों में, यह बहुत कम लाभ की कीमत पर संभावित भ्रम से बचा जाता है।


C में भी इन्टस अपरिवर्तनीय हैं। यदि आपको ऐसा नहीं लगता है, तो कोड उत्पन्न करने के लिए अपने सी कंपाइलर को प्राप्त करने का प्रयास करें 42++... कुछ इस तरह से (शाब्दिक स्थिरांक को संशोधित करना) वास्तव में कुछ पुराने फोरट्रान कंपाइलरों में संभव था (या इसलिए मैंने पढ़ा है): भविष्य के सभी उपयोग उस कार्यक्रम में उस शाब्दिक के बाद वास्तव में एक अलग मूल्य होगा। खुश डिबगिंग!
लुत्ज प्रेचल

10
सही। 42 एक शाब्दिक स्थिर है । लगातार (या कम से कम होना चाहिए) अपरिवर्तनीय हैं। इसका मतलब यह नहीं है कि intसामान्य रूप से सी एस अपरिवर्तनीय हैं। एक intसी में बस स्मृति में एक जगह निर्दिष्ट करता है। और उस जगह पर बिट्स बहुत अधिक परस्पर हैं। उदाहरण के लिए, आप एक संदर्भ बना सकते हैं intऔर उस संदर्भ के संदर्भ को बदल सकते हैं। यह परिवर्तन intउस स्थान पर सभी संदर्भों (मूल चर सहित ) में दिखाई देता है। वही पायथन पूर्णांक ऑब्जेक्ट के लिए धारण नहीं करता है।
नाथन डेविस

x + = 1 अंत में मेम बनने से समाप्त नहीं होता है। पायथन एक चर में 1 जोड़ने के लिए एक फ़ंक्शन कॉल निष्पादित करता है; यह दयनीय है।
पैलाडॉल्फिन

12

स्पष्टता!

पाइथन स्पष्टता के बारे में बहुत कुछ है और कोई भी प्रोग्रामर --aजब तक उस निर्माण को करने वाली भाषा नहीं सीख लेता , तब तक उसके अर्थ का सही अनुमान लगाने की संभावना नहीं है ।

पाइथन उन निर्माणों से बचने के बारे में भी है जो गलतियों को आमंत्रित करते हैं और ++ऑपरेटरों को दोषों के समृद्ध स्रोत के रूप में जाना जाता है। पायथन में उन ऑपरेटरों के नहीं होने के लिए ये दो कारण पर्याप्त हैं।

पायथन जो निर्णय सिंटैक्टिकल माध्यमों के बजाय ब्लॉक को चिह्नित करने के लिए इंडेंटेशन का उपयोग करता है जैसे कि शुरुआत के कुछ रूप / अंत ब्रैकेटिंग या अनिवार्य एंड मार्किंग एक ही विचार पर काफी हद तक आधारित है।

दृष्टांत के लिए, 2005 में पायथन में एक सशर्त ऑपरेटर (सी: में cond ? resultif : resultelse) को शुरू करने के बारे में चर्चा पर एक नज़र डालें । कम से कम पहला संदेश और उस चर्चा का निर्णय संदेश पढ़ें (जिसमें पहले एक ही विषय पर कई अग्रदूत थे)।

सामान्य ज्ञान: अक्सर उल्लिखित PEP "पायथन एक्सटेंशन प्रस्ताव" PEP 308 है । नियंत्रण रेखा का मतलब सूची की समझ है , जीई का अर्थ है जनरेटर अभिव्यक्ति (और चिंता न करें यदि वे आपको भ्रमित करते हैं, तो वे पायथन के कुछ जटिल स्थानों में से कोई नहीं हैं)।


10

अजगर के पास ++ऑपरेटर क्यों नहीं है, इसकी मेरी समझ निम्नलिखित है: जब आप अजगर में इसे लिखते हैं तो आपको 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 है। बेहतर समझ के लिए कि अजगर चर कैसे काम करता है:

पायथन में, एक फ़ंक्शन कॉलर द्वारा कथित कुछ तर्कों को संशोधित कर सकता है, लेकिन दूसरों को नहीं?

क्या पायथन कॉल-बाय-वैल्यू या कॉल-बाय-रेफरेंस है? न तो।

क्या पायथन मूल्य से, या संदर्भ से गुजरता है?

पायथन पास-दर-संदर्भ है या पास-बाय-वैल्यू है?

अजगर: मैं संदर्भ से एक चर कैसे पार करूं?

पायथन चरों और मेमोरी मैनेजमेंट को समझना

अजगर में पास-दर-मूल्य व्यवहार का अनुकरण करना

पायथन फ़ंक्शन संदर्भ द्वारा कॉल करता है

एक अजगर की तरह कोड: मुहावरेदार पायथन


9

यह सिर्फ उस तरह से डिज़ाइन किया गया था। इन्क्रीमेंट और डीकरेक्शन ऑपरेटर के लिए शॉर्टकट हैं x = x + 1। पायथन ने आमतौर पर एक डिजाइन रणनीति अपनाई है जो ऑपरेशन करने के वैकल्पिक साधनों की संख्या को कम करती है। संवर्धित असाइनमेंट पायथन में संचालकों / वेतन वृद्धि संचालकों के लिए निकटतम चीज है, और उन्हें पायथन 2.0 तक जोड़ा नहीं गया था।


3
हाँ दोस्त, जैसे, आप के return a[i++]साथ बदल सकता है return a[i=i+1]
लुइस डी सूसा

7

मैं अजगर के लिए बहुत नया हूं, लेकिन मुझे संदेह है कि इसका कारण भाषा के भीतर उत्परिवर्तनीय और अपरिवर्तनीय वस्तुओं के बीच जोर है। अब, मुझे पता है कि एक्स ++ आसानी से के रूप में एक्स = x + 1 व्याख्या की जा सकती है, लेकिन ऐसा लगता है कि आप incrementing रहे हैं यथा-स्थान एक वस्तु जो अपरिवर्तनीय हो सकता है।

बस मेरा अनुमान / एहसास / कूबड़।


इस पहलू में, x++की x += 1तुलना में करीब है x = x + 1, इन दोनों के साथ-साथ उत्परिवर्तनीय वस्तुओं पर फर्क पड़ता है।
glglgl

4

पहले, पायथन केवल अप्रत्यक्ष रूप से C से प्रभावित होता है; यह एबीसी से बहुत अधिक प्रभावित है , जो जाहिर तौर पर इन ऑपरेटरों के पास नहीं है , इसलिए इसे पायनियर में भी नहीं ढूंढना कोई बड़ी बात नहीं होनी चाहिए।

दूसरी बात यह है के रूप में अन्य लोगों ने कहा, वेतन वृद्धि और घटती द्वारा समर्थित हैं +=और -=पहले से ही।

तीसरा, एक ++और --ऑपरेटर सेट के लिए पूर्ण समर्थन में आमतौर पर उपसर्ग और उपसर्ग दोनों के संस्करणों का समर्थन करना शामिल है। सी और सी ++ में, यह सभी प्रकार के "प्यारे" निर्माणों को जन्म दे सकता है जो (मुझे) लगता है कि सादगी और सीधे-आगे की भावना के खिलाफ होना चाहिए जो पायथन को गले लगाता है।

उदाहरण के लिए, जबकि सी बयान while(*t++ = *s++);एक अनुभवी प्रोग्रामर को सरल और सुरुचिपूर्ण लग सकता है, किसी को इसे सीखने के लिए, यह कुछ भी है लेकिन सरल है। उपसर्ग और उपसर्ग में वृद्धि और क्षय के मिश्रण में फेंक दें, और यहां तक ​​कि कई पेशेवरों को थोड़ा रुकना और सोचना होगा।


3

मेरा मानना ​​है कि यह पायथन पंथ से उपजा है कि "स्पष्ट रूप से निहित से बेहतर है"।


ठीक है, आप स्पष्ट रूप से पायथन में, "शुरू" और "अंत" बयान नहीं लिखते हैं, है ना? हालांकि मैं इस कथन से सहमत हूं, मुझे लगता है कि इसकी सीमाएँ हैं। जबकि हम उस सीमाओं पर बहस कर सकते हैं, मुझे लगता है कि हम सभी सहमत हो सकते हैं, कि एक रेखा है, जिसे पार करना अव्यावहारिक है। और जब से उस निर्णय पर इतने सारे मत और औचित्य हैं, मुझे नहीं लगता कि यह एक स्पष्ट विकल्प था। कम से कम, मुझे एक स्रोत नहीं मिल रहा है, जहां यह स्पष्ट रूप से कहा गया है
हसन अम्मोरी

3

ऐसा इसलिए हो सकता है क्योंकि @GlennMaynard अन्य भाषाओं की तुलना में मामले को देख रहा है, लेकिन पायथन में, आप चीजों को अजगर की तरह करते हैं। यह एक 'क्यों' सवाल नहीं है। यह वहां है और आप चीजों को उसी प्रभाव के साथ कर सकते हैं x+=। में अजगर के ज़ेन , यह दिया जाता है: "वहाँ केवल एक समस्या को हल करने का एक तरीका होना चाहिए।" कला में कई विकल्प महान हैं (अभिव्यक्ति की स्वतंत्रता) लेकिन इंजीनियरिंग में घटिया।


2

++संचालकों का वर्ग साइड इफेक्ट के साथ अभिव्यक्ति है। यह कुछ ऐसा है जो आमतौर पर पायथन में नहीं पाया जाता है।

उसी कारण से पायथन में एक असाइनमेंट एक अभिव्यक्ति नहीं है, इस प्रकार सामान्य if (a = f(...)) { /* using a here */ }मुहावरे को रोकना है ।

अंत में मुझे संदेह है कि ऑपरेटर पायथन संदर्भ शब्दार्थ के अनुरूप नहीं हैं। याद रखें, पायथन में सी / सी ++ से ज्ञात शब्दार्थ के साथ चर (या संकेत) नहीं हैं।


1
एक परीक्षण / अभिव्यक्ति / सूची समझ में एक पक्ष-प्रभाव के साथ एक फ़ंक्शन को कॉल करने से कुछ भी नहीं रोकता है: f(a)जहां aएक सूची है, कुछ अपरिवर्तनीय वस्तु।
जीन फ़्राँस्वा Fabre

1

हो सकता है कि एक बेहतर सवाल यह पूछा जाए कि ये ऑपरेटर सी। के। एंड आर कॉल इंक्रीमेंट और डिक्रीमेंट ऑपरेटरों को 'असामान्य' क्यों कहते हैं (धारा 2.8 पृष्ठ 46)। परिचय उन्हें 'अधिक संक्षिप्त और अक्सर अधिक कुशल' कहता है। मुझे संदेह है कि ये ऑपरेशन हमेशा पॉइंटर हेरफेर में सामने आते हैं, इसने भी उनके परिचय में एक भूमिका निभाई है। पायथन में यह शायद तय किया गया है कि वेतन वृद्धि को अनुकूलित करने की कोशिश करने का कोई मतलब नहीं था (वास्तव में मैंने अभी सी में एक परीक्षण किया था, और ऐसा लगता है कि जीसीसी द्वारा उत्पन्न विधानसभा दोनों मामलों में झुकाव के बजाय ऐडल का उपयोग करता है) और कोई नहीं है सूचक अंकगणित; इसलिए यह सिर्फ एक और तरीका है इसे करने के लिए और हम पायथन लोथ्स को जानते हैं।


1

जैसा कि मैंने इसे समझा, इसलिए आपको नहीं लगेगा कि स्मृति में मूल्य बदल गया है। c में जब आप x ++ करते हैं तो मेमोरी में x का मान बदल जाता है। लेकिन अजगर में सभी संख्याएं अपरिवर्तनीय होती हैं, इसलिए पता कि x अभी भी x x 1 नहीं है। जब आप x ++ लिखते हैं, तो आपको लगता है कि x परिवर्तन वास्तव में क्या होता है, x refrence को मेमोरी में किसी स्थान पर बदल दिया जाता है, जहां x + 1 संग्रहीत होता है या इस स्थान को फिर से बनाता है यदि doe's मौजूद नहीं है।


1
तो क्या यह ++और से अलग बनाता है += 1?
बेर

1

उस पृष्ठ पर पहले से ही अच्छे उत्तरों को पूरा करने के लिए:

मान लीजिए कि हम ऐसा करने का फैसला करते हैं, उपसर्ग (++i ) जो कि + और - ऑपरेटरों को तोड़ देगा।

आज, उपसर्ग ++या --कुछ भी नहीं करता है, क्योंकि यह दो बार (और कुछ नहीं) या दो बार (शून्य: खुद को रद्द करता है) के बिना संयुक्त ऑपरेटर को सक्षम करता है।

>>> i=12
>>> ++i
12
>>> --i
12

ताकि संभावित रूप से उस तर्क को तोड़ा जा सके।


1

अन्य उत्तरों ने वर्णन किया है कि पुनरावृत्तियों के लिए इसकी आवश्यकता क्यों नहीं है, लेकिन कभी-कभी यह उपयोगी होता है जब एक चर-इन-लाइन को बढ़ाने के लिए असाइन किया जाता है, तो आप ट्यूपल्स और कई असाइनमेंट का उपयोग करके समान प्रभाव प्राप्त कर सकते हैं:

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
: = असाइनमेंट एक अपमान है
nehem

0

मुझे लगता है कि यह वस्तुओं की परस्परता और अपरिवर्तनीयता की अवधारणाओं से संबंधित है। अजगर में 2,3,4,5 अपरिवर्तनीय हैं। नीचे दी गई छवि को देखें। 2 इस अजगर प्रक्रिया तक आईडी तय की है।

स्थिरांक और चर की आईडी

x ++ का मतलब अनिवार्य रूप से C. की तरह इन-प्लेस इंक्रीमेंट होगा। C ++ में, x ++ इन-प्लेस इंक्रीमेंट करता है। तो, x = 3, और x ++ स्मृति में 3 से 4 तक वृद्धि करेगा, अजगर के विपरीत जहां 3 अभी भी स्मृति में मौजूद होगा।

इस प्रकार अजगर में, आपको स्मृति में एक मूल्य को फिर से बनाने की आवश्यकता नहीं है। इससे प्रदर्शन अनुकूलन हो सकते हैं।

यह एक कूबड़ आधारित उत्तर है।


0

मुझे पता है कि यह एक पुराना धागा है, लेकिन ++ 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()) :
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.