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


6038

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


149
पायथन 3.0 में आधिकारिक दस्तावेज ऊपर की टिप्पणी में संदर्भित किया गया है, इसे "सशर्त_एक्सप्रेसेंस" के रूप में संदर्भित किया जाता है और इसे बहुत ही गुप्त रूप से परिभाषित किया गया है। उस दस्तावेज़ में "टर्नेरी" शब्द भी शामिल नहीं है, इसलिए आपको इसे Google के माध्यम से खोजने के लिए कठिन होगा, जब तक कि आपको नहीं पता था कि वास्तव में क्या देखना है। संस्करण 2 प्रलेखन कुछ और अधिक उपयोगी है और करने के लिए एक लिंक शामिल "पीईपी 308" जो दिलचस्प ऐतिहासिक इस प्रश्न से संबंधित संदर्भ का एक बहुत शामिल है।
नोबार

26
"टर्नेरी" (तीन इनपुट वाले) इस अभेद्यता का एक परिणामी गुण है, न कि अवधारणा की एक परिभाषित संपत्ति। उदाहरण के लिए: SQL में case [...] { when ... then ...} [ else ... ] endएक समान प्रभाव होता है लेकिन सभी टर्नरी पर नहीं।
user313114

10
ISO / IEC 9899 (C प्रोग्रामिंग लैंग्वेज स्टैंडर्ड) सेक्शन 6.5.15 इसे "कंडिशनल ऑपरेटर"
कहता है

9
विकिपीडिया लेख में इसे पूरी तरह से शामिल करता है " ?: "।
HelloGoodbye

9
नोबर की टिप्पणी के बाद के वर्षों में सशर्त अभिव्यक्ति प्रलेखन को सशर्त अभिव्यक्ति (कभी-कभी "टर्नरी ऑपरेटर" कहा जाता है)
स्कॉट मार्टिन

जवाबों:


7037

हां, इसे 2.5 संस्करण में जोड़ा गया था । अभिव्यक्ति वाक्यविन्यास है:

a if condition else b

पहले conditionमूल्यांकन किया जाता है, फिर बूलियन मूल्य के आधार पर aया तो एक का bमूल्यांकन किया जाता है या लौटाया जाता है । यदि मूल्यांकन किया जाता है , तो मूल्यांकन किया जाता है और वापस लौटाया जाता है लेकिन नजरअंदाज कर दिया जाता है, या जब मूल्यांकन किया जाता है और वापस लौटाया जाता है, लेकिन नजरअंदाज कर दिया जाता है।conditionconditionTrueabba

यह शॉर्ट-सर्कुलेटिंग की अनुमति देता है क्योंकि जब 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

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


268
आदेश अजीब लग सकता है लेकिन कोडर के f(x) = |x| = x if x > 0 else -xलिए गणितज्ञों के लिए बहुत स्वाभाविक लगता है। आप इसे ज्यादातर मामलों में A के रूप में भी समझ सकते हैं, सिवाय तब जब C को आपको B के बजाय करना चाहिए ...
yota

120
इसका उपयोग करते समय संचालन के आदेश के साथ सावधान रहें। उदाहरण के लिए, रेखा z = 3 + x if x < y else y। तो x=2और y=1, आप पाएंगे कि उपज के लिए 4 उम्मीद कर सकते हैं, लेकिन यह वास्तव में प्राप्त होते हैं 1. z = 3 + (x if x > y else y)सही उपयोग है।
काल जेकडोर

11
यदि आप सशर्त मूल्यांकन किए जाने के बाद अतिरिक्त मूल्यांकन करना चाहते हैं तो बिंदु यह था कि परिणाम के लिए एक मूल्य जोड़ना जैसे, आपको या तो दोनों पक्षों को अतिरिक्त अभिव्यक्ति जोड़ना होगा ( 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)
काल ज़ेडकोर

