2015-12-16 5 views
5

मुझे सी, सी ++, जावा और सी #, (C# example) जैसी भाषाओं में पता है else if कथन वाक्य रचनात्मक चीनी है, जिसमें वास्तव में यह केवल else कथन है जिसके बाद if कथन है।क्या अजगर "एलिफ" अलग से संकलित है: यदि?

else if (conition(s)) { ... 

हालांकि, अजगर में, वहाँ एक विशेष elif बयान है

else { 
    if (condition(s)) { ... 
} 

के बराबर है। मैं सोच रहा हूं कि क्या यह डेवलपर्स के लिए सिर्फ लघुरूप है या यदि कुछ छिपी हुई ऑप्टिमाइज़ेशन पाइथन इस वजह से कर सकती है, जैसे कि तेजी से व्याख्या की जा सकती है? लेकिन यह मुझे समझ में नहीं आता है, क्योंकि अन्य भाषाएं भी ऐसा कर रही हैं (जैसे जावास्क्रिप्ट)। तो, मेरा सवाल यह है कि, पाइथन में elif कथन डेवलपर्स के उपयोग के लिए सिर्फ शॉर्टेंड है या क्या ऐसा कुछ छिपा हुआ है जो इसे करने के माध्यम से प्राप्त होता है?

+4

के लिए बस वाक्यात्मक चीनी है 'बाकी if' भी वाक्यात्मक चीनी (कम से कम C++) नहीं है। यह वास्तविक नंगे वाक्यविन्यास है, चीनी लेपित नहीं है। जिस तरह से हम इसे लिखना चुनते हैं, वैसे ही यह थोड़ा भ्रामक है। – chris

उत्तर

11

जब आप वास्तव में जानना चाहते हैं कि दुभाषिया में दृश्यों के पीछे क्या चल रहा है, तो आप dis मॉड्यूल का उपयोग कर सकते हैं। इस मामले में:

>>> def f1(): 
... if a: 
...  b = 1 
... elif aa: 
...  b = 2 
... 
>>> def f2(): 
... if a: 
...  b = 1 
... else: 
...  if aa: 
...  b = 2 
... 
>>> dis.dis(f1) 
    2   0 LOAD_GLOBAL    0 (a) 
       3 POP_JUMP_IF_FALSE  15 

    3   6 LOAD_CONST    1 (1) 
       9 STORE_FAST    0 (b) 
      12 JUMP_FORWARD   15 (to 30) 

    4  >> 15 LOAD_GLOBAL    1 (aa) 
      18 POP_JUMP_IF_FALSE  30 

    5   21 LOAD_CONST    2 (2) 
      24 STORE_FAST    0 (b) 
      27 JUMP_FORWARD    0 (to 30) 
     >> 30 LOAD_CONST    0 (None) 
      33 RETURN_VALUE   
>>> dis.dis(f2) 
    2   0 LOAD_GLOBAL    0 (a) 
       3 POP_JUMP_IF_FALSE  15 

    3   6 LOAD_CONST    1 (1) 
       9 STORE_FAST    0 (b) 
      12 JUMP_FORWARD   15 (to 30) 

    5  >> 15 LOAD_GLOBAL    1 (aa) 
      18 POP_JUMP_IF_FALSE  30 

    6   21 LOAD_CONST    2 (2) 
      24 STORE_FAST    0 (b) 
      27 JUMP_FORWARD    0 (to 30) 
     >> 30 LOAD_CONST    0 (None) 
      33 RETURN_VALUE   

ऐसा लगता है कि हमारे दो कार्यों की तरह एक ही बाईटकोड उपयोग कर रहे हैं - तो जाहिरा तौर पर वे बराबर कर रहे हैं।

सावधान हालांकि, बाईटकोड CPython के एक कार्यान्वयन विस्तार है - वहाँ कोई कह रहा है कि सभी अजगर कार्यान्वयन पर्दे के पीछे एक ही बात करते हैं - सभी कि मायने रखती है कि वे एक ही व्यवहार होता है। तर्क के माध्यम से काम करते हुए, आप स्वयं को यह समझ सकते हैं कि f1 और f2 को यह भी ध्यान रखना चाहिए कि अंतर्निहित कार्यान्वयन इसे "सिंथेटिक चीनी" के रूप में मानता है या यदि कुछ और परिष्कृत चल रहा है।

+0

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

+0

@Zequ - हाँ, यह समझने के लिए वास्तव में अच्छा है कि दुभाषिया क्या कर रहा है। मैंने इसे कभी भी एक स्क्रिप्ट में उपयोग नहीं किया है - केवल खिलौनों की समस्याओं के लिए यह पता लगाने के लिए कि पाइथन कैसे काम करता है।प्रदर्शन के लिए एक और उपयोगी मॉड्यूल 'टाइमिट' है - कुछ भी धीमा नहीं है जब तक आप इसे वास्तव में मापते हैं ;-)। – mgilson

+0

हाँ, मैंने ऐसा किया है, जहां प्रोग्राम की बाधा आप अनुकूलित करने के मुकाबले एक पूरी तरह से अलग हिस्सा बन जाती है। 'टाइमिट 'उपयोगी होगा: डी – hargasinski

1

elif पायथन में else if के लिए कई अन्य भाषाओं में सिंटेक्टिक चीनी है। बस इतना ही।

+0

धन्यवाद, मैं बस पुष्टि करना चाहता था कि मेरा अनुमान सही था – hargasinski

3

कीवर्ड 'elif' 'else if' के लिए छोटा है, और अत्यधिक इंडेंटेशन से बचने के लिए उपयोगी है। Source

+0

मैंने उस पृष्ठ पर स्किम किया, 'elif' के बारे में बयान नहीं देखा। इसे इंगित करने के लिए धन्यवाद! – hargasinski

1

तीन निम्नलिखित कोड स्निपेट सभी एक ही तर्क का उपयोग करके निष्पादित करेंगे, हालांकि सभी अलग-अलग वाक्यविन्यास का उपयोग करते हैं।

elif condition: ... 
else if conition { ... 
else { 
    if conition { ... 
} 

पायथन के elif आम else if बयान

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