2012-04-04 5 views
6

अजगर 3.2 में, इस के अनुसार: http://docs.python.org/py3k/reference/expressions.html#summaryपायथन 3.2 में, "लैम्ब्डा" को "कीवर्ड", "ऑपरेटर" या दोनों माना जाता है?

lambda अजगर में सबसे कम पूर्वता के साथ ऑपरेटर है।

और इस के अनुसार: http://docs.python.org/py3k/reference/lexical_analysis.html#keywords

lambda एक अजगर भाषा कीवर्ड है।

हालांकि, इस के अनुसार: http://docs.python.org/py3k/reference/lexical_analysis.html#other-tokens

ऑपरेटरों और कीवर्ड्स अलग चीज़े हैं।

मैं किसी को पाइथन 3.2 को व्यवस्थित रूप से समझाने की कोशिश कर रहा हूं और मैं उन्हें भ्रमित नहीं करना चाहता हूं। मैं, खुद, उलझन में हूं, हालांकि, ऑपरेटरों और खोजशब्दों की सटीक परिभाषाओं पर।

मेरा सबसे अच्छा अनुमान यह है कि पाइथन लेसर बनाम पायथन पार्सर के संदर्भ में उपयोग किए जाने पर "ऑपरेटर" शब्द का अर्थ थोड़ा अलग होता है।

+0

मुझे पूरा यकीन है कि ऑपरेटर की बजाय 'लैम्ब्डा' शब्द को कॉल करना समझदारी है। – alberge

+1

@alberge आपका तर्क क्या है? – Paragon

+2

मैंने स्पष्ट रूप से मस्तिष्क से पहले उंगलियों को लगाया। कई पायथन कीवर्ड * ऑपरेटर हैं। वे ओवरलैपिंग सेट प्रतीत होते हैं। – alberge

उत्तर

2

lambda स्पष्ट रूप से एक कीवर्ड है; यह पार्सर द्वारा मान्यता प्राप्त एक विशेष शब्द है, जो अन्यथा identifier की परिभाषा में पड़ जाएगा।

lambdaअर्थात् एक ऑपरेटर नहीं है। एक ऑपरेटर सिर्फ एक समारोह है, लेकिन एक अलग वाक्यविन्यास के साथ बुलाया। हम + ऑपरेटर को add फ़ंक्शन के साथ बदलने की कल्पना कर सकते हैं; इसके अलावा हमारे सभी कार्यक्रमों को और अधिक verbose और पढ़ने के लिए कठिन हो जाएगा, लेकिन हम अभी भी उन्हें लिख सकते हैं। दूसरी ओर lambda भाषा निर्माण को फ़ंक्शन के साथ प्रतिस्थापित नहीं किया जा सका; lambda x: x+1 सिर्फ x और x+1 मानों के परिणाम की गणना नहीं कर रहा है, क्योंकि इस संदर्भ में वे सभी मान नहीं हैं (x परिभाषित किए गए फ़ंक्शन के पैरामीटर का नाम है, और x+1 लैम्ब्डा बॉडी का कोड है)।

एक ही पृष्ठ में आप हम से लिंक किया गया: http://docs.python.org/py3k/reference/lexical_analysis.html#operators

निम्नलिखित टोकन ऑपरेटरों हैं:

+  -  *  ** /  //  % 
<<  >>  &  |  ^  ~ 
<  >  <=  >=  ==  != 

ऑपरेटरों पर उपधारा की सारी सामग्री है कि। इससे मैं इसका मतलब यह लेता हूं कि भाषा "ऑपरेटरों" के टोकन को परिभाषित करने के संदर्भ में प्रतीकात्मक ऑपरेटरों हैं, जबकि कीवर्ड पर अनुभाग स्पष्ट रूप से वर्तनी कर रहा है कि "ये चीजें जो अन्यथा पहचानकर्ता होंगी वे कीवर्ड हैं"। यही कारण है कि मुझे लगता है कि not, is, in आदि जैसे कीवर्ड ऑपरेटर सूचीबद्ध नहीं हैं। लेकिन निश्चित रूप से ऐसी चीजें हैं जो अर्थात् ऑपरेटर हैं जो कीवर्ड हैं, चाहे पार्सर उन्हें अलग-अलग वर्ग मानते हों या नहीं।

