पायथन टर्नरी ऑपरेटर बिना अन्य


85

क्या पायथन में एक लाइन पर ऐसा करना संभव है?

if <condition>:
    myList.append('myString')

मैंने टर्नरी ऑपरेटर की कोशिश की है:

myList.append('myString' if <condition>)

लेकिन मेरी IDE ( MyEclipse ) को यह पसंद नहीं था, बिना else


1
आपका मतलब एक टर्नरी ऑपरेटर की तरह है जिसके तीन भाग नहीं हैं? क्या यह विरोधाभास नहीं है?
user207421

जवाबों:


119

हां, आप यह कर सकते हैं:

<condition> and myList.append('myString')

अगर <condition>गलत है, तो शॉर्ट-सर्किटिंग में किक होगी और राइट-हैंड साइड का मूल्यांकन नहीं किया जाएगा। यदि <condition>सत्य है, तो दाहिने हाथ की ओर का मूल्यांकन किया जाएगा और तत्व को जोड़ दिया जाएगा।

मैं सिर्फ इतना बताऊंगा कि ऊपर करना काफी गैर-व्यर्थ है, और यह संभवत: यह लिखना सबसे अच्छा होगा, चाहे:

if <condition>: myList.append('myString')

प्रदर्शन:

>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']

10
जबकि यह उत्तर तकनीकी रूप से सही है, यह एक अच्छा प्रोग्रामिंग अभ्यास नहीं है। चूंकि पायथन का उद्देश्य एक ऐसी भाषा होना है जो आसानी से पढ़ने योग्य हो, इस कोड को गैर-पायथन माना जाएगा।
मिस्टर लांस ई स्लोन

10
@ एलएस: मैं सहमत हूं, इसीलिए मैंने कहा कि यह संभव होगा कि केवल एक बयान का उपयोग करें। लेकिन मैंने उत्तर को थोड़ा और स्पष्ट कर दिया।
क्लाउडीउ

2
fyi दूसरा उदाहरण pep8 चेक्स को विफल करेगा: E701 multiple statements on one lineइसलिए नॉन- पाइथोनिक ...;)
कैस

1
@hard_working_ant "सही" तरीका x = object.get('attribute')उस स्थिति में होगा
विहलके

1
@wihlke: हाँ और आगे जोड़ना x = object.get ('विशेषता', कोई नहीं) डिफ़ॉल्ट रूप से कोई नहीं
hard_working_ant

45

कारण भाषा आपको वाक्यविन्यास का उपयोग करने की अनुमति नहीं देता है

variable = "something" if a_condition

इसके बिना else, उस मामले में a_condition == False, जहां variableअचानक अज्ञात है। हो सकता है कि यह तयशुदा हो None, लेकिन अजगर को आवश्यकता है कि सभी चर असाइनमेंट वास्तव में स्पष्ट असाइनमेंट में परिणत हों। यह आपके फ़ंक्शन कॉल जैसे मामलों पर भी लागू होता है, क्योंकि फ़ंक्शन को दिए गए मान का मूल्यांकन उसी तरह किया जाता है जैसे असाइनमेंट स्टेटमेंट का आरएचएस होगा।

इसी तरह, सभी returnको वास्तव में लौटना चाहिए, भले ही वे सशर्त returnएस हों। उदाहरण के लिए:

return variable if a_condition

अनुमति नहीं है, लेकिन

return variable if a_condition else None

की अनुमति दी जाती है, क्योंकि दूसरा उदाहरण स्पष्ट रूप से कुछ वापस करने की गारंटी है।


1
यह विडंबना है कि पायथन हमें इसका उपयोग करने की अनुमति नहीं देता है, ताकि चर कभी भी कोई भी variable=Noneकानूनी रूप से पूरी तरह से कानूनी न हो। : डी
गाइ

1
लेकिन मैं इसे इस तरह से उपयोग करना चाहता था: continue if i == 0एक लूप में।
कर्णावत

2
क्या आपको करने की अनुमति हैelse pass?
OldBunny2800

5
else passकाम नहीं करता क्योंकि टर्नरी अभिव्यक्ति को एक मूल्य वापस करना चाहिए जिसे पारित किया जा सकता है returnpassएक वैध returnमूल्य नहीं है ।
एम्मेट बटलर

