วิธีการใส่หลาย ๆ คำสั่งในหนึ่งบรรทัด?


143

ฉันไม่แน่ใจภายใต้ชื่อที่จะไตร่ตรองคำถามนี้อย่างแน่นอนกอล์ฟการเข้ารหัสดูเหมือนจะเหมาะสมถ้าไม่เจาะจง

ฉันรู้ความเข้าใจเล็กน้อยในงูหลาม แต่พวกเขาดูยากมากที่จะ 'อ่าน' วิธีที่ฉันเห็นมันความเข้าใจอาจบรรลุเหมือนกับรหัสต่อไปนี้:

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

รหัสนี้อ่านง่ายกว่าวิธีการทำความเข้าใจในขณะนี้ แต่ฉันสังเกตเห็นว่าคุณไม่สามารถมีสอง ':' ในหนึ่งบรรทัด ... นี่ทำให้ฉันด้วย ...

คำถามของฉัน:

มีวิธีใดบ้างที่ฉันจะได้รับตัวอย่างต่อไปนี้ใน ONE LINE

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

สิ่งนี้จะดีมาก:

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

แต่อีกครั้งฉันพบความขัดแย้ง ':' ฉันยังรักที่จะรู้ว่ามีวิธีที่จะลอง (หรือบางอย่างเช่น) โดยไม่มียกเว้นดูเหมือนว่าไม่มีจุดหมายทั้งหมดที่ฉันต้องใส่ยกเว้น: ผ่านที่นั่น มันเป็นสายที่สูญเปล่า

ขอบคุณสำหรับการป้อนข้อมูล ... และที่นี่มีรอยยิ้ม: D


ทำไมมันถึงมีข้อยกเว้น?
Ignacio Vazquez-Abrams

1
sam [2] อาจไม่มีอยู่ มันเป็นตัวอย่างสมมุติ ขอบคุณ
Rhys

4
ความเข้าใจเป็นสิ่งที่แตกต่างในงูหลาม การวางทุกอย่างไว้ในบรรทัดเดียวไม่ใช่ความเข้าใจ
เฟลิกซ์

ฉันรู้เรื่องนี้แล้วใช่ ขอบคุณ ฉันแค่แสดงให้เห็นว่าฉันคิดว่าความเข้าใจอาจทำงานได้ดีขึ้น แต่ไม่สามารถทำได้เนื่องจากลำไส้ใหญ่ซึ่งเป็นต้นเหตุของปัญหา / คำถามของฉัน
Rhys

เพียงแค่ใช้\nพื้นที่ว่างสำหรับเยื้อง

คำตอบ:


144

น่าเสียดายสิ่งที่คุณต้องการไม่สามารถทำได้ด้วย Python (ซึ่งทำให้ Python ใกล้เคียงกับไร้ประโยชน์สำหรับโปรแกรมบรรทัดคำสั่งหนึ่งบรรทัด) แม้แต่การใช้วงเล็บอย่างชัดเจนก็ไม่ได้หลีกเลี่ยงข้อยกเว้นทางไวยากรณ์ คุณสามารถออกไปกับลำดับของงบง่าย ๆ คั่นด้วยเซมิโคลอน:

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สิ่งที่มันจะไร้ประโยชน์โดยสิ้นเชิงโดยไม่ต้อง บอกว่า "ฉันต้องการเรียกใช้รหัสนี้ แต่อาจทำให้เกิดข้อยกเว้น" หากคุณไม่สนใจเกี่ยวกับข้อยกเว้นออกไป แต่ทันทีที่คุณใส่เข้าไปคุณกำลังพูดว่า "ฉันต้องการจัดการกับข้อยกเว้นที่อาจเกิดขึ้น" แล้วพูดว่าคุณต้องการที่จะได้จัดการกับมันโดยเฉพาะ แต่นั่นหมายความว่ารหัสของคุณจะยังคงทำงานต่อไปซึ่งจะไม่เป็นอย่างอื่นexcepttrytrypass


1
น่าสนใจฉันคิดว่าตัวอย่างหลังของคุณใกล้เคียงกับคำตอบที่ฉันกำลังมองหา ขอบคุณ
Rhys

