2011-01-24 22 views
10

मुझे इसके अर्थ या परिभाषा के बारे में कुछ भ्रम है।पायथन में एक अभिव्यक्ति क्या है?

क्या ऐसा कुछ कोड नहीं है जो नए डेटा मानों का उत्पादन या गणना करता है? (ज़ेल ने अपनी पुस्तक में कहा)

तब मुझे आश्चर्य है कि एक स्ट्रिंग डेटा प्रकार एक अभिव्यक्ति है या नहीं।

यदि यह है, तो eval() क्या करता है जब इसकी तर्क एक स्ट्रिंग है?

ज़ेले की पुस्तक eval(<string>) एक अभिव्यक्ति के रूप में string का मूल्यांकन करती है, इसका क्या अर्थ है string पहले से ही एक अभिव्यक्ति है?

और यदि string अभिव्यक्ति नहीं है, तो यह print के बाद कैसे हो सकता है?

+1

संबंधित (लेकिन ** नहीं ** एक सटीक डुप्लिकेट):: यहाँ एक ब्रेक बयान है [क्या एक अभिव्यक्ति है और एक वक्तव्य के बीच का अंतर है?] (Http://stackoverflow.com/questions/4728073/ पायथन-क्या-अंतर-अंतर-बीच-अभिव्यक्ति-और-एक-कथन) –

उत्तर

17

अभिव्यक्ति कुछ, जैसे किसी संख्या, एक स्ट्रिंग या कक्षा के उदाहरण का प्रतिनिधित्व करते हैं। कोई भी मूल्य एक अभिव्यक्ति है!

कुछ भी कुछ एक कथन है। एक चर या फंक्शन कॉल के लिए कोई असाइनमेंट एक बयान है। अभिव्यक्ति में उस कथन में निहित कोई भी मूल्य।

foo = "hello" एक ऐसा बयान है जो "हैलो" अभिव्यक्ति के मूल्य को foo असाइन करता है। चूंकि कोड "hello" एक साधारण अभिव्यक्ति है, जिसका अर्थ है कि इसमें कोई संचालन नहीं है, वास्तव में कुछ भी मूल्यांकन नहीं किया जाता है, इसलिए foo को केवल "hello पर असाइन किया गया है। "अधिक जटिल अभिव्यक्ति वास्तव में चीजों का मूल्यांकन करने की तरह चीजों का मूल्यांकन करती हैं। शब्द अभिव्यक्ति का उपयोग करना ऐसा लगता है जैसे यह चीजें बना रहा है भ्रामक। भाव लेकिन मूल्यों में कुछ भी नहीं कर रहे हैं, सिवाय इसके कि वे इसके अलावा या घटाव जैसे कार्य हो सकता है।

eval स्ट्रिंग का मूल्यांकन करता है जैसे कि यह एक अजगर अभिव्यक्ति थे। Eval एक तर्क के रूप एक अभिव्यक्ति लेता है। हालांकि, वहाँ कुछ खास नहीं के बारे में है यह के बाद से प्रत्येक एकल मान अभिव्यक्ति है। "eval एक तर्क के रूप में मान लेता है" कह रहा है, लेकिन यह बहुत आसान लगता है।: डी

eval("2+2") फ़ंक्शन में स्ट्रिंग "2+2" पास करता है। समारोह अभिव्यक्ति स्ट्रिंग में निहित है, जो 4.

Zelle द्वारा पुस्तक eval(<string>) अभिव्यक्ति के रूप में स्ट्रिंग का मूल्यांकन करता है का कहना है कि करने के लिए बाहर आता है मूल्यांकन करता है, कि वास्तव में क्या मतलब है यदि स्ट्रिंग पहले से ही एक अभिव्यक्ति है?

कोई स्ट्रिंग एक अभिव्यक्ति है क्योंकि यह एक मान का प्रतिनिधित्व करती है। हालांकि, स्ट्रिंग में क्या है इसका अभिव्यक्ति होने पर बिल्कुल कोई प्रभाव नहीं पड़ता है। यदि यह एक मूल्य है, तो यह एक अभिव्यक्ति है। जब इसे "eval द्वारा अभिव्यक्ति के रूप में मूल्यांकन किया जाता है", स्ट्रिंग के अंदर के वर्ण निष्पादित किए जाते हैं जैसे कि वे एक अजगर अभिव्यक्ति थे।

+2

अच्छा स्पष्टीकरण, सिवाय इसके कि आप 'eval' कथन नहीं कर सकते हैं: पायथन 2.x में 'eval (" हैलो प्रिंट करें ") का प्रयास करें। –

+6

एक फ़ंक्शन कॉल पायथन में एक अभिव्यक्ति है। कोई अभिव्यक्ति भी एक कथन है - एक "अभिव्यक्ति कथन"। मैंने ऊपर दिए गए संबंधित प्रश्न का लिंक भी देखें। –

+0

@ सेवन मैं सादगी के लिए अभिव्यक्ति की एक अलग परिभाषा का उपयोग कर रहा हूं। मुझे लगता है कि उस जानकारी को छोड़कर अतिरिक्त जटिलता से बचने के लिए विशेष रूप से अभिव्यक्तियों के रूप में बयानों का व्यापक रूप से उपयोग नहीं किया जाता है। : डी –

1

स्ट्रिंग एक अभिव्यक्ति है। एक अभिव्यक्ति कुछ भी है जिसका "मूल्य" होता है। 3 की तरह, 'हैलो वर्ल्ड', 1 + 1, math.sqrt (9), आदि फ़ंक्शन नाम भी अभिव्यक्ति हैं।

eval() आपको एक अभिव्यक्ति का मूल्य देता है जिसे आप इसे स्ट्रिंग के रूप में देते हैं। यदि आप eval ('1 + 1') कहते हैं तो यह 2 लौटाता है। तो यह वही देता है जो वापस लौटाया जाएगा यदि आप बस लिखते हैं: 1 + 1।

+1

इसके अतिरिक्त: प्रत्येक विधि/फ़ंक्शन जो मान देता है वह एक अभिव्यक्ति के रूप में भी गिना जाता है। तो उदाहरण के लिए खुद को eval एक अभिव्यक्ति है। – poke

+0

@ पोक: यह भ्रामक है। _Every_ विधि/फ़ंक्शन एक मान देता है। यदि आप स्पष्ट रूप से कुछ भी वापस नहीं लौटते हैं, तो यह निश्चित रूप से 'कोई नहीं' लौटाता है। (निश्चित रूप से, एक विशेष फ़ंक्शन कॉल, 'sys.exit', एक अनंत लूप में हमेशा के लिए स्पिन, आदि लौटने की बजाय बढ़ा सकता है। लेकिन यह फ़ंक्शन कॉल अभिव्यक्ति को अभिव्यक्ति नहीं देता है, जो कि ' 1/0'।) – abarnert

+0

@abarnert अब कहना है कि मेरा मतलब क्या था, लेकिन मुझे लगता है कि मेरा मतलब है कि उन सभी चीजों को अभिव्यक्ति के रूप में भी गिनना है, न केवल मानक स्थिर वाले जो कुछ बुनियादी ऑपरेटर के बीच में हैं। – poke

2

एक बार आप कैसे अजगर की अपनी लिपि पार्सर काम करता है के बारे में सोच से दूर होने "अभिव्यक्ति" एक थोड़ा भ्रामक शब्द हो सकता है। standard documentation अभिव्यक्तियों और "परमाणुओं" के बीच एक अंतर बनाता है, लेकिन मुझे लगता है कि इसकी शब्दावली बहुत प्रतिबंधित है (5.11 पर बीएनएफ आरेख का तात्पर्य है कि कुछ अभिव्यक्ति होने के लिए या तो लैम्ब्डा फॉर्म या सशर्त अभिव्यक्ति हो, मुझे लगता है। मेरे BNF जंग लगी है।)

परमाणुओं, दूसरे हाथ पर, कवर करने के लिए के रूप में @kynnysmatto कहते हैं, 'कुछ भी "एक मूल्य" है कि' लगते हैं। शायद "कुछ भी जिसे संश्लेषित किया जा सकता है, और फिर कोष्ठक के बाहर से इसके इसी मूल्य से अलग नहीं है" एक परमाणु की बेहतर परिभाषा हो सकती है।

जब Zelle उदा के संदर्भ में भाव की चर्चा eval (foo), मुझे लगता है कि वह अर्थ है:

  • foo एक पहचानकर्ता है, जो परमाणु
  • का एक प्रकार है, लेकिन foo कुछ
  • इस "कुछ" के एक पहचानकर्ता है स्ट्रिंग की तरह है , शायद एक वास्तविक स्ट्रिंग
  • eval() के आंतरिक के भीतर, यह स्ट्रिंग भी एक पाइथन "अभिव्यक्ति" का गठन करती है - यानी, कुछ पाइथन पार्स कर सकते हैं और समझ सकते हैं।

टीएल; डॉ: टर्मिनोलॉजी के रूप में "अभिव्यक्ति" कोड पार्सिंग के मामले में सबसे अच्छी तरह से समझा जा सकता है; जब आप स्वयं प्रोग्राम करते हैं, तो आपको "परमाणुओं" के संदर्भ में सोचना बेहतर लगेगा।

2

टी एल; डॉ: अभिव्यक्ति मूल्यों और ऑपरेटरों के संयोजन कर रहे हैं और हमेशा एक ही मूल्य के लिए नीचे का मूल्यांकन। एक बयान हर दूसरे निर्देश है। कुछ बयान में अभिव्यक्तियां होती हैं।

एक अभिव्यक्ति एक निर्देश है कि और हमेशा एक ही मूल्य करने के लिए नीचे का मूल्यांकन करता है मूल्यों और ऑपरेटरों को जोड़ती है।

>>> 2 + 2 

2s पूर्णांक मूल्यों कर रहे हैं और + गणितीय ऑपरेटर है:

उदाहरण के लिए, इस एक अभिव्यक्ति है। यह अभिव्यक्ति एक पूर्णांक मान 4.

तकनीकी तौर पर करने के लिए नीचे का मूल्यांकन करता है, यह भी एक अभिव्यक्ति है:

>>> 4 

एक अभिव्यक्ति के रूप में, यह एकल मान 4.

जब मैं कहता हूँ के लिए नीचे का मूल्यांकन करता है मूल्यों और ऑपरेटरों, इस गणित की समस्याओं तक सीमित नहीं है:

>>> 'You will be ' + str(int(myAge) + 1) + ' next year.' 

myAge चर इसके अंदर मूल्य के लिए मूल्यांकन करता है। फंक्शन कॉल int('5') फ़ंक्शन के रिटर्न वैल्यू का मूल्यांकन करता है, 5। इन सभी स्ट्रिंग मानों को + ऑपरेटर के साथ जोड़ा जाता है (इस मामले में, यह स्ट्रिंग कॉन्सटेनेशन ऑपरेटर है)।कोई फर्क नहीं पड़ता कितना बड़ा एक अभिव्यक्ति है, यह एक एकल मूल्य के लिए नीचे का मूल्यांकन करता है: इस मामले में, स्ट्रिंग मान 'You will be 6 next year.'

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

>>> spam = 2 + 2 

यहाँ एक अगर बयान है::

>>> if spam == 4: 

यहाँ एक अनंत लूप के लिए थोड़ी देर के बयान है:

>>> while True: 

ध्यान दें कि इन बयानों से दोनों भाव होते हैं यहाँ एक असाइनमेंट बयान है (यहां तक ​​कि True, जो एकल मान True पर मूल्यांकन करता है)। लेकिन सभी बयान उन में अभिव्यक्तियों का उपयोग नहीं करते हैं।

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