एक पंक्ति में कई कथन कैसे रखें?


143

मुझे यकीन नहीं था कि इस सवाल को क्या शीर्षक देना चाहिए, अगर थोड़ा सा भी अनिच्छापूर्ण हो तो कोडिंग गोल्फ उचित लगता है।

मुझे पता है कि अजगर में थोड़ी बहुत समझ होती है लेकिन वे 'पढ़ना' बहुत कठिन लगता है। जिस तरह से मैं इसे देखता हूं, एक समझ निम्नलिखित कोड के समान हो सकती है:

for i in range(10): if i == 9: print('i equals 9')

यह कोड पढ़ने में बहुत आसान है कि वर्तमान में कैसे समझ में काम आता है, लेकिन मैंने देखा है कि आप एक लाइन में दो ':' नहीं कर सकते हैं ... यह मुझे याद है ...

मेरा प्रश्न:

वहाँ किसी भी तरह से मैं एक लाइन में निम्नलिखित उदाहरण मिल सकता है।

try:
    if sam[0] != 'harry':
        print('hello',  sam)
except:
    pass

कुछ इस तरह महान होगा:

try: if sam[0] != 'harry': print('hellp',  sam)
except:pass

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

इनपुट के लिए धन्यवाद ... और यहाँ एक स्माइली है : डी


यह कभी अपवाद क्यों होगा?
इग्नासियो वाज़केज़-अब्राम्स

1
सैम [2] मौजूद नहीं हो सकता है। यह एक काल्पनिक उदाहरण है। धन्यवाद
Rhys

4
पायथन में कुछ अलग है। हर चीज को एक पंक्ति में रखना समझ नहीं है।
फेलिक्स क्लिंग

मुझे इस हां की जानकारी है। धन्यवाद। मैं बस यह प्रदर्शित कर रहा था कि मुझे कैसे लगता है कि समझ बेहतर काम कर सकती है लेकिन उस बृहदान्त्र के कारण नहीं हो सकती जो मेरी समस्या / प्रश्न की जड़ है
Rhys

बस \nएस का उपयोग करें और इंडेंट के लिए रिक्त स्थान का उपयोग करें।

जवाबों:


144

दुर्भाग्य से, आप जो चाहते हैं वह पायथन के साथ संभव नहीं है (जो कमांड-लाइन वन-लाइनर कार्यक्रमों के लिए पायथन को बेकार कर देता है)। कोष्ठक का स्पष्ट उपयोग भी वाक्य रचना अपवाद से नहीं बचता है। आप अर्ध-बृहदान्त्र द्वारा अलग किए गए सरल कथनों के अनुक्रम से दूर हो सकते हैं:

for i in range(10): print "foo"; print "bar"

लेकिन जैसे ही आप एक निर्माण जोड़ते हैं जो एक इंडेंट ब्लॉक (जैसे if) का परिचय देता है, आपको लाइन ब्रेक की आवश्यकता होती है। इसके अलावा,

for i in range(10): print "i equals 9" if i==9 else None

कानूनी है और आप क्या चाहते हैं अनुमानित कर सकते हैं।

के रूप में try ... exceptबात: यह पूरी तरह से बेकार हो सकता है बिनाexcepttry"मैं इस कोड को चलाना चाहता हूं, लेकिन यह एक अपवाद फेंक सकता है"। यदि आप अपवाद की परवाह नहीं करते हैं, तो छोड़ दें try। लेकिन जैसे ही आप इसे डालते हैं, आप कह रहे हैं "मैं एक संभावित अपवाद को संभालना चाहता हूं"। passतो आप यह विशेष रूप से संभाल नहीं करना चाहते हैं कहते हैं। लेकिन इसका मतलब है कि आपका कोड चालू रहेगा, जो अन्यथा नहीं होगा।


1
दिलचस्प है, मुझे लगता है कि आपके बाद का उदाहरण उस उत्तर के करीब आता है जिसकी मुझे तलाश थी। धन्यवाद
Rhys

'ट्राई' प्रश्न के संबंध में ... व्हाट इफ, मुझे पता है कि कुछ बिंदु पर यह एक अपवाद फेंकने वाला है, लेकिन मैं चाहता हूं कि कोड चालू रहे ... उदाहरण के लिए, यह जांचने के लिए कि क्या कोई स्ट्रिंग पूर्णांक हो सकता है प्रयास करें: int (string) ... यदि यह नहीं हो सकता है, तो बस अगली पंक्ति के लिए जारी रखें, अपवाद की आवश्यकता नहीं है। मैं देख रहा हूं कि आप क्या कह रहे हैं, लेकिन क्या कोई अन्य तरीका है जो इस प्रकार की जाँच / त्रुटि-हैंडलिंग के लिए समायोजित कर सकता है
Rhys