เกี่ยวกับคำถาม 'ลอง' ... จะเกิดอะไรขึ้นถ้าฉันรู้ ณ จุดหนึ่งมันจะโยนข้อยกเว้น แต่ฉันต้องการให้โค้ดทำงานต่อไป ... เช่นเพื่อตรวจสอบว่าสตริงสามารถเป็นจำนวนเต็มได้ไหม ลอง: int (สตริง) ... หากไม่สามารถทำได้ให้ไปที่บรรทัดถัดไปโดยไม่จำเป็นต้องมีข้อยกเว้น ฉันเห็นสิ่งที่คุณกำลังพูด แต่มีวิธีอื่นที่สามารถรองรับการตรวจสอบ / จัดการข้อผิดพลาดประเภทนี้ได้ไหม
Rhys

4
Re try:: กฎไวยากรณ์ของ Python นั้นจะไม่ทำให้คุณสามารถใช้ประโยค "try" ได้โดยไม่ต้องมีคำสั่ง "ยกเว้น" สิ่งที่ฉันทำคือการลองฟังก์ชั่นยกเว้นในตัวเองและเรียกสิ่งนี้แทน กดไลค์if (checkint(s))...และ def checkint(s): try: int(s)\nreturn True\nexcept: return False
ThomasH

โทมัสฉันหวังว่าความคิดเห็นของคุณเป็นคำตอบสำหรับคำถามที่ฉันสามารถโหวตได้ ยอดเยี่ยม
Ivan X

5
@ThomasH " (ซึ่งทำให้ Python ใกล้เคียงกับไร้ประโยชน์สำหรับโปรแกรมบรรทัดคำสั่งหนึ่งบรรทัด) ": ไม่ขัดขวางฉัน กรณี 95% ไม่จำเป็นต้องขึ้นบรรทัดใหม่ และที่เหลือผ่าน \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr

52

คุณสามารถใช้คำสั่ง exec ในตัวเช่น:

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

\nบรรทัดใหม่อยู่ที่ไหนและ\tใช้เป็นการเยื้อง (แท็บ)
นอกจากนี้คุณควรนับช่องว่างที่คุณใช้เพื่อให้การเยื้องตรง

อย่างไรก็ตามตามคำตอบอื่น ๆ ทั้งหมดที่กล่าวไปแล้วนี่เป็นเพียงการใช้เมื่อคุณต้องใส่มันในบรรทัดเดียวเท่านั้น

exec ค่อนข้างเป็นคำสั่งที่อันตราย (โดยเฉพาะเมื่อสร้าง webapp) เนื่องจากอนุญาตให้มีการดำเนินการของรหัส Python


4
ขอบคุณ! ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องเพราะใช้งานได้จริงไม่เหมือนกับคำตอบอื่น ๆ แต่แน่นอนว่าไม่เคยทำเช่นนี้จนกว่าคุณจะต้อง! ฉันต้องการไวยากรณ์นี้จริง ๆ เนื่องจากฉันต้องใส่สคริปต์ลงในกล่องข้อความบรรทัดเดียวคงที่
Sanjay Manohar

ขอบคุณมาก! ผู้ช่วยชีวิต! ฉันไม่ได้ใช้สิ่งนี้ในสคริปต์ของฉัน แต่ในเชลล์แบบโต้ตอบสิ่งนี้มีประโยชน์สำหรับการดีบัก ... ฉันมักจะออกจากเชลล์แบบโต้ตอบและรีสตาร์ทเพื่อให้ได้สภาพแวดล้อมที่สะอาดและจากนั้นฉันต้องทำซ้ำขั้นตอนบางอย่างเช่นการนำเข้า โมดูลเรียกใช้ฟังก์ชั่นบางอย่างจากนั้นทำการทดสอบด้วยฟังก์ชั่นเฉพาะ Soooo ฉันกำลังมองหาวิธีที่จะ "นำเข้าโมดูลทำงานบางฟังก์ชั่น" ใน oneliner ดังนั้นฉันสามารถโทรกลับจากประวัติและเรียกใช้อย่างรวดเร็ว (แทนที่จะต้องโทรกลับ 5 รายการที่แตกต่างจากประวัติ) +1
oneindelijk

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

