यदि पायथन में एक टर्नरी सशर्त संचालक नहीं है, तो क्या अन्य भाषा निर्माणों का उपयोग करके अनुकरण करना संभव है?
case [...] { when ... then ...} [ else ... ] end
एक समान प्रभाव होता है लेकिन सभी टर्नरी पर नहीं।
यदि पायथन में एक टर्नरी सशर्त संचालक नहीं है, तो क्या अन्य भाषा निर्माणों का उपयोग करके अनुकरण करना संभव है?
case [...] { when ... then ...} [ else ... ] end
एक समान प्रभाव होता है लेकिन सभी टर्नरी पर नहीं।
जवाबों:
हां, इसे 2.5 संस्करण में जोड़ा गया था । अभिव्यक्ति वाक्यविन्यास है:
a if condition else b
पहले condition
मूल्यांकन किया जाता है, फिर बूलियन मूल्य के आधार पर a
या तो एक का b
मूल्यांकन किया जाता है या लौटाया जाता है । यदि मूल्यांकन किया जाता है , तो मूल्यांकन किया जाता है और वापस लौटाया जाता है लेकिन नजरअंदाज कर दिया जाता है, या जब मूल्यांकन किया जाता है और वापस लौटाया जाता है, लेकिन नजरअंदाज कर दिया जाता है।condition
condition
True
a
b
b
a
यह शॉर्ट-सर्कुलेटिंग की अनुमति देता है क्योंकि जब condition
सत्य होता है तो केवल a
उसका मूल्यांकन किया जाता है और b
उसका मूल्यांकन बिल्कुल नहीं किया जाता है, लेकिन जब condition
केवल गलत b
का मूल्यांकन किया जाता है और a
उसका मूल्यांकन नहीं किया जाता है।
उदाहरण के लिए:
>>> '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 = a if True else b
दो मूल्यों के बीच स्विच करने के रूप में सशर्त अभिव्यक्ति के बारे में सोचो। जब आप 'एक मूल्य या किसी अन्य' स्थिति में होते हैं तो यह बहुत उपयोगी होता है, लेकिन यह बहुत कुछ नहीं करता है।
यदि आपको बयानों का उपयोग करने की आवश्यकता है, तो आपको सशर्त अभिव्यक्ति के बजाय सामान्य if
कथन का उपयोग करना होगा ।
ध्यान रखें कि यह कई कारणों से कुछ पाइथोनिस्टस द्वारा परिलक्षित होता है:
condition ? a : b
कई अन्य भाषाओं (जैसे सी, सी ++, गो, पर्ल, रूबी, जावा, जावास्क्रिप्ट, आदि) से क्लासिक टर्नरी ऑपरेटर से अलग है, जो कि उन लोगों के लिए बग का कारण बन सकता है जब लोग पायथन के "से अपरिचित हैं" आश्चर्यजनक "व्यवहार इसका उपयोग करते हैं (वे तर्क क्रम को उलट सकते हैं)।if
' वास्तव में उपयोगी हो सकता है, और आपकी स्क्रिप्ट को अधिक संक्षिप्त बना सकता है, यह वास्तव में आपके कोड को जटिल करता है)यदि आपको ऑर्डर याद रखने में परेशानी हो रही है, तो याद रखें कि जब जोर से पढ़ें, तो आप (लगभग) कहते हैं कि आपका क्या मतलब है। उदाहरण के लिए, के x = 4 if b > 8 else 9
रूप में जोर से पढ़ा है x will be 4 if b is greater than 8 otherwise 9
।
आधिकारिक दस्तावेज:
f(x) = |x| = x if x > 0 else -x
लिए गणितज्ञों के लिए बहुत स्वाभाविक लगता है। आप इसे ज्यादातर मामलों में A के रूप में भी समझ सकते हैं, सिवाय तब जब C को आपको B के बजाय करना चाहिए ...
z = 3 + x if x < y else y
। तो x=2
और y=1
, आप पाएंगे कि उपज के लिए 4 उम्मीद कर सकते हैं, लेकिन यह वास्तव में प्राप्त होते हैं 1. z = 3 + (x if x > y else y)
सही उपयोग है।
z = 3 + x if x < y else 3 + y
), या सशर्त समूह ( z = 3 + (x if x < y else y)
या z = (x if x < y else y) + 3
)
आप एक ट्यूल में इंडेक्स कर सकते हैं:
(falseValue, trueValue)[test]
test
सही या गलत लौटने की जरूरत है ।
यह हमेशा इसे लागू करने के लिए सुरक्षित हो सकता है:
(falseValue, trueValue)[test == True]
या आप बूलियन मान bool()
को आश्वस्त करने के लिए अंतर्निहित उपयोग कर सकते हैं :
(falseValue, trueValue)[bool(<expression>)]
(lambda: print("a"), lambda: print("b"))[test==true]()
[]
एक मनमाना अभिव्यक्ति हो सकती है। इसके अलावा, सुरक्षा के लिए आप स्पष्ट रूप से लिखकर सत्यता के लिए परीक्षण कर सकते हैं [bool(<expression>)]
। bool()
समारोह v2.2.1 के बाद से आसपास किया गया है।
True
और False
: कुंजी के रूप में {True:trueValue, False:falseValue}[test]
मैं नहीं जानता कि क्या यह किसी भी कम कुशल है, लेकिन यह कम से कम से बचने के पूरे में करता है "सुरुचिपूर्ण" बनाम "बदसूरत" बहस। कोई अस्पष्टता नहीं है कि आप एक इंट के बजाय एक बूलियन के साथ काम कर रहे हैं।
2.5 से पहले के संस्करणों के लिए, यह ट्रिक है:
[expression] and [on_true] or [on_false]
on_true
गलत बूलियन मान होने पर यह गलत परिणाम दे सकता है । 1
यद्यपि इसके पास दाएं से बाएं अभिव्यक्ति का मूल्यांकन करने का लाभ है, जो मेरी राय में स्पष्ट है।
<expression 1> if <condition> else <expression 2>
a = 1
b = 2
1 if a > b else -1
# Output is -1
1 if a > b else -1 if a < b else 0
# Output is -1
से प्रलेखन :
सशर्त अभिव्यक्ति (कभी-कभी "टर्नरी ऑपरेटर" कहा जाता है) में सभी पायथन संचालन की सबसे कम प्राथमिकता होती है।
अभिव्यक्ति
x if C else y
पहले स्थिति का मूल्यांकन करती है, सी ( एक्स नहीं ); यदि C सत्य है, तो x का मूल्यांकन किया जाता है और उसका मान लौटाया जाता है; अन्यथा, y का मूल्यांकन किया जाता है और इसका मान लौटाया जाता है।सशर्त अभिव्यक्तियों के बारे में अधिक जानकारी के लिए पीईपी 308 देखें ।
संस्करण 2.5 के बाद से नया।
पायथन में सशर्त अभिव्यक्ति के लिए एक ऑपरेटर को 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
और or
ऑपरेटरों के लिए है:
result = (a > b) and x or y
हालाँकि यह काम नहीं करेगा अगर x
होगा False
।
निम्नलिखित के रूप में एक संभावित समाधान बनाना x
और y
सूचीबद्ध करना या ट्यूप करना है:
result = ((a > b) and [x] or [y])[0]
या:
result = ((a > b) and (x,) or (y,))[0]
यदि आप शब्दकोष के साथ काम कर रहे हैं, तो एक टर्नरी सशर्त का उपयोग करने के बजाय, आप इसका लाभ उठा सकते हैं get(key, default)
, उदाहरण के लिए:
shell = os.environ.get('SHELL', "/bin/sh")
स्रोत: ?: विकिपीडिया में पायथन में
result = {1: x, 0: y}[a > b]
एक और संभव संस्करण है ( True
और False
वास्तव में मूल्यों के साथ पूर्णांक हैं ) 1
और0
दुर्भाग्य से
(falseValue, trueValue)[test]
समाधान में शॉर्ट-सर्किट व्यवहार नहीं है; इस प्रकार दोनों falseValue
और trueValue
हालत की परवाह किए बिना मूल्यांकन किया जाता है। यह करने से इनकी या यहाँ तक कि गाड़ी हो सकता है (यानी दोनों trueValue
और falseValue
तरीकों हो सकता है और साइड इफेक्ट हो सकता है)।
इसका एक समाधान होगा
(lambda: falseValue, lambda: trueValue)[test]()
(विजेता के ज्ञात होने तक निष्पादन में देरी;)), लेकिन यह कॉल करने योग्य और गैर-कॉल करने योग्य वस्तुओं के बीच असंगतता का परिचय देता है। इसके अलावा, यह गुणों का उपयोग करते समय मामले को हल नहीं करता है।
और इसलिए कहानी आगे बढ़ती है - 3 उल्लिखित समाधानों के बीच चयन शॉर्ट-सर्किट सुविधा होने के बीच एक व्यापार-बंद है, कम से कम (ython 2.5 (IMHO अब कोई समस्या नहीं है) और " trueValue
-वैल्यूएंट्स-टू-झूठी" होने का खतरा नहीं है ।
if else if
।
यहाँ मैं सिर्फ कुछ 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
पायथन 2.5 और नए के लिए एक विशिष्ट सिंटैक्स है:
[on_true] if [cond] else [on_false]
पुराने पायथन में एक टर्नरी ऑपरेटर को लागू नहीं किया जाता है, लेकिन इसे अनुकरण करना संभव है।
cond and on_true or on_false
हालांकि, एक संभावित समस्या है, जो अगर cond
मूल्यांकन करता है True
और on_true
मूल्यांकन करता है False
तो on_false
इसके बजाय वापस कर दिया जाता है on_true
। यदि आप चाहते हैं कि यह व्यवहार ठीक है, अन्यथा इसका उपयोग करें:
{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)
यह सभी पायथन संस्करणों के साथ संगत है।
q("blob", on_true, on_false)
रिटर्न on_false
, जबकि on_true if cond else on_false
रिटर्न on_true
। का संभावित हल को बदलने के लिए है cond
के साथ cond is not None
हालांकि कि एक आदर्श समाधान नहीं है, इन मामलों में।
bool(cond)
इसके बजाय क्यों नहीं cond is True
? पूर्व की सत्यता की cond
जांच करता है, True
वस्तु के साथ सूचक-समानता के लिए बाद की जांच । जैसा कि @AndrewCecil द्वारा हाइलाइट किया गया है, "blob"
यह सत्य है लेकिन ऐसा है is not True
।
[on_false, on_True][cond is True]
ताकि अभिव्यक्ति कम हो जाए।
आप अक्सर पा सकते हैं
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
। तो ऊपर या तो तर्क का एक अधूरा टुकड़ा है (शायद उपयोगकर्ता झूठी स्थिति में एक नो-ऑप की उम्मीद करता है) या क्या हो सकता है कि अभिव्यक्ति 2 का उपयोग एक फिल्टर के रूप में किया जाए - ध्यान दें कि निम्नलिखित कानूनी पायथन है:
[expression1 for element in iterable if expression2]
expression2
सूची समझ के लिए एक फिल्टर के रूप में काम करता है, और है नहीं एक त्रिगुट सशर्त ऑपरेटर।
निम्नलिखित लिखने के लिए आपको यह कुछ दर्दनाक लग सकता है:
expression1 if expression1 else expression2
expression1
उपरोक्त उपयोग के साथ दो बार मूल्यांकन करना होगा। यह अतिरेक को सीमित कर सकता है यदि यह केवल एक स्थानीय चर है। हालांकि, इस उपयोग के मामले के लिए एक आम और प्रदर्शन करने वाले पायथोनिक मुहावरे का or
व्यवहार बर्ताव करना है:
expression1 or expression2
जो शब्दार्थ में समतुल्य है। ध्यान दें कि कुछ शैली-मार्गदर्शक इस उपयोग को स्पष्टता के आधार पर सीमित कर सकते हैं - यह बहुत कम अर्थ को बहुत कम वाक्यविन्यास में पैक करता है।
expression1 or expression2
expression1 || expression2
जावास्क्रिप्ट में समान कमियां / सकारात्मकता के साथ समान और सकारात्मक होना
expressionN
सभी उदाहरणों के लिए मेटासिनटैक्टिक का उपयोग सुसंगत है, यह नामकरण के साथ समझना आसान हो सकता है जिसने दो परिणाम अभिव्यक्तियों से सशर्त परीक्षण अभिव्यक्ति को अलग किया; जैसे, result1 if condition else result2
। यह विशेष रूप से स्पष्ट है जब घोंसले के शिकार (उर्फ चेनिंग) result1 if condition1 else result2 if condition2 else result3
:। देखें कि इस तरह से पढ़ना कितना बेहतर है?
अजगर टर्नरी ऑपरेटर का अनुकरण।
उदाहरण के लिए
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'
result = (y, x)[a < b]
आप lambda
फ़ंक्शन का उपयोग क्यों करते हैं ?
Ternary सशर्त ऑपरेटर बस एक लाइन में एक शर्त का परीक्षण करने की अनुमति देता है बहु-कोड की जगह अगर-और कोड को कॉम्पैक्ट बना रहा है।
[on_true] अगर [अभिव्यक्ति] और [on_false]
# 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
# 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
# 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
if-else
वास्तव में टर्नरी ऑपरेटर का पुनर्लेखन नहीं है, और ए और बी के चुनिंदा मूल्यों के लिए अलग-अलग आउटपुट का उत्पादन करेगा (विशेषकर यदि कोई एक प्रकार है जो एक अजीब __ne__
विधि को लागू करता है )।
तुम यह केर सकते हो :-
[condition] and [expression_1] or [expression_2] ;
उदाहरण:-
print(number%2 and "odd" or "even")
यदि संख्या विषम है या "सम" यदि संख्या सम है तो यह "विषम" प्रिंट करेगा।
नोट: - 0, कोई नहीं, गलत, खालीपन, खालीपन गलत के रूप में मूल्यांकन करता है। और 0 के अलावा कोई भी डेटा True का मूल्यांकन करता है।
अगर हालत [स्थिति] "सच" हो जाती है, तो अभिव्यक्ति 1 का मूल्यांकन किया जाएगा, लेकिन अभिव्यक्ति 2 नहीं। यदि हम "और" 0 (शून्य) के साथ कुछ करते हैं, तो परिणाम हमेशा फ़ासले होंगे। नीचे दिए गए बयान में,
0 and exp
एक्सप्रेशन एक्सप्रेशन का मूल्यांकन बिल्कुल भी नहीं किया जाएगा क्योंकि "और" 0 के साथ हमेशा शून्य का मूल्यांकन करेगा और अभिव्यक्ति का मूल्यांकन करने की कोई आवश्यकता नहीं है। यह कैसे संकलक खुद काम करता है, सभी भाषाओं में।
में
1 or exp
एक्सप्रेशन एक्सप्रेशन का मूल्यांकन तब से बिल्कुल नहीं किया जाएगा क्योंकि "या" 1 के साथ हमेशा 1 होगा। इसलिए यह एक्सप्रेशन एक्सपीरिएंस का मूल्यांकन करने की जहमत नहीं उठाएगा क्योंकि रिजल्ट वैसे भी 1 होगा। (संकलक अनुकूलन के तरीके)।
लेकिन के मामले में
True and exp1 or exp2
Exp1 के झूठे नहीं होने के बाद से दूसरी अभिव्यक्ति exp2 का मूल्यांकन नहीं किया जाएगा क्योंकि True and exp1
यह सच होगा।
इसी तरह से
False and exp1 or exp2
एक्सप्रेशन 1 का मूल्यांकन नहीं किया जाएगा क्योंकि फाल्स 0 लिखने के बराबर है और "और" 0 के साथ 0 ही होगा, लेकिन एक्सप 1 के बाद से "या" का उपयोग किया जाता है, यह एक्सप्रेशन एक्सप 2 का मूल्यांकन "या" के बाद करेगा।
नोट: - "या" और "और" का उपयोग करने वाली इस तरह की शाखाओं का उपयोग केवल तब किया जा सकता है जब अभिव्यक्ति 1 में गलत (या 0 या कोई भी या एमप्टाइलिस्ट [] या एम्प्टीस्ट्रिंग का सत्य मान नहीं है।) यदि अभिव्यक्ति बन जाती है। गलत है, तो अभिव्यक्ति .2 का मूल्यांकन उपस्थिति के कारण "या" exp_1 और exp_2 के बीच होगा।
यदि आप अभी भी इसे सभी मामलों के लिए काम करना चाहते हैं, तो इसकी परवाह किए बिना कि क्या exp_1 और exp_2 सत्य मूल्य हैं, यह करें: -
[condition] and ([expression_1] or 1) or [expression_2] ;
x = [condition] and ([expression_1] or 1) or [expression_2]
और expression_1
गलत का आकलन, x
हो जाएगा 1
, नहीं expression_1
। स्वीकृत उत्तर का उपयोग करें।
एक उत्तर की तुलना में अधिक टिप (hundreth समय के लिए स्पष्ट दोहराए जाने की आवश्यकता नहीं है), लेकिन मैं कभी-कभी इस तरह के निर्माणों में एक ऑनलाइनर शॉर्टकट के रूप में उपयोग करता हूं:
if conditionX:
print('yes')
else:
print('nah')
, बन जाता है:
print('yes') if conditionX else print('nah')
कुछ (कई :) इस पर अनहोनी (भले ही रूबी-ईश :) के रूप में डूब सकते हैं, लेकिन मुझे व्यक्तिगत रूप से यह अधिक स्वाभाविक लगता है - अर्थात आप इसे सामान्य रूप से कैसे व्यक्त करेंगे, साथ ही कोड के बड़े ब्लॉकों में थोड़ा अधिक नेत्रहीन रूप से।
print( 'yes' if conditionX else 'nah' )
आपके जवाब पर पसंद करता हूं । :-)
print()
दोनों मामलों में चाहते हैं - और यह थोड़ा अधिक pythonic दिखता है, तो मुझे स्वीकार करना होगा :) लेकिन क्या होगा यदि भाव / कार्य समान नहीं हैं - जैसे print('yes') if conditionX else True
- print()
केवल सत्य में प्राप्त करने के लिएconditionX
print('yes') if conditionX else print('nah')
99 की टिप्पणी में जोड़ने के लिए, बचने का एक और कारण यह है कि यह पायथन 2 में एक सिंटैक्सएर्रर देता है।
print "yes"
, जबकि पायथन 3 में यह एक फ़ंक्शन है - print("yes")
। इसे या तो एक बयान के रूप में उपयोग करके हल किया जा सकता है, या बेहतर - from future import print_function
।
पायथन की सशर्त अभिव्यक्ति के विकल्पों में से एक
"yes" if boolean else "no"
निम्नलखित में से कोई:
{True:"yes", False:"no"}[boolean]
जिसका निम्नलिखित अच्छा विस्तार है:
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]
सबसे छोटा विकल्प रहता है:
("no", "yes")[boolean]
लेकिन इसका कोई विकल्प नहीं है
yes() if boolean else no()
यदि आप yes()
और के मूल्यांकन से बचना चाहते हैं no()
, क्योंकि में
(no(), yes())[boolean] # bad
दोनों no()
और yes()
मूल्यांकन किया जाता है।
C
आमतौर पर व्युत्पन्न कई प्रोग्रामिंग भाषाओं में टर्नरी कंडीशनल ऑपरेटर के निम्नलिखित सिंटैक्स होते हैं:
<condition> ? <expression1> : <expression2>
सबसे पहले,
Python
बी एन डीवोलेंट डी ictator F या L ife (मेरा मतलब है कि Guido van Rossum, निश्चित रूप से) ने इसे अस्वीकार कर दिया (गैर-पायथोनिक शैली के रूप में), क्योंकि यह उन लोगों के लिए समझने में काफी कठिन है जोC
भाषा का उपयोग नहीं करते हैं। इसके अलावा, कोलन साइन में:
पहले से ही कई उपयोग हैंPython
। PEP 308 स्वीकृत होने के बाद ,Python
अंततः अपनी स्वयं की शॉर्टकट सशर्त अभिव्यक्ति प्राप्त हुई (जो हम अभी उपयोग करते हैं):
<expression1> if <condition> else <expression2>
तो, सबसे पहले यह स्थिति का मूल्यांकन करता है। यदि यह रिटर्न True
, expression1 परिणाम देने के लिए मूल्यांकन किया जाएगा, अन्यथा expression2 मूल्यांकन किया जाएगा। आलसी मूल्यांकन यांत्रिकी के कारण - केवल एक अभिव्यक्ति को निष्पादित किया जाएगा।
यहां कुछ उदाहरण दिए गए हैं (स्थिति का मूल्यांकन बाएं से दाएं किया जाएगा):
pressure = 10
print('High' if pressure < 20 else 'Critical')
# Result is 'High'
टर्नरी ऑपरेटरों को श्रृंखला में जंजीर दिया जा सकता है:
pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')
# Result is 'Normal'
निम्नलिखित एक पिछले एक के समान है:
pressure = 5
if pressure < 20:
if pressure < 10:
print('Normal')
else:
print('High')
else:
print('Critical')
# Result is 'Normal'
उम्मीद है की यह मदद करेगा।
जैसा कि पहले ही उत्तर दिया गया है, हाँ अजगर में एक टर्नरी ऑपरेटर है:
<expression 1> if <condition> else <expression 2>
अतिरिक्त जानकारी:
यदि <expression 1>
वह शर्त है जिसका उपयोग आप लघु-परीक्षण मूल्यांकन कर सकते हैं :
a = True
b = False
# Instead of this:
x = a if a else b
# You could use Short-cirquit evaluation:
x = a or b
पुनश्च: बेशक, शॉर्ट-सरक्विट मूल्यांकन एक टर्नरी ऑपरेटर नहीं है, लेकिन अक्सर टर्नरी का उपयोग उन मामलों में किया जाता है जहां शॉर्ट सर्किट पर्याप्त होगा।
short-circuit
मूल्यांकन के लिए तैयार रहें ।
हाँ, अजगर के पास एक टर्नरी ऑपरेटर होता है, यहाँ सिंटैक्स और उसी को प्रदर्शित करने के लिए एक उदाहरण कोड है :)
#[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")
print
वास्तव में एक अच्छा विकल्प नहीं है, क्योंकि यह पायथन 2 में एक सिंटेक्स एरर देगा।
पायथन में असाइनमेंट के लिए एक टर्नरी फॉर्म है; हालाँकि इससे भी छोटा रूप हो सकता है कि लोगों को इसके बारे में पता होना चाहिए।
यह एक शर्त के आधार पर एक चर एक मूल्य या किसी अन्य को असाइन करने के लिए बहुत आम है।
>>> li1 = None
>>> li2 = [1, 2, 3]
>>>
>>> if li1:
... a = li1
... else:
... a = li2
...
>>> a
[1, 2, 3]
^ इस तरह के असाइनमेंट करने का यह लंबा फॉर्म है।
नीचे टर्नरी फॉर्म है। लेकिन यह सबसे सफल तरीका नहीं है - अंतिम उदाहरण देखें।
>>> a = li1 if li1 else li2
>>>
>>> a
[1, 2, 3]
>>>
पायथन के साथ, आप बस or
वैकल्पिक असाइनमेंट के लिए उपयोग कर सकते हैं ।
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>
उपरोक्त कार्य तब से li1
है None
और अंतःप्रेरणा यह मानती है कि तर्क अभिव्यक्तियों में गलत है। इंटरप तब आगे बढ़ता है और दूसरी अभिव्यक्ति का मूल्यांकन करता है, जो नहीं है None
और यह एक खाली सूची नहीं है - इसलिए यह ए को सौंपा जाता है।
यह खाली सूचियों के साथ भी काम करता है। उदाहरण के लिए, यदि आप a
जो भी सूची निर्दिष्ट करना चाहते हैं उसमें आइटम हैं।
>>> li1 = []
>>> li2 = [1, 2, 3]
>>>
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>
यह जानते हुए भी, आप जब भी उनका सामना कर सकते हैं, तो आप ऐसे कार्य कर सकते हैं यह स्ट्रिंग्स और अन्य पुनरावृत्तियों के साथ भी काम करता है। आप a
जो भी स्ट्रिंग आवंटित कर सकते हैं वह खाली नहीं है।
>>> s1 = ''
>>> s2 = 'hello world'
>>>
>>> a = s1 or s2
>>>
>>> a
'hello world'
>>>
मुझे हमेशा सी टर्नरी सिंटैक्स पसंद आया, लेकिन पायथन इसे एक कदम आगे ले जाता है!
मैं समझता हूं कि कुछ लोग यह कह सकते हैं कि यह एक अच्छा शैलीगत विकल्प नहीं है क्योंकि यह यांत्रिकी पर निर्भर करता है जो सभी डेवलपर्स के लिए तुरंत स्पष्ट नहीं हैं। मैं व्यक्तिगत रूप से उस दृष्टिकोण से असहमत हूं। अजगर एक वाक्यविन्यास समृद्ध भाषा है जिसमें बहुत सारे मुहावरे हैं जो तुरंत डब्लर के लिए स्पष्ट नहीं हैं। लेकिन जितना अधिक आप अंतर्निहित प्रणाली के यांत्रिकी को सीखते हैं और समझते हैं, उतना ही आप इसकी सराहना करते हैं।
अन्य उत्तर पायथन टर्नरी ऑपरेटर के बारे में सही ढंग से बात करते हैं। मैं एक परिदृश्य का उल्लेख करके पूरक करना चाहूंगा जिसके लिए टर्नरी ऑपरेटर का अक्सर उपयोग किया जाता है लेकिन जिसके लिए एक बेहतर मुहावरा है। यह डिफ़ॉल्ट मान का उपयोग करने का परिदृश्य है।
मान लें कि यदि हम option_value
सेट नहीं है तो हम डिफ़ॉल्ट मान के साथ उपयोग करना चाहते हैं :
run_algorithm(option_value if option_value is not None else 10)
या केवल
run_algorithm(option_value if option_value else 10)
हालाँकि, एक बेहतर समाधान केवल लिखना है
run_algorithm(option_value or 10)
अगर चर को परिभाषित किया गया है और आप यह जांचना चाहते हैं कि क्या यह मूल्य है तो आप बस कर सकते हैं 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 if x else y
, लेकिन नहीं x if z else y
।
कई ऑपरेटरों को चेन करने का एक साफ तरीका:
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'
array = [(0,0),(0,1),(1,0),(1,1)]
for a in array:
x, y = a[0], a[1]
print(f(x,y))
# Output is:
# equal,
# less,
# greater,
# equal
मुझे डिफ़ॉल्ट अजगर सिंटैक्स बोझिल लगता है val = a if cond else b
, इसलिए कभी-कभी मैं ऐसा करता हूं:
iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)
बेशक, इसमें हमेशा दोनों पक्षों (ए और बी) का मूल्यांकन करने की नकारात्मक स्थिति होती है, लेकिन इसका सिंटैक्स मेरे लिए स्पष्ट है
val = a if cond else b
कथन की तुलना में अधिक अस्पष्ट ।