2012-01-21 16 views
12

संभव डुप्लिकेट:
Python Ternary Operatorपायथन (बूल)? फिर: सिंटैक्स?

जावा, C/C++, सी #, आदि आप एक इनलाइन बूलियन अभिव्यक्ति का परिणाम के आधार पर एक मूल्य प्रदान कर सकते हैं सहित कुछ भाषाओं में।

उदाहरण के लिए

,

return (i < x) ? i : x 

यह मैं वापस आ जाएगी अगर मैं < एक्स, अन्यथा यह वापस आ जाएगी एक्स। मुझे यह पसंद है क्योंकि यह लंबे समय तक सिंटैक्स की तुलना में कई मामलों में अधिक कॉम्पैक्ट है।

if (i < x) 
    return i 
else 
    return x 

क्या इस वाक्यविन्यास का उपयोग अजगर में करना संभव है और यदि हां, तो कैसे?

उत्तर

10

आप उपयोग कर सकते हैं (x if cond else y), उदा

>>> x = 0 
>>> y = 1 
>>> print("a" if x < y else "b") 
a 

यह काम करेगा lambda function भी।

3

हाँ, यह इस तरह दिखता है:

return i if i < x else x 

यह अजगर में सशर्त ऑपरेटर कहा जाता है।

2

अजगर में इस प्रयास करें:

return i if i < x else x 

यह बिल्कुल जावा, सी, सी ++ सी # में निम्नलिखित अभिव्यक्ति के बराबर

return i < x ? i : x; 

पायथन के conditional expressions बारे में अधिक पढ़ें है।

2

पायथन में टर्नरी ऑपरेटर। ग

एक अगर ख बाकी

>>> a=1 
>>> b=2 
>>> a if a<b else b 
1 
>>> a if a>b else b 
2 
2

a if b else c सिंटैक्स पाइथन 2.5 में पेश किया गया था। अधिकांश लोगों को पहले से ही हाल के संस्करण में अपग्रेड किया है लेकिन विरासत कोड में आप एक और दृष्टिकोण मिल सकता है: क्या तुमने कभी उपयोग करेंगे, तो इस वाक्य याद रखें कि a झूठी तक आकलन नहीं करना चाहिए

some_var = a<b and a or c 

+1

मुझे लगता है कि इसे पेश किया गया था 2.7 से पहले (क्या यह 2.5 था?)। यह 2.6 में निश्चित रूप से काम करता है लेकिन यह 2.4 में काम नहीं करता है। किसी भी तरह, +1। –

+0

आप सही हैं - वह 2.5 संस्करण था। सुधार के लिए धन्यवाद। – real4x

2

अन्य उत्तर राज्य के रूप में, इस के लिए अजगर का संस्करण है:

i if i < x else x

(इस विशिष्ट उदाहरण के लिए निश्चित रूप से, एक min(i, x) लेखन, पसंद करेंगे के रूप में यह आंखों पर आसान है)

हालांकि, यह अभिव्यक्ति वाक्यविन्यास सिर्फ पायथन 2 पर उपलब्ध कराया गया था।5 (मुझे लगता है कि यह लगभग 2004 था)। इससे पहले, निम्नलिखित मुहावरे का उपयोग किया गया था - लेकिन देखभाल की जानी चाहिए, क्योंकि यह त्रुटि प्रवण है:

i < x and i or x - क्योंकि तार्किक ऑपरेटर "और" वास्तव में इसकी श्रृंखला पर अंतिम वास्तविक मूल्य का मूल्यांकन करता है - इसलिए, अगर अभिव्यक्ति सच था, i < x and ii का मूल्यांकन करता है - और or ऑपरेटर श्रृंखला पर पहले वास्तविक मूल्य का मूल्यांकन करता है। इस मामले पर, यदि i < x गलत होगा, तो i< x and i होगा और पहला वास्तविक मान x होगा।

यह देखना आसान है कि इस निर्माण में त्रुटि कितनी त्रुटि थी, क्योंकि i का बूलियन मान गलत होगा (उदाहरण के लिए यदि मैं == 0), तो यह x वापस लौटाएगा, भले ही i < x सत्य हो।

मैं अपने आप को, उन दिनों में वापस, इस संरचना के बजाय लिखने के लिए प्रयोग किया है:

(एक्स, मैं) [मैं < x]

अभिव्यक्ति "मैं < एक्स" हा "का एक संख्यात्मक मूल्य 1 "(सत्य) या" 0 "(झूठा) और मैंने इस प्रक्षेपण का उपयोग पिछले टुपल को इंडेक्स के रूप में करने के लिए किया था। इस दृष्टिकोण के साथ समस्या यह थी कि यह हमेशा ट्यूपल पर दोनों अभिव्यक्तियों का मूल्यांकन करेगा, भले ही वह उस पर से किसी एक का उपयोग करेगा (यदि अभिव्यक्ति कहां काम करती है तो यह महंगी हो सकती है, या यहां तक ​​कि विरोधाभासी भी हो सकती है)

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