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





11 Answers

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

(falseValue, trueValue)[test]

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

(falseValue, trueValue)[test == True]

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

(falseValue, trueValue)[bool(<expression>)]
python operators ternary-operator conditional-operator python-2.5

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




अभिव्यक्ति 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



पाइथन में एक सशर्त अभिव्यक्ति के लिए एक ऑपरेटर 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")

स्रोत: ?:




पायथन 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)

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




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

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

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




तुम यह केर सकते हो :-

[condition] and [expression_1] or [expression_2] ;

उदाहरण:-

print(number%2 and "odd" or "even")

यदि संख्या भी अजीब है या "यहां तक ​​कि" यदि संख्या भी है तो यह "विषम" प्रिंट करेगा।

नतीजा: - यदि स्थिति सही है तो exp_1 निष्पादित किया जाता है अन्यथा exp_2 निष्पादित किया जाता है।

नोट: - 0, कोई नहीं, झूठी, emptylist, blankString गलत के रूप में मूल्यांकन करता है। और 0 के अलावा कोई भी डेटा सही पर मूल्यांकन करता है।

यहां देखिए यह कैसे काम करता है:

अगर स्थिति [हालत] "सच" बन जाती है, तो अभिव्यक्ति_1 का मूल्यांकन किया जाएगा लेकिन अभिव्यक्ति_2 नहीं होगा। अगर हम 0 (शून्य) के साथ "और" कुछ करते हैं, तो परिणाम हमेशा झुकाव होगा। इसलिए नीचे दिए गए कथन में,

0 and exp

एक्सप्रेशन एक्स का मूल्यांकन तब तक नहीं किया जाएगा जब से 0 "और" 0 के साथ हमेशा शून्य का मूल्यांकन करेगा और अभिव्यक्ति का मूल्यांकन करने की कोई आवश्यकता नहीं है। इस प्रकार संकलक स्वयं सभी भाषाओं में काम करता है।

में

1 or exp

एक्सप्रेशन एक्स का मूल्यांकन नहीं किया जाएगा क्योंकि "या" 1 के साथ हमेशा 1 होगा। इसलिए अभिव्यक्ति एक्सप का मूल्यांकन करने के लिए परेशान नहीं होगा क्योंकि परिणाम 1 वैसे भी होगा। (कंपाइलर अनुकूलन विधियों)।

लेकिन मामले में

True and exp1 or exp2

दूसरी अभिव्यक्ति exp2 का मूल्यांकन नहीं किया जाएगा क्योंकि True and exp1 सही होगा जब exp1 गलत नहीं है।

इसी प्रकार में

False and exp1 or exp2

अभिव्यक्ति exp1 का मूल्यांकन नहीं किया जाएगा क्योंकि गलत 0 लिखने के बराबर है और 0 और "0 के साथ" 0 होगा, लेकिन "या" के बाद से exp1 के बाद, यह "या" के बाद अभिव्यक्ति exp2 का मूल्यांकन करेगा।

नोट: - "या" और "और" का उपयोग करके इस प्रकार की शाखाओं का उपयोग केवल तब किया जा सकता है जब अभिव्यक्ति_1 में गलत (या 0 या कोई नहीं या emptylist [] या blankstring '' का सत्य मान नहीं है) क्योंकि अभिव्यक्ति_1 बन जाता है गलत, तो अभिव्यक्ति_2 का मूल्यांकन एक्सप_1 और एक्सप 2 के बीच उपस्थिति के कारण "या" किया जाएगा।

यदि आप अभी भी सभी मामलों के लिए काम करना चाहते हैं, चाहे कितना exp_1 और exp_2 सत्य मान हैं, ऐसा करें: -

[condition] and ([expression_1] or 1) or [expression_2] ;




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






हां, अजगर में एक टर्नरी ऑपरेटर है, यहां सिंटैक्स और एक उदाहरण कोड प्रदर्शित करने के लिए है :)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")



यदि चर परिभाषित किया गया है और आप यह जांचना चाहते हैं कि उसके पास मूल्य a or b तो आप केवल a or b कर सकते हैं

def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

उत्पादन होगा

no Input
no Input
no Input
hello
['Hello']
True





Related