4
पुन try:: पायथन सिंटैक्स नियम आपको केवल "प्रयास" खंड के साथ "खंड" को छोड़कर नहीं जाने देंगे। मैं क्या कर रहा हूँ कोशिश कर रहा है, केवल अपने कार्य को छोड़कर, और इसके बजाय इसे कॉल करें। जैसा if (checkint(s))...और def checkint(s): try: int(s)\nreturn True\nexcept: return False
थॉमस २

थॉमस, काश आपकी टिप्पणी कहीं प्रश्न का उत्तर होती, तो मैं इसे बढ़ा सकता था। अति उत्कृष्ट।
इवान एक्स

5
@ThomasH " (जो कमांड-लाइन वन-लाइनर कार्यक्रमों के लिए पायथन को बेकार बनाता है) ": मेरे लिए बाधा नहीं है। 95% मामलों में नई लाइन की आवश्यकता नहीं है। और बाकी \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr

52

आप अंतर्निहित निष्पादन कथन का उपयोग कर सकते हैं, उदाहरण के लिए:

exec("try: \n \t if sam[0] != 'harry': \n \t\t print('hello',  sam) \nexcept: pass")

जहां \nएक नई रेखा है और \tइसे इंडेंटेशन (एक टैब) के रूप में उपयोग किया जाता है।
इसके अलावा, आपको अपने द्वारा उपयोग किए जाने वाले रिक्त स्थान की गणना करनी चाहिए, इसलिए आपका इंडेंटेशन बिल्कुल मेल खाता है।

हालाँकि, जैसा कि अन्य सभी उत्तरों ने पहले ही कहा था, यह केवल तब उपयोग किया जाना है जब आपको वास्तव में इसे एक पंक्ति में रखना होगा।

exec यह एक खतरनाक बयान है (विशेषकर जब एक वेबपाइप का निर्माण) क्योंकि यह मनमाने ढंग से पायथन कोड के निष्पादन की अनुमति देता है।


4
धन्यवाद! इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए, क्योंकि यह वास्तव में दूसरों के विपरीत काम करता है। लेकिन निश्चित रूप से, ऐसा कभी न करें जब तक आपको करना न हो! मुझे वास्तव में इस सिंटैक्स की आवश्यकता है, क्योंकि मुझे स्क्रिप्ट को एक निश्चित एक-लाइन टेक्स्ट-बॉक्स में इनपुट करना है।
संजय मनोहर

धन्यवाद ! लाइफसेवर! मैं अपनी स्क्रिप्ट में इसका उपयोग नहीं करता हूं, लेकिन इंटरेक्टिव शेल में यह डीबगिंग के लिए उपयोगी है ... मैं अक्सर इंटरैक्टिव शेल छोड़ देता हूं और इसे स्वच्छ वातावरण प्राप्त करने के लिए पुनरारंभ करता हूं और फिर मुझे कुछ चरणों को दोहराना होगा, अर्थात आयात करना मॉड्यूल, कुछ फ़ंक्शन चला रहा है और फिर एक विशिष्ट फ़ंक्शन के साथ कुछ परीक्षण करता है। Soooo, मैं एक ऑन्लाइनर में "एक मॉड्यूल आयात करने, कुछ कार्यों को चलाने" लगाने का एक तरीका ढूंढ रहा था, इसलिए मैं जल्दी से इसे इतिहास से वापस बुला सकता हूं और इसे चला सकता हूं (बजाय इतिहास से 5 अलग-अलग वस्तुओं को वापस कॉल करने के लिए) +1
oneindelijk

exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass")
nicer

धन्यवाद kxr :) (मैंने उत्तर को बेहतर बनाने के लिए आपके विचार का उपयोग किया)
06:47

7

हाँ यह पोस्ट 8 साल पुरानी है, लेकिन किसी को यहाँ आने पर भी जवाब की तलाश है: अब आप सिर्फ अर्धविराम का उपयोग कर सकते हैं। हालाँकि, यदि आप / elif / अन्यथा staments का उपयोग नहीं करते हैं, तो / छोरों के लिए, और आप फ़ंक्शन को परिभाषित नहीं कर सकते। इसका मुख्य उपयोग आयातित मॉड्यूल का उपयोग करते समय होगा जहां आपको किसी भी फ़ंक्शन को परिभाषित करने या किसी भी / elif / और / for / जबकि स्टेटमेंट / लूप का उपयोग करने की आवश्यकता नहीं है।

यहाँ एक उदाहरण है कि एक गीत के कलाकार, गीत का नाम, और गीत के लिए प्रतिभा खोजता है:

import bs4, requests; song = input('Input artist then song name\n'); print(bs4.BeautifulSoup(requests.get(f'https://genius.com/{song.replace(" ", "-")}-lyrics').text,'html.parser').select('.lyrics')[0].text.strip())

6

मैं यह नहीं करने की सलाह देता हूं ...