ขอบคุณ kxr :) (ผมใช้ความคิดของคุณเพื่อปรับปรุงคำตอบ)
elecprog

7

ใช่โพสต์นี้มีอายุ 8 ปี แต่ในกรณีที่มีใครบางคนมาที่นี่และกำลังมองหาคำตอบ: ตอนนี้คุณสามารถใช้เครื่องหมายอัฒภาคได้แล้ว อย่างไรก็ตามคุณไม่สามารถใช้ถ้า / elif / else staments สำหรับ / while loops และคุณไม่สามารถกำหนดฟังก์ชันได้ การใช้งานหลักของสิ่งนี้คือเมื่อใช้โมดูลที่อิมพอร์ตซึ่งคุณไม่จำเป็นต้องกำหนดฟังก์ชั่นใด ๆ หรือใช้ if / elif / else / for / while statement / ลูป

นี่คือตัวอย่างที่นำศิลปินของเพลงชื่อเพลงและค้นหาอัจฉริยะสำหรับเนื้อเพลง:

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

ฉันไม่แนะนำให้ทำเช่นนี้ ...

สิ่งที่คุณกำลังอธิบายไม่ใช่ความเข้าใจ

คู่มือสไตล์ PEP 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 และคุณต้องใช้สายการบินเดียวคุณสามารถทำได้:

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

สิ่งที่เราทำที่นี่คือการประมวลผลล่วงหน้า\nก่อนการประเมินโค้ด Python

นั่นมันแฮ็คสุด ๆ ! อย่าเขียนรหัสเช่นนี้


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วิธีแก้ปัญหาและให้คุณใช้ Bash เชลล์ได้คุณสามารถมีไวยากรณ์แบบบรรทัดเดียวแบบง่าย ๆ ในตัวอย่างนี้