4
मैं इस बात से सहमत नहीं हूं कि यह प्रेरणा वास्तविक कारण है, जो दी गई है if a_condition: variable = "something"और if a_condition: return variableकानूनी है। तो यह अनिवार्य रूप से अजगर का एक मनमाना वाक्यविन्यास विकल्प है।
कूलेंज

13
if <condition>: myList.append('myString')

नहीं तो नहीं। इसे एक पंक्ति में रखने की आवश्यकता क्यों है?

ध्यान दें कि "टर्नरी ऑपरेटर" एक ऑपरेटर है । किसी भी ऑपरेटर की तरह, इसे कुछ वापस करना होगा , इसलिए आप बिना टर्नरी ऑपरेटर के elseखंड के बिना कैसे हो सकते हैं ? यदि स्थिति सत्य जैसी नहीं है तो इसे क्या माना जाता है?


10

आप मूल रूप से do_thing() if <condition> else passनिर्माण के लिए पूछ रहे हैं (जो फेंक दिया जाएगा SyntaxError, अगर भाग गया)। जैसा कि मैंने अनुसंधान के दौरान (कुछ हद तक) इसी तरह के प्रश्न do_thing() if condition else None के करीब पाया है जैसा कि आप प्राप्त कर सकते हैं (जो कि अभी करने का एक और तरीका है <condition> and do_thing())। इसलिए, इस विचार और अन्य उत्तरों को संक्षेप में प्रस्तुत करने के लिए, यहाँ आपके विकल्प हैं:

  • if <condition>: myList.append('myString') - कम से कम 'हैकी' (और इस तरह से पसंदीदा) तरीका लगता है
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None

कम से कम hacky तरीका काम नहीं करता है। कम से कम REPL पर नहीं - एक सिंटैक्स त्रुटि मिलती है। ऐसा लगता है कि यह एक ही लाइन पर पूर्ववर्ती कोड के कारण होता है। इसके बजाय इसकी अपनी लाइन पर अमल करने की जरूरत है। लेकिन फिर भी उपयोगकर्ता इनपुट को इलिप्सिस को छोड़ना आवश्यक है।
अनजाने0059

3

myList.extend(['myString'] if condition else []) यह भी काम करेगा, हालांकि यह अन्य समाधानों की तुलना में अधिक काम है।


0

आप ऐसा कुछ कर सकते हैं:

myList.append('myString') if <condition> else False

या

myList.append('myString') if <condition> else 0

झूठी और 0 सूची में संलग्न नहीं हैं। यदि शर्त पूरी नहीं हुई तो लाइन को कुछ वापस करने की आवश्यकता है। आप 0 या गलत को किसी के साथ या किसी खाली स्ट्रिंग, या किसी भी चीज़ से बदल सकते हैं, और यह सूची को प्रभावित नहीं करेगा।
ज़ाचारी चॉदिनी

मुझे लगता है कि उस समय मेरा विचार एक सूची समझ के मामले में था। मेरी टिप्पणी हटा दी गई, डाउनवोट मुझे नहीं था। मुझे लगता है कि एक क्लीनर तरीका होगा, myList.append('myString') if True else _लेकिन अगर आप कुछ भी नहीं बता रहे हैं, तो कोई बात नहीं। मैं इस व्यक्ति के बारे में चिंतित हूँ, हालांकि वह समान तर्क के साथ सूची-बोध का प्रयास कर रहा है।
डेव लियू

0

अगर मैं एक शर्त के आधार पर एक सूची में वैकल्पिक तत्वों को जोड़ना चाहता हूँ तो मैं यह करूँगा।

nums = [
        1,
        2,
        3 if <condition> else None,
        4,
       ]
nums = [i for i in nums if i is not None]

यह सिर्फ किसी के साथ मूल्य को प्रतिस्थापित करता है यदि शर्त पूरी नहीं होती है और फिर बाद में, यह बिना किसी मूल्य के सूची को फिर से परिभाषित करता है। यदि वे शर्त पूरी करते हैं तो इस तरह वे अपने सूचकांक को संरक्षित करते हैं

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