आप जो वर्णन कर रहे हैं वह कोई समझ नहीं है।

अजगर कोड के लिए पीईपी 8 स्टाइल गाइड है, जो मैं करना सलाह देते हैं, इस यौगिक बयान पर क्या कहना है:

  • यौगिक कथन (एक ही पंक्ति पर कई कथन) आम तौर पर हतोत्साहित किए जाते हैं।

हाँ:

      if foo == 'blah':
          do_blah_thing()
      do_one()
      do_two()
      do_three()

बल्कि नहीं:

      if foo == 'blah': do_blah_thing()
      do_one(); do_two(); do_three()

यहाँ भेद करने के लिए एक नमूना समझ है:

>>> [i for i in xrange(10) if i == 9]
[9]

6

मैं इसे प्रोत्साहित नहीं करता, लेकिन कहते हैं कि आप कमांड लाइन पर हैं, आपके पास पायथन के अलावा कुछ नहीं है और आपको वास्तव में वन-लाइनर की आवश्यकता है, आप ऐसा कर सकते हैं:

python -c "$(echo -e "a='True'\nif a : print 1")"

हम यहां क्या कर रहे हैं, \nपायथन कोड का मूल्यांकन करने से पहले पूर्व प्रसंस्करण है ।

वह सुपर हैडी है! इस तरह कोड न लिखें।


1

शायद "और" या "या" के साथ

"या" लिखने की झूठी आवश्यकता के बाद

सच लिखने के बाद "और"

पसंद

n=0
def returnsfalse():
    global n
    n=n+1
    print ("false %d" % (n))
    return False
def returnstrue():
    global n
    n=n+1
    print ("true %d" % (n))
    return True
n=0
returnsfalse() or  returnsfalse() or returnsfalse() or returnstrue() and returnsfalse()

परिणाम:

false 1
false 2
false 3
true 4
false 5

या शायद पसंद है

(returnsfalse() or true) and (returnstrue() or true) and ...

Google पर खोज करने से "एक पंक्ति में कई मूर्तियों को कैसे रखा जाए", सीधे प्रश्न का उत्तर नहीं देता है, शायद किसी और को इसकी आवश्यकता है।


1

एक python -cउन्मुख समाधान के लिए, और बश शेल का उपयोग करने के लिए, हां आपके पास इस उदाहरण में एक सरल एक-पंक्ति सिंटैक्स हो सकता है:

मान लीजिए कि आप ऐसा कुछ करना चाहते हैं ( except: passअनुदेश सहित आपके नमूने के समान ):

python -c  "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path

यह काम नहीं करेगा और इस त्रुटि का उत्पादन करेगा:

  File "<string>", line 1
    from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
                                                                                                                  ^
