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




operators ternary-operator (16)

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

https://code.i-harness.com


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

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

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

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


विभिन्न प्रोग्रामिंग भाषाओं में टर्नरी ऑपरेटर

यहां मैं कुछ प्रोग्रामिंग भाषाओं के बीच ternary operator में कुछ महत्वपूर्ण अंतर दिखाने की कोशिश करता हूं।

जावास्क्रिप्ट में टर्नरी ऑपरेटर

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

रूबी में टर्नरी ऑपरेटर

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

स्कैला में टर्नरी ऑपरेटर

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

आर प्रोग्रामिंग में टर्नरी ऑपरेटर

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

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

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

अब आप पाइथन भाषा की सुंदरता देख सकते हैं। इसकी अत्यधिक पठनीय और रखरखाव योग्य है।


@up:

दुर्भाग्य से

(falseValue, trueValue)[test]

समाधान में शॉर्ट सर्किट व्यवहार नहीं है; इस प्रकार शर्त के बावजूद झूठी वैल्यू और सत्य वैल्यू का मूल्यांकन किया जाता है। यह उप-चरम या यहां तक ​​कि छोटी गाड़ी हो सकती है (यानी सत्यवैलू और झूठी वैल्यू दोनों विधियां हो सकती हैं और साइड इफेक्ट्स हो सकती हैं)।

इसका एक समाधान होगा

(lambda: falseValue, lambda: trueValue)[test]()

(विजेता को ज्ञात होने तक निष्पादन में देरी हो जाती है;)), लेकिन यह कॉल करने योग्य और गैर-कॉल करने योग्य वस्तुओं के बीच असंगतता प्रस्तुत करता है। इसके अलावा, यह गुणों का उपयोग करते समय मामले को हल नहीं करता है।

और इसलिए कहानी जाती है - 3 उल्लिखित समाधानों के बीच चयन करना कम से कम पायथन 2.5 (आईएमएचओ अब कोई समस्या नहीं) का उपयोग करके शॉर्ट-सर्किट सुविधा रखने के बीच एक व्यापार-बंद है और "सत्यवैल-मूल्यांकन-से-झूठी" त्रुटियों।


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

(falseValue, trueValue)[test]

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

(falseValue, trueValue)[test == True]

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

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

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

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

, बन जाता है:

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

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


टर्नरी सशर्त ऑपरेटर बस मल्टीलाइन को प्रतिस्थापित करने वाली एक पंक्ति में एक शर्त का परीक्षण करने की अनुमति देता है - और कोड कोड कॉम्पैक्ट बनाते हैं।

वाक्य - विन्यास :

[on_true] अगर [अभिव्यक्ति] अन्य [on_false]

1- टर्नरी ऑपरेटर का उपयोग करने के लिए सरल तरीका:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2- tuples, शब्दकोश, और lambda का उपयोग करने की सीधी विधि:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- टर्नरी ऑपरेटर को नेस्टेड के रूप में लिखा जा सकता है यदि अन्यथा:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

ऊपर दृष्टिकोण के रूप में लिखा जा सकता है:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a

पाइथन टर्नरी ऑपरेटर सिमुलेटिंग।

उदाहरण के लिए

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

उत्पादन:

'b greater than a'

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

स्रोत: ?:


बिल्कुल, और यह समझने के लिए अविश्वसनीय रूप से आसान है।

general syntax : first_expression if bool_expression_is_true else second_expression

Example: x= 3 if 3 > 2 else 4 
# assigns 3 to x if the boolean expression evaluates to true or 4 if it is false

यदि चर परिभाषित किया गया है और आप यह जांचना चाहते हैं कि उसके पास मूल्य 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

हाँ:

आइए मान लें कि आप चर x को कुछ मान देना चाहते हैं यदि कुछ बूल सत्य हैं और इसी तरह

एक्स = 5 अगर कुछ और एक्स = 10

एक्स = [कुछ मूल्य] यदि [यदि यह सच है तो पहला मान मूल्यांकन करता है] अन्य [अन्य मूल्य मूल्यांकन]


हाँ।

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


हां, यह संस्करण 2.5 में added गया था।
वाक्यविन्यास है:

a if condition else b

पहली condition का मूल्यांकन किया जाता है, फिर या तो a या b को Boolean मूल्य की condition आधार पर वापस कर दिया जाता है
यदि condition सही पर मूल्यांकन करती है तो वापस लौटा दिया जाता है, अन्यथा b वापस कर दिया जाता है।

उदाहरण के लिए:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

ध्यान दें कि सशर्त एक अभिव्यक्ति है , एक बयान नहीं। इसका मतलब है कि आप सशर्त में असाइनमेंट या pass या अन्य कथन का उपयोग नहीं कर सकते हैं:

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

ऐसे मामले में, आपको सशर्त के बजाय सामान्य विवरण का उपयोग करना होगा।

ध्यान रखें कि कई पायथनिस्टों द्वारा यह कई कारणों से फहराया गया है:

  • तर्कों का क्रम कई अन्य भाषाओं (जैसे सी, रूबी, जावा, इत्यादि) से अलग है, जो पागथन के "आश्चर्यजनक" व्यवहार से अपरिचित लोगों द्वारा उपयोग किए जाने पर बग का कारण बन सकता है (वे ऑर्डर को उलट सकते हैं)।
  • कुछ इसे "अनावश्यक" पाते हैं, क्योंकि यह विचार के सामान्य प्रवाह (पहले स्थिति और फिर प्रभावों की सोच) के विपरीत होता है।
  • स्टाइलिस्ट कारणों से।

अगर आपको आदेश याद रखने में परेशानी हो रही है, तो याद रखें कि यदि आप इसे ज़ोर से पढ़ते हैं, तो आप (लगभग) कहते हैं कि आपका क्या मतलब है। उदाहरण के लिए, x = 4 if b > 8 else 9 जोर से पढ़ा जाता है क्योंकि x will be 4 if b is greater than 8 otherwise 9

आधिकारिक दस्तावेज:


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

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




python-2.5