एक लाइन अगर हालत-असाइनमेंट


140

मेरे पास निम्न कोड है

num1 = 10
someBoolValue = True

मैं का मूल्य निर्धारित करने की आवश्यकता num1करने के लिए 20करता है, तो someBoolValueहै True; और अन्यथा कुछ भी मत करो। तो, यहाँ उस के लिए मेरा कोड है

num1 = 20 if someBoolValue else num1

क्या कोई ऐसा ...else num1भाग है जिसे मैं साफ करने के लिए भाग से बच सकता हूं ? के बराबर

if someBoolValue:
    num1 = 20

मैंने इसे ...else passइस तरह से बदलने की कोशिश की num1=20 if someBoolValue else pass:। मुझे मिला सब सिंटैक्स त्रुटि थी। और न ही मैं ...else num1भाग को छोड़ सकता था ।


2
बस इसे सभी में बदल दें num1 = 20 if someBoolValue else 10। फिर आप num1=10लाइन भी बचा लेते हैं ?
थॉमस अहले

धन्यवाद। लेकिन यह बिल्कुल मेरा कोड नहीं है। मेरा मतलब है कि num1पहले से ही मौजूद है ...
bdhar

जवाबों:


195

मुझे नहीं लगता कि पायथन में यह संभव है, क्योंकि आप जो वास्तव में करने की कोशिश कर रहे हैं वह संभवतः कुछ इस तरह से विस्तारित हो जाता है:

num1 = 20 if someBoolValue else num1

यदि आप बाहर करते हैं else num1, तो आपको एक सिंटैक्स त्रुटि प्राप्त होगी क्योंकि मुझे पूरा यकीन है कि असाइनमेंट को वास्तव में कुछ वापस करना होगा।

जैसा कि दूसरों ने पहले ही उल्लेख किया है, आप ऐसा कर सकते हैं, लेकिन यह बुरा है क्योंकि आप शायद अपने आप को भ्रमित कर लेंगे जब अगले दिन कोड के उस टुकड़े को पढ़ना होगा:

if someBoolValue: num1=20

num1 = someBoolValue and 20 or num1ठीक उसी कारण से मैं इसका बहुत बड़ा प्रशंसक नहीं हूं । मुझे वास्तव में दो बार सोचना है कि वह क्या कर रहा है।

वास्तव में आप जो करना चाहते हैं उसे प्राप्त करने का सबसे अच्छा तरीका मूल संस्करण है:

if someBoolValue:
    num1 = 20

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

इसके अलावा, साइड नोट के रूप में, num1 = 20 if someBoolValueरूबी कोड मान्य है, क्योंकि रूबी थोड़ा अलग तरीके से काम करता है।


8
प्रति PEP-308 ( docs.python.org/2.5/whatsnew/pep-308.html ) के रूप में, अगर में, में सशर्त अभिव्यक्ति स्पष्ट किया जा सकता है num1 = (20 if someBoolValue else num1)
haridsv

46

इसे इस्तेमाल करो:

num1 = 20 if someBoolValue else num1

3
यह वही है जो मैं उपयोग कर रहा हूँ .. और एक वैकल्पिक की तलाश में .. धन्यवाद वैसे भी !!
bdhar

इस ब्लॉक को कैसे कॉल करें? मेरा मतलब है कि यह क्या नाम है?
फात

1
यह एक टर्निरी ऑपरेटर है
क्रिस मेस

यदि हम किसी अन्य स्टेटमेंट में समाप्त होते हैं तो एक अनावश्यक असाइनमेंट को प्रस्तुत करने के बाद बड़े डेटा सेट के माध्यम से लूपिंग करते समय इस दृष्टिकोण का उपयोग नहीं करना चाहिए।
dapc

21

एक पंक्ति में:

if someBoolValue: num1 = 20

लेकिन ऐसा मत करो। यह शैली सामान्य रूप से अपेक्षित नहीं है। लोग स्पष्टता और निरंतरता के लिए लंबे रूप को पसंद करते हैं।

if someBoolValue:
    num1 = 20

(समान रूप से, ऊंट कैप से बचा जाना चाहिए। इसलिए उपयोग करें some_bool_value।)

ध्यान दें कि एक भाग के बिना एक इन-लाइन अभिव्यक्ति मौजूद नहीं है क्योंकि विधेय गलत होने पर रिटर्न वैल्यू नहीं होगी। हालाँकि, अभिव्यक्तियों में सभी मामलों में स्पष्ट रूप से परिभाषित वापसी मूल्य होना चाहिए। यह रूबी या पर्ल के रूप में उपयोग से अलग है।some_value if predicateelse


2
क्योंकि यह पढ़ना मुश्किल हो जाता है और आप शायद अपने ही कोड से भ्रमित हो रहे हैं, और यह कभी अच्छा विचार नहीं है।
फ्रॉस्ट

@bdhar, आप इसे एक पंक्ति में क्यों रखना चाहते हैं? यह किसी भी तेजी से नहीं चलेगा, यह सिर्फ अन्य लोगों के लिए पढ़ने के लिए कठिन होगा
जॉन ला रोय