SyntaxError: unexpected character after line continuation character `

इसका कारण यह है कि बैश और पायथन इंटरप्रिटेशन ऑफ \nएस्केप सीक्वेंस के बीच प्रतिस्पर्धा । समस्या को हल करने के लिए एक $'string'बैश वाक्यविन्यास का उपयोग करके \nबैश व्याख्या को पहले पायथन के लिए मजबूर किया जा सकता है । उदाहरण को और अधिक चुनौतीपूर्ण बनाने के लिए मैंने end=..\n..पायथन प्रिंट कॉल में एक विशिष्ट पायथन विनिर्देशन जोड़ा : अंत में आप \nबैश और पायथन से बीओटीएच व्याख्याओं को एक साथ काम करने में सक्षम होंगे , प्रत्येक चिंता के पाठ के टुकड़े पर। ताकि अंत में उचित समाधान इस तरह हो:

python -c  $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path

जो बिना किसी त्रुटि के उचित स्वच्छ आउटपुट की ओर जाता है:

/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello

नोट: यह execउन्मुख समाधानों के साथ-साथ काम करना चाहिए , क्योंकि समस्या अभी भी वही है (बैश और पायथन दुभाषिए प्रतियोगिता)।

टिप्पणी 2: एक कुछ की जगह समस्या वैकल्पिक हल कर सकता है \nकुछ लोगों द्वारा ;, लेकिन यह जबकि मेरी समाधान हमेशा "एक पंक्ति का" क्लासिक बहु लाइन अजगर कार्यक्रम के किसी भी भाग के लिए अनुमति देता है, काम किसी भी समय (अजगर निर्माणों के आधार पर) नहीं होगा।

नोट 3: बेशक, जब एक-अस्तर, एक को हमेशा पायथन रिक्त स्थान और इंडेंटेशन का ख्याल रखना पड़ता है, क्योंकि वास्तव में हम यहां "एक-अस्तर" कड़ाई से नहीं हैं, लेकिन \nबैश और पायथन के बीच भागने के क्रम का एक उचित मिश्रित प्रबंधन कर रहे हैं । यह है कि हम क्लासिक मल्टी-लाइन पायथन कार्यक्रम के किसी भी टुकड़े से कैसे निपट सकते हैं। समाधान का नमूना इसे भी दिखाता है।


0

आप बहुत सी चीजों का मिश्रण कर रहे हैं, जिससे आपके प्रश्न का उत्तर देना मुश्किल हो जाता है। संक्षिप्त उत्तर है: जहां तक ​​मुझे पता है, आप जो करना चाहते हैं, वह केवल पायथन में संभव नहीं है - अच्छे कारण के लिए!

इसका लंबा जवाब यह है कि आपको पायथन के साथ खुद को और अधिक आरामदायक बनाना चाहिए, यदि आप पायथन में विकास करना चाहते हैं। पढ़ना मुश्किल नहीं है। हो सकता है कि आप उन्हें पढ़ने के लिए अभ्यस्त न हों, लेकिन अगर आप पाइथन डेवलपर बनना चाहते हैं तो आपको इसकी आदत डालनी होगी। यदि कोई ऐसी भाषा है जो आपकी आवश्यकताओं को बेहतर बनाती है, तो उसे चुनें। यदि आप पाइथन को चुनते हैं, तो पाइथोनिक तरीके से समस्याओं को हल करने के लिए तैयार रहें। बेशक आप अजगर के खिलाफ लड़ने के लिए स्वतंत्र हैं, लेकिन यह मजेदार नहीं होगा! ;-)

और अगर आप हमें बताएंगे कि आपकी वास्तविक समस्या क्या है, तो आपको इसका जवाब भी मिल सकता है। "एक पंक्ति में कुछ प्राप्त करना" हमें आमतौर पर एक प्रोग्रामिंग समस्या नहीं है।


मुझे अजगर से प्यार है! मैं बस यह प्रदर्शित कर रहा था कि मुझे क्या लगता है कि समझ बेहतर हो सकती है, लेकिन बृहदान्त्र के कारण नहीं हो सकता है, जो मेरी समस्या / प्रश्न का मूल है ... मैं आपके उत्तर से देखता हूं कि कॉलोन्स द्वारा अलग किए गए बहुस्तरीय प्रयास जैसे कि प्रयास: यदि सैम [ 0]? = 'हार्डी': प्रिंट ('हेल्प', सैम) संभव नहीं है ... क्या यह सही है? धन्यवाद ... im बस कुछ डिबग उद्देश्यों के लिए इसका उपयोग कर रहा हूं, इसलिए मैं छोटे सरल कोड की तलाश कर रहा हूं जो आसानी से निकाले जा सकते हैं और बहुत सारे स्थान नहीं लेते हैं
Rhys

हां, जहां तक ​​मुझे पता है कि यह संभव नहीं है। लेकिन जैसा कि पहले से ही किसी ने कहा है: आप जो करते हैं वह समझ से अलग है। यदि आप आसानी से कोड को हटाने में सक्षम होना चाहते हैं, तो इसे फ़ंक्शन में डालें। "को छोड़कर: पास" के बारे में -प्रतिरक्षा, एक डेकोरेटर के बारे में सोचें जो अपवाद या उस तरह की उपेक्षा करता है। फिर से: हमेशा अपनी वास्तविक समस्या का वर्णन करने की कोशिश करें, न कि आपके पास पहले से मौजूद समाधान के साथ समस्या। ;-)
अचिम

3
"आप बहुत सारी चीजों को मिला रहे हैं" जैसे उत्तेजक बयानों के लिए लोगों को अपने जवाब को बिना किसी रोक-टोक के क्यों शुरू करना पड़ता है? नीचे वोट अगर मैं कर सकता हूँ
जॉन जियांग

"एक पंक्ति में कुछ प्राप्त करना" हमें आम तौर पर एक प्रोग्रामिंग समस्या नहीं है। "-> लेकिन वह अक्सर एक sysadmin समस्या है, इसलिए इस पहलू में सवाल अभी भी प्रासंगिक है।
एलेक्स एफ

0

इसका एकान्त संभव ;-)

# not pep8 compatible^
sam = ['Sam',]
try: print('hello',sam) if sam[0] != 'harry' else rais
except: pass

आप अजगर में बहुत बदसूरत सामान कर सकते हैं जैसे:

def o(s):return''.join([chr(ord(n)+(13if'Z'<n<'n'or'N'>n else-13))if n.isalpha()else n for n in s])

जो एक पंक्ति में 99 अक्षरों के साथ रोट 13 / सेसा एन्क्रिप्शन के लिए कार्य करता है।


-2

यहाँ एक उदाहरण है:

i for रेंज (80, 90): प्रिंट (i, अंत = "") अगर (i! = 89) और प्रिंट (i)

आउटपुट: 80 81 82 83 84 85 85 87 88 89

>

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