मुझे यकीन नहीं है कि http://docs.python.org/py3k/reference/expressions.html#summarylambda एक ऑपरेटर के रूप में क्यों वर्णन करता है; मैं निश्चित रूप से नहीं करता। कड़ाई से बोलना यह स्पष्ट रूप से नहीं कहता है कि "lambda ऑपरेटर सबसे कम प्राथमिकता वाला ऑपरेटर है", यह केवल उस तालिका में lambda सूचीबद्ध करता है जिसका कॉलम शीर्षक "ऑपरेटर" होता है। शायद यह सिर्फ एक सुविधा थी; कम प्राथमिकता वाली चीज़ के रूप में lambda का वर्णन करना यह स्पष्ट करने का एक अच्छा तरीका है कि पाइथन lambda x: x + 1 कैसे पार्स करेगा (यह सैद्धांतिक रूप से (lambda x: x) + 1 या lambda x: (x + 1) हो सकता है)।

+0

सिर्फ इसलिए कि हम 'लैम्ब्डा' निर्माण को किसी भिन्न फ़ंक्शन के साथ प्रतिस्थापित नहीं कर सकते हैं, यह 'lambda' को फ़ंक्शन नहीं बनाता है। यह कुछ हद तक अनौपचारिक कार्य है (यदि आप पैरामीटर मैचर आउट लेते हैं) जो एक अभिव्यक्ति लेता है और एक फ़ंक्शन देता है। यह स्पष्ट रूप से एक ऑपरेटर है क्योंकि यह एक अभिव्यक्ति लेता है और एक अभिव्यक्ति देता है (प्रकार का कार्य)। – poke

+0

@poke नहीं यह एक फ़ंक्शन नहीं है, ठीक है क्योंकि इसे अभिव्यक्ति की आवश्यकता है। आप कार्यों में अभिव्यक्ति पास नहीं करते हैं, आप मान पास करते हैं। यदि आप 'लैम्ब्डा' को देखने का प्रयास करते हैं तो आप इसे "पास" नहीं करते हैं, तो आप इसे एक अभिव्यक्ति पास करते हैं (जिसे किसी अन्य प्रकार के फ़ंक्शन में "पास नहीं किया जा सकता")। अन्यथा अभिव्यक्ति को किसी नाम पर बांधना और इसके बजाय नाम पास करना मान्य होगा: 'x = fire_ze_missiles(); f = lambda: x' ** ** = ** f = lambda से अलग ** है: fire_ze_missiles() ', जबकि' x = fire_ze_missiles(); y = x + 1' 'y = fire_ze_missiles() + 1' के बराबर है। – Ben

+0

मैं सहमत हूं: 'लैम्ब्डा' ऑपरेटर की तरह "गंध नहीं" करता है। और जैसा कि आप ध्यान देते हैं कि प्राथमिकता सारणी केवल ऑपरेटरों के लिए नहीं हैं: वे वास्तव में मनुष्यों के लिए बाध्यकारी शक्तियों से निपटने का एक तरीका हैं जब अन्यथा एक अस्पष्ट पार्स होगा।अभिव्यक्ति-ऑपरेटरों से निपटने के दौरान हम केवल इस अस्पष्टता को देखने के लिए उपयोग किए जाते हैं। – torek

2

कहना नहीं है यही कारण है कि वे परस्पर अनन्य हैं, सिर्फ इतना है कि:

"टोकन के निम्नलिखित श्रेणियां मौजूद हैं: पहचानकर्ता, कीवर्ड, शाब्दिक, ऑपरेटर, और सीमांकक"

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

+0

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

+0

वे तीन सभी कथन विभाजक/मार्कर हैं। इंडेंट और डिंडेंन्ट का उपयोग यौगिक कथन (और फ़ंक्शन और क्लास निकाय) को चिह्नित करने के लिए किया जाता है, जबकि न्यूलाइन सरल कथन को अलग करता है। –

+0

मैं व्याकरण का अध्ययन कर रहा हूं; क्या आप इसके लिए आधिकारिक शब्द जानते हैं और क्या आप इसे उद्धृत कर सकते हैं? जिस दस्तावेज़ को मैं लिख रहा हूं - मैं चाहता हूं कि यह संभव हो तो केवल आधिकारिक शब्दकोष का उपयोग करें। –

4

ऑपरेटर और कीवर्ड विशिष्ट इकाइयां हैं।

नहीं वे नहीं हैं। is, in, and, or, not, और मुझे यकीन है कि कुछ और दोनों हैं।

+0

यह ऑपरेटरों के रूप में क्यों सूचीबद्ध नहीं है? इसका तात्पर्य है (अनौपचारिक रूप से) कि यह सभी टोकन सूचीबद्ध करता है जो ऑपरेटर हैं। वे स्पष्ट रूप से टोकन हैं, फिर भी सूची में नहीं हैं: http://docs.python.org/py3k/reference/lexical_analysis.html#operators –

+0

बस इसलिए कि वे पहले ही आरक्षित कीवर्ड की सूची में हैं। – poke

संबंधित मुद्दे