สมมติว่าคุณต้องการทำสิ่งนี้ (คล้ายกับตัวอย่างของคุณรวมถึง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 `

นี่เป็นเพราะการแข่งขันระหว่าง Bash และ Python การตีความของ\nescape sequences เพื่อแก้ปัญหาหนึ่งสามารถใช้$'string'ไวยากรณ์ Bash เพื่อบังคับให้\nตีความ Bash ก่อน Python เพื่อให้ตัวอย่างท้าทายยิ่งขึ้นฉันได้เพิ่มend=..\n..ข้อกำหนดทั่วไปของ Python ในการเรียกใช้งานการพิมพ์ของ Python: ในตอนท้ายคุณจะได้รับ\nการตีความทั้งสองจากการทุบตีและ Python ทำงานร่วมกัน ดังนั้นในที่สุดทางออกที่เหมาะสมก็เป็นเช่นนี้:

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โซลูชันที่มุ่งเน้นเนื่องจากปัญหายังคงเหมือนเดิม (การแข่งขันล่าม Bash และ Python)

Note2: เราสามารถแก้ไขปัญหาด้วยการแทนที่บาง\nส่วน;แต่มันจะไม่ทำงานทุกที่ทุกเวลา (ขึ้นอยู่กับการสร้างของ Python) ในขณะที่โซลูชันของฉันอนุญาตให้ "หนึ่งบรรทัด" โปรแกรม Python แบบหลายบรรทัดคลาสสิกเสมอ

Note3: แน่นอนเมื่อหนึ่งซับหนึ่งได้เสมอที่จะดูแลพื้นที่หลามและเยื้องเพราะในความเป็นจริงเราจะไม่เคร่งครัด "หนึ่งซับ" ที่นี่ แต่ทำที่เหมาะสมผสมการจัดการของ\nลำดับหนีระหว่างทุบตีและ Python . นี่คือวิธีที่เราสามารถจัดการกับโปรแกรม Python หลายบรรทัดแบบคลาสสิก ตัวอย่างโซลูชันแสดงสิ่งนี้เช่นกัน


0

คุณกำลังผสมสิ่งต่าง ๆ มากมายซึ่งทำให้ยากที่จะตอบคำถามของคุณ คำตอบสั้น ๆ ก็คือ: เท่าที่ฉันรู้สิ่งที่คุณต้องการทำคือไม่สามารถทำได้ใน Python ด้วยเหตุผลที่ดี!

คำตอบที่ยาวกว่าคือคุณควรทำให้คุณคุ้นเคยกับ Python มากขึ้นถ้าคุณต้องการพัฒนาใน Python ความเข้าใจไม่ยากที่จะอ่าน คุณอาจไม่คุ้นเคยกับการอ่าน แต่คุณต้องคุ้นเคยกับมันหากคุณต้องการเป็นนักพัฒนา Python หากมีภาษาที่เหมาะกับความต้องการของคุณให้เลือกภาษานั้น หากคุณเลือก Python เตรียมพร้อมที่จะแก้ปัญหาด้วยวิธี pythonic แน่นอนคุณมีอิสระที่จะต่อสู้กับ Python แต่มันจะไม่สนุก! ;-)

และถ้าคุณจะบอกเราว่าปัญหาที่แท้จริงของคุณคืออะไรคุณอาจได้รับคำตอบที่ไพเราะ "รับบางสิ่งในบรรทัดเดียว" เรามักจะไม่เป็นปัญหาการเขียนโปรแกรม


ฉันรักหลาม! ฉันแค่แสดงให้เห็นว่าฉันคิดว่าความเข้าใจอาจมีโครงสร้างที่ดีขึ้น แต่ไม่สามารถทำได้เนื่องจากลำไส้ใหญ่ซึ่งเป็นสาเหตุของปัญหา / คำถามของฉัน ... ฉันเห็นจากคำตอบของคุณว่า multistatements แยกโดย colons เช่นลอง: ถ้า sam [ 0]! = 'harry': print ('hellp', sam) เป็นไปไม่ได้ ... ถูกต้องไหม ขอบคุณ ... im เพียงแค่ใช้นี้เพื่อวัตถุประสงค์การแก้ปัญหาบางอย่างเพื่อให้ฉันกำลังมองหารหัสที่ง่ายขนาดเล็กที่สามารถถอดออกได้ง่ายและไม่ใช้พื้นที่จำนวนมากฮ่า ๆ
ริส

ใช่เท่าที่ฉันรู้ว่ามันเป็นไปไม่ได้ แต่ในฐานะที่เป็นคนอยู่แล้ว statet: สิ่งที่คุณทำคือสิ่งที่แตกต่างจากความเข้าใจ หากคุณต้องการที่จะลบรหัสได้อย่างง่ายดายวางไว้ในฟังก์ชั่น เกี่ยวกับ "ยกเว้น: ผ่าน" - ปัญหาลองคิดถึงมัณฑนากรที่ไม่สนใจข้อยกเว้นหรืออะไรทำนองนั้น อีกครั้ง: พยายามอธิบายปัญหาที่แท้จริงของคุณเสมอไม่ใช่ปัญหากับวิธีแก้ปัญหาที่คุณนึกไว้แล้ว ;-)
Achim

3
เหตุใดผู้คนจึงต้องเริ่มตอบคำถามโดยไม่มีเหตุผลสำหรับข้อความที่เร้าใจเช่น "คุณกำลังผสมสิ่งต่าง ๆ มากมาย"? ลงคะแนนถ้าฉันทำได้
John Jiang

"รับบางอย่างในบรรทัดเดียว" เรามักจะไม่เป็นปัญหาการเขียนโปรแกรม "-> แต่นั่นมักเป็นปัญหาดูแลระบบดังนั้นคำถามยังคงเกี่ยวข้องในประเด็นนี้
อเล็กซ์ F

0

มันเป็นไปได้ acctualy ;-)

# 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])

ซึ่งเป็นฟังก์ชั่นสำหรับการเข้ารหัส rot13 / cesa ในหนึ่งบรรทัดที่มี 99 อักขระ


-2

นี่คือตัวอย่าง:

สำหรับฉันอยู่ในช่วง (80, 90): พิมพ์ (i, end = "") ถ้า (i! = 89) พิมพ์อื่น (i)

เอาท์พุต: 80 81 82 83 84 85 86 87 88 89

>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.