4
@Mreek, मैं देख रहा हूं कि आपका क्या मतलब है, इसलिए आप मूल रूप से संचालन को समाप्त कर रहे हैं: `" फू "यदि बूल और (" बार "यदि बूल और"
फोब्बर

3
गणितज्ञों की तुलना में प्रोग्रामरों को सटीक सही सूत्रीकरण की आवश्यकता होती है, क्योंकि गणित में हमेशा अंतर्निहित अवधारणाओं का सहारा होता है। एक आश्वस्त तर्क% ऑपरेटर है, जिस तरह से गणित में "मॉड" का उपयोग किया जाता है, वह एक आपदा है। तो नहीं, मैं आपके तर्क को स्वीकार नहीं करता। यह शाही इकाइयों का पालन करने जैसा है। Groetjes अल्बर्ट
Albert van der Horst

795

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

(falseValue, trueValue)[test]

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

(falseValue, trueValue)[test == True]

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

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

589
ध्यान दें कि यह हमेशा सब कुछ का मूल्यांकन करता है, जबकि यदि / अन्यथा केवल जीत अभिव्यक्ति का मूल्यांकन करता है।
सिल्वरबैकनेट

117
(lambda: print("a"), lambda: print("b"))[test==true]()
डस्टिन गेट्ज़

15
यह ध्यान दिया जाना चाहिए कि एस के भीतर क्या []एक मनमाना अभिव्यक्ति हो सकती है। इसके अलावा, सुरक्षा के लिए आप स्पष्ट रूप से लिखकर सत्यता के लिए परीक्षण कर सकते हैं [bool(<expression>)]bool()समारोह v2.2.1 के बाद से आसपास किया गया है।
मार्टिउ

12
के साथ एक शब्दकोश में अनुक्रमण द्वारा - मैं एक समान चाल किया है - केवल एक या दो बार, लेकिन यह किया Trueऔर False: कुंजी के रूप में {True:trueValue, False:falseValue}[test] मैं नहीं जानता कि क्या यह किसी भी कम कुशल है, लेकिन यह कम से कम से बचने के पूरे में करता है "सुरुचिपूर्ण" बनाम "बदसूरत" बहस। कोई अस्पष्टता नहीं है कि आप एक इंट के बजाय एक बूलियन के साथ काम कर रहे हैं।
जेडीएम


338

2.5 से पहले के संस्करणों के लिए, यह ट्रिक है:

[expression] and [on_true] or [on_false]

on_true गलत बूलियन मान होने पर यह गलत परिणाम दे सकता है । 1
यद्यपि इसके पास दाएं से बाएं अभिव्यक्ति का मूल्यांकन करने का लाभ है, जो मेरी राय में स्पष्ट है।

1. क्या C के "?:" टर्नरी ऑपरेटर के बराबर है?


67
उपाय का उपयोग करना है (परीक्षण और [true_value] या [false_value]) [0], जो इस जाल से बचता है।
थॉमस

5
टर्नरी ऑपरेटर आमतौर पर तेजी से निष्पादित करता है (कभी-कभी 10-25% तक)।
ज्वालामुखी

7
@volcano क्या आपके पास मेरे लिए स्रोत है?
ऑरेंजटैक्स

4
@OrangeTux यहाँ डिसाइड कोड है । थॉमस ने जो विधि सुझाई है उसका उपयोग करना और भी धीमा होगा।
mbomb007

264

<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

83
यह एक टर्नरी ऑपरेटर के प्राथमिक इरादे पर जोर देता है: मूल्य चयन। यह यह भी दर्शाता है कि एक से अधिक टर्नरी को एक एकल अभिव्यक्ति में एक साथ जंजीर किया जा सकता है।
रॉय टिंकर

6
@ क्रेग, मैं सहमत हूं, लेकिन यह जानना भी उपयोगी है कि जब कोई कोष्ठक नहीं होगा तो क्या होगा। वास्तविक कोड में, मैं भी स्पष्ट परचे सम्मिलित करना चाहूंगा।
जॉन कॉम्ब्स

158

से प्रलेखन :

सशर्त अभिव्यक्ति (कभी-कभी "टर्नरी ऑपरेटर" कहा जाता है) में सभी पायथन संचालन की सबसे कम प्राथमिकता होती है।

अभिव्यक्ति x if C else yपहले स्थिति का मूल्यांकन करती है, सी ( एक्स नहीं ); यदि C सत्य है, तो x का मूल्यांकन किया जाता है और उसका मान लौटाया जाता है; अन्यथा, y का मूल्यांकन किया जाता है और इसका मान लौटाया जाता है।

सशर्त अभिव्यक्तियों के बारे में अधिक जानकारी के लिए पीईपी 308 देखें ।

संस्करण 2.5 के बाद से नया।


119

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

स्रोत: ?: विकिपीडिया में पायथन में


1
result = {1: x, 0: y}[a > b]एक और संभव संस्करण है ( Trueऔर Falseवास्तव में मूल्यों के साथ पूर्णांक हैं ) 1और0
वाल्टर ट्रॉस

97

दुर्भाग्य से

(falseValue, trueValue)[test]

समाधान में शॉर्ट-सर्किट व्यवहार नहीं है; इस प्रकार दोनों falseValueऔर trueValueहालत की परवाह किए बिना मूल्यांकन किया जाता है। यह करने से इनकी या यहाँ तक कि गाड़ी हो सकता है (यानी दोनों trueValueऔर falseValueतरीकों हो सकता है और साइड इफेक्ट हो सकता है)।

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

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

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

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


2
जबकि लैम्ब्डास ट्रिक का काम करता है, यह टर्नरी ऑपरेटर के रूप में लंबे समय तक 3x होता है। यह केवल एक उचित विचार होने की संभावना है अगर यह लंबी श्रृंखला को प्रतिस्थापित कर सकता है if else if
पर्किन्स

71

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

यहाँ मैं सिर्फ कुछ 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


5
यह स्पष्ट लग सकता है; लेकिन यह अनिवार्य रूप से क्या कहता है कि यह पायथन सिंटैक्स को एक ऐसे व्यक्ति द्वारा समझने की संभावना है, जिसने कभी टर्नरी ऑपरेटर नहीं देखा था, जबकि बहुत कम लोग अधिक सामान्य सिंटैक्स को समझेंगे जब तक कि उन्हें पहले इसका मतलब नहीं बताया गया हो।
फिलालॉ

1
Algol68: a = .if। ।सच। ।फिर। 1 .लगातार। 0 .fi। यह भी एक = (| सच | 1 | 0) व्यक्त किया जा सकता है जैसा कि सामान्य रूप से अल्गोल 68 इसके उत्तराधिकारियों पर एक सुधार है।
अल्बर्ट वैन डर हॉर्स्ट

63

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

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


2
व्यवहार समान नहीं है - q("blob", on_true, on_false)रिटर्न on_false, जबकि on_true if cond else on_falseरिटर्न on_true। का संभावित हल को बदलने के लिए है condके साथ cond is not Noneहालांकि कि एक आदर्श समाधान नहीं है, इन मामलों में।

5
bool(cond)इसके बजाय क्यों नहीं cond is True? पूर्व की सत्यता की condजांच करता है, Trueवस्तु के साथ सूचक-समानता के लिए बाद की जांच । जैसा कि @AndrewCecil द्वारा हाइलाइट किया गया है, "blob"यह सत्य है लेकिन ऐसा है is not True
जोनास कोल्कर

वाह, यह वास्तव में हैकी लग रहा है! :) तकनीकी रूप से, आप भी लिख सकते हैं [on_false, on_True][cond is True]ताकि अभिव्यक्ति कम हो जाए।
आर्सेनी

इस उत्तर में कोई शॉर्ट सर्किट नहीं है। यदि on_true और on_false को कॉल करना महंगा है तो यह एक बुरा जवाब है।
हैकर

44

आप अक्सर पा सकते हैं

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

38

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

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

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

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


1
expression1 or expression2expression1 || expression2जावास्क्रिप्ट में समान कमियां / सकारात्मकता के साथ समान और सकारात्मक होना
JSDBroughton

1
धन्यवाद, @सेलडू - जब तक आप इसे सीधे प्राप्त नहीं कर सकते, तब तक यह भ्रमित हो सकता है। मैंने कठिन तरीका सीखा है, इसलिए आपका रास्ता उतना कठिन नहीं हो सकता है। ;) का उपयोग करते हुए अगर और बिना, एक जनरेटर अभिव्यक्ति या सूची समझ के अंत में पुनरावृत्ति को फ़िल्टर किया जाएगा। सामने, यह एक टर्नरी सशर्त ऑपरेशन है, और इसके लिए अन्य की आवश्यकता होती है। चीयर्स !!
हारून हॉल

@AaronHall हालांकि expressionNसभी उदाहरणों के लिए मेटासिनटैक्टिक का उपयोग सुसंगत है, यह नामकरण के साथ समझना आसान हो सकता है जिसने दो परिणाम अभिव्यक्तियों से सशर्त परीक्षण अभिव्यक्ति को अलग किया; जैसे, result1 if condition else result2। यह विशेष रूप से स्पष्ट है जब घोंसले के शिकार (उर्फ चेनिंग) result1 if condition1 else result2 if condition2 else result3:। देखें कि इस तरह से पढ़ना कितना बेहतर है?
१६:१२ की रात १२:१२

@tchrist समीक्षा के लिए धन्यवाद - यदि आप संशोधन इतिहास को देखते हैं, तो इस पोस्ट में वर्तमान में दो संशोधन हैं। मेरे अधिकांश उत्तर, विशेष रूप से शीर्ष वाले, बार-बार संशोधित किए गए हैं। इस उत्तर पर मेरा ध्यान कभी नहीं जाता है क्योंकि समुदाय विकि स्थिति मुझे सामग्री के लिए कोई श्रेय नहीं देती है, और इसलिए मुझे इस पर कोई वोट नहीं दिखता है। जैसा कि मेरे पास अभी इस समय एक संपादन के लिए समय नहीं है, मेंढक जानता है कि भविष्य में फिर से मेरे ध्यान में कब आएगा। मैं देख सकता हूँ आप शीर्ष जवाब संपादित किया है, ताकि एक में इस पोस्ट से / उद्धरण मेरी सामग्री उधार लेने के लिए स्वतंत्र लग रहा है (और मुझे अनुरूप यदि का हवाला देते हैं!)
हारून हॉल

23

अजगर टर्नरी ऑपरेटर का अनुकरण।

उदाहरण के लिए

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फ़ंक्शन का उपयोग क्यों करते हैं ?
बृजेश चौहान

5
@GrijeshChauhan क्योंकि "संकलित" भावों पर, उदाहरण के लिए एक फ़ंक्शन कॉल आदि शामिल है, इसे दोनों मामलों में निष्पादित किया जाएगा। यह चाहा नहीं जा सकता है।
ग्लोगल

20

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

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

[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- टुपल्स, डिक्शनरी और लैम्ब्डा के उपयोग की प्रत्यक्ष विधि:

# 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

1
ध्यान दें कि टर्नरी ऑपरेटर छोटा (मेमोरी में) है और नेस्टेड से तेज है अगर। इसके अलावा, आपका नेस्टेड if-elseवास्तव में टर्नरी ऑपरेटर का पुनर्लेखन नहीं है, और ए और बी के चुनिंदा मूल्यों के लिए अलग-अलग आउटपुट का उत्पादन करेगा (विशेषकर यदि कोई एक प्रकार है जो एक अजीब __ne__विधि को लागू करता है )।
पर्किन्स

19

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

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

उदाहरण:-

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

यदि संख्या विषम है या "सम" यदि संख्या सम है तो यह "विषम" प्रिंट करेगा।


परिणाम: - यदि शर्त सही है exp_1 निष्पादित किया गया है और exp_2 निष्पादित किया गया है।

नोट: - 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। स्वीकृत उत्तर का उपयोग करें।
Moi

18

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

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

, बन जाता है:

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

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


5
मैं print( 'yes' if conditionX else 'nah' )आपके जवाब पर पसंद करता हूं । :-)
frederick99

यही कारण है कि अगर आप print()दोनों मामलों में चाहते हैं - और यह थोड़ा अधिक pythonic दिखता है, तो मुझे स्वीकार करना होगा :) लेकिन क्या होगा यदि भाव / कार्य समान नहीं हैं - जैसे print('yes') if conditionX else True- print()केवल सत्य में प्राप्त करने के लिएconditionX
टोडर मिनकोव

फ्रेडरिक print('yes') if conditionX else print('nah')99 की टिप्पणी में जोड़ने के लिए, बचने का एक और कारण यह है कि यह पायथन 2 में एक सिंटैक्सएर्रर देता है।
थियरी लैथुइल

एकमात्र कारण यह एक वाक्यविन्यास त्रुटि देता है क्योंकि पायथन 2 प्रिंट एक बयान है - print "yes", जबकि पायथन 3 में यह एक फ़ंक्शन है - print("yes")। इसे या तो एक बयान के रूप में उपयोग करके हल किया जा सकता है, या बेहतर - from future import print_function
टोडर मिनाकोव

18
a if condition else b

यदि आपको याद रखने में परेशानी हो तो बस इस पिरामिड को याद करें:

     condition
  if           else
a                   b 

13

पायथन की सशर्त अभिव्यक्ति के विकल्पों में से एक

"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()मूल्यांकन किया जाता है।


9

Cआमतौर पर व्युत्पन्न कई प्रोग्रामिंग भाषाओं में टर्नरी कंडीशनल ऑपरेटर के निम्नलिखित सिंटैक्स होते हैं:

<condition> ? <expression1> : <expression2>

सबसे पहले, Python बी एन डीवोलेंट डी ictator F या L ife (मेरा मतलब है कि Guido van Rossum, निश्चित रूप से) ने इसे अस्वीकार कर दिया (गैर-पायथोनिक शैली के रूप में), क्योंकि यह उन लोगों के लिए समझने में काफी कठिन है जो Cभाषा का उपयोग नहीं करते हैं। इसके अलावा, कोलन साइन में :पहले से ही कई उपयोग हैं PythonPEP 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'

उम्मीद है की यह मदद करेगा।


9

जैसा कि पहले ही उत्तर दिया गया है, हाँ अजगर में एक टर्नरी ऑपरेटर है:

<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

पुनश्च: बेशक, शॉर्ट-सरक्विट मूल्यांकन एक टर्नरी ऑपरेटर नहीं है, लेकिन अक्सर टर्नरी का उपयोग उन मामलों में किया जाता है जहां शॉर्ट सर्किट पर्याप्त होगा।


1
उस short-circuitमूल्यांकन के लिए तैयार रहें ।
कोडित

7

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

#[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")

मैंने यह जाँचने के लिए एक पंक्ति स्टेटमेंट उदाहरण जोड़ा है कि कौन सी संख्या आगे इसे विस्तृत करने के लिए बड़ी है
PythonLover

1
printवास्तव में एक अच्छा विकल्प नहीं है, क्योंकि यह पायथन 2 में एक सिंटेक्स एरर देगा।
थियरी लैथुइल

@ थिएरी लेथुइल यहाँ मैंने प्रिंट का उपयोग किया () फंक्शन नॉट प्रिंट स्टेटमेंट, प्रिंट फंक्शन पायथन 3 के लिए है जबकि प्रिंट स्टेटमेंट पायथन 2 के लिए है
लवर्स

SO पर प्रश्न पहले ही पूछा जा चुका है, बस इसे पायथन 2 के साथ आज़माएँ और आप स्वयं देखेंगे। 'प्रिंट (' हैलो ') पायथन 2.7 में एक पूरी तरह से वैध वाक्यविन्यास है, लेकिन जिस तरह से इसे पार्स किया गया है वह आपके कोड को सिंटैक्सएयर को फेंक देता है।
थियरी लैथुइल

1

पायथन में असाइनमेंट के लिए एक टर्नरी फॉर्म है; हालाँकि इससे भी छोटा रूप हो सकता है कि लोगों को इसके बारे में पता होना चाहिए।

यह एक शर्त के आधार पर एक चर एक मूल्य या किसी अन्य को असाइन करने के लिए बहुत आम है।

>>> 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'
>>> 

मुझे हमेशा सी टर्नरी सिंटैक्स पसंद आया, लेकिन पायथन इसे एक कदम आगे ले जाता है!

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


0

अन्य उत्तर पायथन टर्नरी ऑपरेटर के बारे में सही ढंग से बात करते हैं। मैं एक परिदृश्य का उल्लेख करके पूरक करना चाहूंगा जिसके लिए टर्नरी ऑपरेटर का अक्सर उपयोग किया जाता है लेकिन जिसके लिए एक बेहतर मुहावरा है। यह डिफ़ॉल्ट मान का उपयोग करने का परिदृश्य है।

मान लें कि यदि हम 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)

-2

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

1
जबकि इसी तरह की समस्याओं के लिए उपयोगी, यह एक टर्नरी स्थिति नहीं है। यह बदलने के लिए काम करता है x if x else y, लेकिन नहीं x if z else y
पर्किन्स

-2

कई ऑपरेटरों को चेन करने का एक साफ तरीका:

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

-2

मुझे डिफ़ॉल्ट अजगर सिंटैक्स बोझिल लगता है 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कथन की तुलना में अधिक अस्पष्ट ।
16

-3
is_spacial=True if gender = "Female" else (True if age >= 65 else False)

**

यह आपकी जरूरत के रूप में नेस्टेड हो सकता है। शुभकामनाएँ

**

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.