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



operators ternary-operator conditional-operator python-2.5 (20)

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


Answers

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

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

यहां मैं कुछ प्रोग्रामिंग भाषाओं के बीच 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

हालांकि, एक संभावित समस्या है, जो यदि 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)

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


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

[expression] and [on_true] or [on_false]

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

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



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

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

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

स्रोत: ?:


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

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

[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

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

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

सिंटेक्स: टर्नरी ऑपरेटर को इस प्रकार दिया जाएगा:

[on_true] if [expression] else [on_false]

जैसे

x, y = 25, 50
big = x if x < y else y
print(big)

हां, यह संस्करण 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

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


दस्तावेज़ीकरण से :

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

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

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

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


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

(falseValue, trueValue)[test]

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

(falseValue, trueValue)[test == True]

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

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

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

उदाहरण के लिए

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'

हाँ।

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

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

[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] ;


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

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

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

, बन जाता है:

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

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


हाँ:

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

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

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


जैसा कि पहले से ही कहा गया है ??!??! अनिवार्य रूप से दो trigraphs ( ??! और ??! फिर से) एक साथ मिल गए हैं जिन्हें प्रतिस्थापित किया गया है || , यानी लॉजिकल या , प्रीप्रोसेसर द्वारा।

निम्नलिखित ट्रिग्राफ वाली निम्नलिखित छवि को वैकल्पिक ट्रिग्राफ संयोजनों को असंबद्ध करने में मदद करनी चाहिए:

( सी से ली गई छवि : एक संदर्भ मैनुअल 5 वां संस्करण )

तो एक ऐसा ट्रिगर जो दिखता है ??(??) अंततः मानचित्र [] , ??(??)??(??) को बदल देगा [][] और इसी तरह, आपको विचार मिल जाएगा।

चूंकि प्रीप्रोकैसिंग के दौरान ट्राग्राफ को प्रतिस्थापित किया जाता है, इसलिए आप एक मूर्खतापूर्ण trigr.c प्रोग्राम का उपयोग करके आउटपुट का दृश्य प्राप्त करने के लिए cpp का उपयोग कर सकते हैं:

void main(){ const char *s = "??!??!"; } 

और इसके साथ प्रसंस्करण:

cpp -trigraphs trigr.c 

आपको एक कंसोल आउटपुट मिलेगा

void main(){ const char *s = "||"; }

जैसा कि आप देख सकते हैं, विकल्प- -trigraphs को निर्दिष्ट किया जाना चाहिए या अन्यथा cpp चेतावनी जारी करेगा; यह इंगित करता है कि ट्रिग्राफ उन लोगों को भ्रमित करने वाले लोगों के अलावा अतीत और कोई आधुनिक मूल्य की बात नहीं है जो उन्हें टक्कर दे सकते हैं

ट्रिग्राफ के परिचय के पीछे तर्क के लिए, ISO/IEC 646 के इतिहास खंड को देखते समय बेहतर समझ में आता है:

आईएसओ / आईईसी 646 और इसके पूर्ववर्ती ASCII (एएनएसआई एक्स 3.4) ने बड़े पैमाने पर दूरसंचार उद्योग में चरित्र एन्कोडिंग के संबंध में मौजूदा अभ्यास का समर्थन किया।

चूंकि एएससीआईआई ने अंग्रेजी के अलावा अन्य भाषाओं के लिए आवश्यक कई पात्रों को उपलब्ध नहीं कराया था, इसलिए कई राष्ट्रीय रूपों को बनाया गया था जो आवश्यक लोगों के साथ कुछ कम इस्तेमाल किए गए पात्रों को प्रतिस्थापित करते थे

(जोर मेरा)

तो, संक्षेप में, कुछ आवश्यक पात्रों (जिनके लिए एक ट्रिगर मौजूद है) कुछ राष्ट्रीय रूपों में प्रतिस्थापित किए गए थे। यह उन वर्णों से युक्त त्रिकोणों का उपयोग करके वैकल्पिक प्रतिनिधित्व का कारण बनता है जो अन्य प्रकारों के आसपास थे।





python operators ternary-operator conditional-operator python-2.5