1
@gnibbler, वास्तव में कोई कारण नहीं। मैं बेहतर पठनीयता के साथ एक छोटे रूप की तलाश कर रहा था ..
bdhar

17

आप निम्न में से किसी एक का उपयोग कर सकते हैं:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

1
नाइस वन लाइनर सशर्त असाइनमेंट
minhas23

उस "संरचना" को कैसे कहा जाता है? मैंने कभी नहीं देखा कि पायथन सीखने के ~ 6 महीनों में।
Guimoute

1
कम से कम ये असाइनमेंट नहीं हैं, जब तक कि आप उनके सामने एक नहीं रखते हैं, और दूसरा, वे यहां वर्णित तरीके से काम नहीं करेंगे। पहले एक ट्यूपल बनाता है, फिर इंडेक्स द्वारा इसके तत्वों में से एक को चुनता है। यह केवल उन परीक्षणों के लिए काम करेगा जो -1 और 1, या True/ के बीच पूर्णांक लौटाते हैं False, क्योंकि boolउप-वर्ग है int। सभी मामलों में जहां परीक्षण कुछ ऐसा लौटाता है जो सिर्फ सही मूल्यांकन करता है, यह अपवाद के साथ विफल होता है। दूसरा केवल तब तक काम करता है जब तक कि trueValवह स्वयं गलत का मूल्यांकन न कर ले, जिसके परिणामस्वरूप falseValपरीक्षण के सत्य होने पर भी मधुमक्खी को सौंपा जाएगा ।
बछसौ

यह अच्छी तरह से छोटा है, लेकिन सुरक्षित रूप से "अनुशंसित पैटर्न" के रूप में उपयोग करने के लिए बहुत मुश्किल है , बाक्साऊ की उपरोक्त टिप्पणी देखें ... (इसलिए मैंने इसे
डाउनवोट

6

नहीं, मुझे लगता है कि आप उम्मीद कर रहे थे कि कुछ num1 = 20 if someBoolValueकाम करेगा, लेकिन ऐसा नहीं है। मुझे लगता है कि सबसे अच्छा तरीका यह है ifकि आपने इसे लिखा है:

if someBoolValue:
    num1 = 20

5
num1 = 10 + 10*(someBoolValue is True)

यह मेरा नया अंतिम उत्तर है। पहले उत्तर इस प्रकार था और बताई गई समस्या के लिए ओवरकिल था। Getting_too_clever == not Good। यहाँ पहले से जवाब है ... अभी भी अच्छा है अगर आप एक चीज़ Trueकोंड के लिए और दूसरा जोड़ना चाहते हैं False:

num1 = 10 + (0,10)[someBoolValue is True]

आपने उल्लेख किया है num1कि पहले से ही एक मूल्य होगा जिसे अकेला छोड़ दिया जाना चाहिए। मुझे num1 = 10लगता है कि यह पोस्ट का पहला बयान है, इसलिए ऑपरेशन 20को जोड़ना है 10

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue is True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

इस उत्पादन का उत्पादन किया

num1 = 20
someBoolValue = True

अब मैं सोच रहा हूं कि मुझे 'num1 = 10 + 10 * (someBoolValue == ट्रू)' समस्या का मूल रूप से 'गलत' स्थिति के रूप में परिभाषित करना चाहिए। यदि इसे 'गलत' के लिए एक अलग मूल्य जोड़ने का एक विकल्प होने की आवश्यकता है, तो पूर्व उत्तर एक बेहतर फिट है। क्या मैं अपनी पोस्ट को संपादित करूं या टिप्पणियों में ऐसा करूं?
मिकीबी


2

यदि आप कुछ बूलियन सच है, तो आप एक विधि लागू करना चाहते हैं, तो आप else Noneत्रिशूल को समाप्त कर सकते हैं ।

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

1

यदि एक लाइन कोड निश्चित रूप से आपके लिए होने जा रहा है, तो पायथन 3.8 असाइनमेंट एक्सप्रेशन को "वालरस ऑपरेटर" के नाम से प्यार से पेश करता है।

:=

someBoolValue and (num := 20)

20को सौंपा जाएगा num, तो पहले बूलियन अभिव्यक्ति है True। असाइनमेंट कोष्ठक के अंदर होना चाहिए, अन्यथा आपको एक सिंटैक्स त्रुटि मिलेगी।

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

0

भविष्य में Google से आने वाले यात्री के लिए, यहां एक नया तरीका है (अजगर 3.8 से उपलब्ध):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)


-1

यहाँ मैं क्या सुझाव दे सकता हूँ। एक और वैरिएबल का उपयोग करें यदि क्लॉज को प्राप्त करें और इसे num1 पर असाइन करें।

कोड:

num2 =20 if someBoolValue else num1
num1=num2


-1

आप इसे इस तरह से कर सकते हैं।

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

आप अपनी समस्या को इस तरह से हल कर सकते हैं लेकिन, 'कोशिश / सिवाय ब्लॉक के' का उपयोग करना अजगर के लिए सबसे अच्छा अभ्यास नहीं है।

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