[Python] क्या पाइथन में एक टर्नरी सशर्त ऑपरेटर है?


Answers

आप एक टुपल में इंडेक्स कर सकते हैं:

(falseValue, trueValue)[test]

test को सच या गलत लौटने की जरूरत है।
हमेशा इसे लागू करने के लिए सुरक्षित हो सकता है:

(falseValue, trueValue)[test == True]

या आप एक Boolean मान को आश्वस्त करने के लिए अंतर्निर्मित bool() का उपयोग कर सकते हैं:

(falseValue, trueValue)[bool(<expression>)]
Question

यदि पाइथन में टर्नरी सशर्त ऑपरेटर नहीं है, तो क्या यह अन्य भाषा संरचनाओं का उपयोग करके अनुकरण करना संभव है?




अभिव्यक्ति 1 अगर स्थिति और अभिव्यक्ति 2

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



हाँ।

>>> b = (True if 5 > 4 else False)
>>> print b
True



जैसा कि अन्य उत्तरों में बताया गया है, वहां एक टर्नरी विकल्प है, लेकिन यदि आप बुलियन या किसी भी मूल्य के विरुद्ध जांच कर रहे हैं तो आप इसे "या" का उपयोग करके अनुकरण भी कर सकते हैं:

>>> a = False
>>> b = 5
>>> a or b
5

>>> a = None
>>> a or b
5



आपको अक्सर मिल सकता है

cond and on_true or on_false

लेकिन यह समस्या का कारण बनता है जब on_true == 0

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

जहां आप इस परिणाम के सामान्य टर्नरी ऑपरेटर की अपेक्षा करेंगे

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1



क्या पाइथन में एक टर्नरी सशर्त ऑपरेटर है?

हाँ। व्याकरण फ़ाइल से :

test: or_test ['if' or_test 'else' test] | lambdef

ब्याज का हिस्सा है:

or_test ['if' or_test 'else' test]

तो, एक टर्नरी सशर्त ऑपरेशन फॉर्म का है:

expression1 if expression2 else expression3

expression3 का आलसी मूल्यांकन किया जाएगा (यानी, केवल तभी मूल्यांकन किया जाता है जब expression2 एक बुलियन संदर्भ में गलत है)। और पुनरावर्ती परिभाषा के कारण, आप उन्हें अनिश्चित काल तक श्रृंखलाबद्ध कर सकते हैं (हालांकि इसे खराब शैली माना जा सकता है।)

expression1 if expression2 else expression3 if expression4 else expression5 # and so on

उपयोग पर एक नोट:

ध्यान दें कि प्रत्येक if किसी else साथ पालन किया जाना चाहिए। सूची समझने वाले जनरेटर और जेनरेटर एक्सप्रेशन सीखने वाले लोगों को यह सीखने के लिए एक कठिन सबक मिल सकता है - निम्नलिखित काम नहीं करेंगे, क्योंकि पाइथन किसी और के लिए तीसरी अभिव्यक्ति की अपेक्षा करता है:

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

जो एक SyntaxError: invalid syntax उठाता है SyntaxError: invalid syntax । तो उपरोक्त या तो तर्क का अधूरा टुकड़ा है (शायद उपयोगकर्ता झूठी स्थिति में नो-ऑप की अपेक्षा करता है) या अभिव्यक्ति 2 का उपयोग फिल्टर के रूप में करना है - नोट्स कि निम्नलिखित कानूनी पायथन है:

[expression1 for element in iterable if expression2]

expression2 सूची समझ के लिए फ़िल्टर के रूप में काम करता है, और एक टर्नरी सशर्त ऑपरेटर नहीं है।

एक अधिक संकीर्ण मामले के लिए वैकल्पिक वाक्यविन्यास:

आप इसे लिखने के लिए कुछ हद तक दर्दनाक पाते हैं:

expression1 if expression1 else expression2

expression1 को उपर्युक्त उपयोग के साथ दो बार मूल्यांकन करना होगा। यदि यह केवल स्थानीय चर है तो यह अनावश्यकता को सीमित कर सकता है। हालांकि, इस उपयोग-मामले के लिए एक आम और निष्पादक पायथनिक मुहावरे का उपयोग करना or शॉर्टकटिंग व्यवहार करना है:

expression1 or expression2

जो अर्थशास्त्र में बराबर है। ध्यान दें कि कुछ स्टाइल-मार्गदर्शिका इस उपयोग को स्पष्टता के आधार पर सीमित कर सकती हैं - यह बहुत कम वाक्यविन्यास में बहुत अधिक अर्थ पैक करती है।




पाइथन में एक सशर्त अभिव्यक्ति के लिए एक ऑपरेटर 2006 में पायथन एन्हांसमेंट प्रस्ताव 308 के हिस्से के रूप में जोड़ा गया था। इसका रूप आम से अलग है?: ऑपरेटर और यह है:

<expression1> if <condition> else <expression2>

जो बराबर है:

if <condition>: <expression1> else: <expression2>

यहाँ एक उदाहरण है:

result = x if a > b else y

एक और वाक्यविन्यास जिसका उपयोग किया जा सकता है (2.5 से पहले संस्करणों के साथ संगत):

result = (lambda:y, lambda:x)[a > b]()

जहां ऑपरेटरों का आलसी मूल्यांकन किया जाता है

एक और तरीका एक टुपल अनुक्रमणित करना है (जो अधिकांश अन्य भाषाओं के सशर्त ऑपरेटर के अनुरूप नहीं है):

result = (y, x)[a > b]

या स्पष्ट रूप से निर्मित शब्दकोश:

result = {True: x, False: y}[a > b]

एक और (कम भरोसेमंद), लेकिन उपयोग करने के लिए आसान तरीका है and और ऑपरेटरों:

result = (a > b) and x or y

हालांकि यह काम नहीं करेगा अगर x False होगा।

एक संभावित कामकाज x और y सूचियों या tuples को निम्न में बनाना है:

result = ((a > b) and [x] or [y])[0]

या:

result = ((a > b) and (x,) or (y,))[0]

यदि आप शब्दकोशों के साथ काम कर रहे हैं, तो टर्नरी सशर्त उपयोग करने के बजाय, आप get(key, default) के get(key, default) का लाभ उठा सकते हैं, उदाहरण के लिए:

shell = os.environ.get('SHELL', "/bin/sh")

स्रोत: ?:




एक उत्तर से अधिक टिप (हंडरथ समय के लिए स्पष्ट दोहराने की आवश्यकता नहीं है), लेकिन कभी-कभी मैं इसे इस तरह के संरचनाओं में ऑनलाइनर शॉर्टकट के रूप में उपयोग करता हूं:

if conditionX:
    print('yes')
else:
    print('nah')

, बन जाता है:

print('yes') if conditionX else print('nah')

कुछ (कई :) इसे अफीम के रूप में फहरा सकते हैं (यहां तक ​​कि, रूबी-आश :), लेकिन मुझे व्यक्तिगत रूप से यह अधिक प्राकृतिक लगता है - यानी आप इसे सामान्य रूप से कैसे व्यक्त करेंगे, साथ ही कोड के बड़े ब्लॉक में थोड़ा और अधिक आकर्षक रूप से आकर्षक होंगे।




पायथन 2.5 और नए के लिए एक विशिष्ट वाक्यविन्यास है:

[on_true] if [cond] else [on_false]

पुराने पायथन में एक टर्नरी ऑपरेटर लागू नहीं किया जाता है लेकिन इसे अनुकरण करना संभव है।

cond and on_true or on_false

हालांकि, एक संभावित समस्या है, जो यदि on_true मूल्यांकन करता है और on_true मूल्यांकन False तो on_false की बजाय वापस आ जाता है। यदि आप इस व्यवहार को चाहते हैं तो विधि ठीक है, अन्यथा इसका उपयोग करें:

{True: on_true, False: on_false}[cond is True] # is True, not == True

जिसे द्वारा लिपटा जा सकता है:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

और इस तरह इस्तेमाल किया:

q(cond, on_true, on_false)

यह सभी पायथन संस्करणों के साथ संगत है।




In [1]: a = 1 if False else 0

In [2]: a
Out[2]: 0

In [3]: b = 1 if True else 0

In [4]: b
Out[4]: 1



Links