Làm thế nào để đặt nhiều câu lệnh trong một dòng?


143

Tôi không chắc chắn dưới tiêu đề nào để suy nghĩ chính xác câu hỏi này, mã hóa golf có vẻ phù hợp nếu một chút không cụ thể.

Tôi biết một chút hiểu biết về con trăn nhưng chúng có vẻ rất khó 'đọc'. Theo cách tôi thấy, một sự hiểu biết có thể thực hiện giống như đoạn mã sau:

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

Mã này dễ đọc hơn nhiều so với cách hiểu hiện tại hoạt động nhưng tôi nhận thấy bạn không thể có hai ':' trong một dòng ... điều này cũng mang lại cho tôi ...

câu hỏi của tôi:

Có cách nào tôi có thể lấy ví dụ sau vào MỘT LINE không.

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

Một cái gì đó như thế này sẽ là tuyệt vời:

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

Nhưng một lần nữa tôi lại gặp phải mâu thuẫn ':' Tôi cũng muốn biết liệu có cách nào để chạy thử (hoặc một cái gì đó tương tự) mà không ngoại trừ, có vẻ như hoàn toàn vô nghĩa mà tôi cần đặt ngoại trừ: vượt qua đó. nó là một dòng lãng phí.

Cảm ơn bạn đã nhập ... và ở đây có một nụ cười : D


Tại sao nó sẽ ném một ngoại lệ?
Ignacio Vazquez-Abrams

1
sam [2] có thể không tồn tại. Đó là một ví dụ giả thuyết. cảm ơn
Rhys

4
Hiểu là một cái gì đó khác nhau trong Python. Đặt mọi thứ trong một dòng là không hiểu.
Felix Kling

Tôi nhận thức được điều này có. cảm ơn. Tôi chỉ chứng minh làm thế nào tôi nghĩ rằng sự hiểu biết có thể hoạt động tốt hơn nhưng không thể do dấu hai chấm là gốc rễ của vấn đề / câu hỏi của tôi
Rhys

Chỉ cần sử dụng \ns và sử dụng không gian cho thụt lề.

Câu trả lời:


144

Thật không may, những gì bạn muốn là không thể với Python (điều này khiến Python gần như vô dụng đối với các chương trình một dòng lệnh). Ngay cả việc sử dụng dấu ngoặc đơn rõ ràng cũng không tránh được ngoại lệ cú pháp. Bạn có thể thoát khỏi một chuỗi các câu lệnh đơn giản, được phân tách bằng dấu chấm phẩy:

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

Nhưng ngay khi bạn thêm một cấu trúc giới thiệu một khối thụt lề (như if), bạn cần ngắt dòng. Cũng thế,

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

là hợp pháp và có thể gần đúng những gì bạn muốn.

Đối với các try ... exceptđiều: Nó sẽ là hoàn toàn vô dụng mà không cần sự except. trynói "Tôi muốn chạy mã này, nhưng nó có thể ném ngoại lệ". Nếu bạn không quan tâm đến ngoại lệ, hãy bỏ qua try. Nhưng ngay sau khi bạn đặt nó vào, bạn đang nói "Tôi muốn xử lý một ngoại lệ tiềm năng". Sau passđó nói rằng bạn muốn không xử lý nó một cách cụ thể. Nhưng điều đó có nghĩa là mã của bạn sẽ tiếp tục chạy, điều này sẽ không xảy ra.


1
Thật thú vị, tôi nghĩ rằng ví dụ sau của bạn gần nhất với câu trả lời tôi đang tìm kiếm. cảm ơn
Rhys

liên quan đến câu hỏi 'thử' ... Điều gì xảy ra nếu, đôi khi tôi biết rằng nó sẽ đưa ra một ngoại lệ nhưng tôi chỉ muốn mã tiếp tục chạy ... chẳng hạn, để kiểm tra xem một chuỗi có thể là số nguyên không thử: int (chuỗi) ... Nếu không thể, thì chỉ cần tiếp tục dòng tiếp theo, không cần ngoại lệ. Tôi thấy những gì bạn đang nói, nhưng có cách nào khác có thể phù hợp với loại kiểm tra / xử lý lỗi này không
Rhys

4
Re try:: Quy tắc cú pháp Python đơn giản sẽ không cho phép bạn thoát khỏi mệnh đề "thử" duy nhất mà không kèm theo mệnh đề "ngoại trừ". Những gì tôi làm là gói thử - ngoại trừ chức năng riêng và thay vào đó gọi nó. Thích if (checkint(s))...def checkint(s): try: int(s)\nreturn True\nexcept: return False.
ThomasH

ThomasH, tôi muốn bình luận của bạn là một câu trả lời cho một câu hỏi ở đâu đó để tôi có thể nâng cao nó. Thông minh.
Ivan X

5
@ThomasH " (làm cho Python gần như vô dụng đối với các chương trình một dòng lệnh) ": không cản trở tôi. 95% trường hợp không cần dòng mới. Và phần còn lại qua \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr

52

Bạn có thể sử dụng câu lệnh exec được tích hợp sẵn, vd.:

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

Trường hợp \nlà một dòng mới và \tđược sử dụng như thụt lề (một tab).
Ngoài ra, bạn nên đếm các không gian bạn sử dụng, để thụt lề của bạn khớp chính xác.

Tuy nhiên, như tất cả các câu trả lời khác đã nói, điều này tất nhiên chỉ được sử dụng khi bạn thực sự phải đặt nó trên một dòng.

exec là một tuyên bố khá nguy hiểm (đặc biệt là khi xây dựng một ứng dụng web) vì nó cho phép thực thi mã Python tùy ý.


4
Cảm ơn bạn! Điều này nên được đánh dấu là câu trả lời chính xác, vì nó thực sự hoạt động, không giống như những người khác. Nhưng tất nhiên, không bao giờ làm điều này trừ khi bạn phải! Tôi thực sự cần cú pháp này, tuy nhiên, vì tôi phải nhập các tập lệnh vào một hộp văn bản một dòng cố định.
Sanjay Manohar

Cảm ơn ! Phao cứu sinh! Tôi không sử dụng điều này trong kịch bản của mình, nhưng trong trình vỏ tương tác, điều này rất hữu ích để gỡ lỗi ... Tôi thường chỉ cần thoát khỏi trình tương tác và khởi động lại nó để có được một môi trường sạch và sau đó tôi phải lặp lại một số bước nhất định, tức là nhập một mô-đun, chạy một số chức năng và sau đó thực hiện một số thử nghiệm với một chức năng cụ thể. Xin lỗi, tôi đang tìm cách đưa "nhập mô-đun, chạy một số chức năng" vào máy oneliner, vì vậy tôi có thể nhanh chóng gọi lại từ lịch sử và chạy nó (thay vì phải gọi lại 5 mục khác nhau từ lịch sử) +1
oneindelijk

exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass") đẹp hơn :)
kxr

Cảm ơn bạn kxr :) (Tôi đã sử dụng ý tưởng của bạn để cải thiện câu trả lời)
elecprog

6

Tôi khuyên bạn không nên làm điều này ...

Những gì bạn đang mô tả không phải là một sự hiểu biết.

PEP 8 Style Guide Mã Python , mà tôi làm khuyên, đã cho biết trên báo cáo hợp chất:

  • Các câu lệnh ghép (nhiều câu lệnh trên cùng một dòng) thường không được khuyến khích.

Đúng:

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

Thay vì không:

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

Dưới đây là một cách hiểu mẫu để phân biệt:

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

6

Có bài đăng này đã 8 tuổi, nhưng khi có ai đó đến đây cũng đang tìm kiếm một câu trả lời: bây giờ bạn có thể chỉ cần sử dụng dấu chấm phẩy. Tuy nhiên, bạn không thể sử dụng các nhị phân if / elif / khác, các vòng lặp for / while và bạn không thể xác định các hàm. Việc sử dụng chính của điều này sẽ là khi sử dụng các mô-đun nhập khẩu mà bạn không phải xác định bất kỳ chức năng nào hoặc sử dụng bất kỳ câu lệnh if / elif / other / for / while / vòng lặp.

Dưới đây là một ví dụ đưa nghệ sĩ của một bài hát, tên bài hát và tìm kiếm thiên tài cho lời bài hát:

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

Tôi không khuyến khích điều này, nhưng nói rằng bạn đang ở trên dòng lệnh, bạn không có gì ngoài Python và bạn thực sự cần một lớp lót, bạn có thể làm điều này:

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

Những gì chúng tôi đang làm ở đây là tiền xử lý \ntrước khi đánh giá mã Python.

Đó là siêu hacky! Đừng viết mã như thế này.


1

có thể với "và" hoặc "hoặc"

sau sai cần viết "hoặc"

sau khi thực sự cần phải viết "và"

giống

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()

kết quả:

false 1
false 2
false 3
true 4
false 5

hoặc có thể thích

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

đã đến đây bằng cách tìm kiếm google "làm thế nào để đặt nhiều bức tượng vào một dòng trăn", không trả lời trực tiếp câu hỏi, có thể ai đó cần điều này.


1

Đối với một python -cgiải pháp định hướng và với điều kiện bạn sử dụng Bash shell, vâng, bạn có thể có một cú pháp một dòng đơn giản như trong ví dụ này:

Giả sử bạn muốn làm một cái gì đó như thế này (rất giống với mẫu của bạn, bao gồm cả except: passhướng dẫn):

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

Điều này sẽ KHÔNG hoạt động và tạo ra lỗi này:

  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 `

Điều này là do sự cạnh tranh giữa Bash và Python Giải thích các \nchuỗi thoát. Để giải quyết vấn đề, người ta có thể sử dụng $'string'cú pháp Bash để buộc \nBash diễn giải TRƯỚC KHI Python. Để làm cho ví dụ trở nên khó khăn hơn, tôi đã thêm một đặc end=..\n..tả Python điển hình trong lệnh gọi Python: cuối cùng, bạn sẽ có thể nhận được các \nphiên dịch BÓNG từ bash và Python làm việc cùng nhau, mỗi phần trên văn bản quan tâm của nó. Vì vậy, cuối cùng giải pháp thích hợp là như thế này:

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

Điều đó dẫn đến đầu ra sạch thích hợp không có lỗi:

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

Lưu ý: điều này sẽ hoạt động tốt với execcác giải pháp định hướng, bởi vì vấn đề vẫn giống nhau (cạnh tranh phiên dịch Bash và Python).

Lưu ý 2: người ta có thể giải quyết vấn đề bằng cách thay thế một số \nbằng một số ;nhưng nó sẽ không hoạt động bất cứ lúc nào (tùy thuộc vào cấu trúc Python), trong khi giải pháp của tôi cho phép luôn "một dòng" bất kỳ phần nào của chương trình Python đa dòng cổ điển.

Lưu ý 3: tất nhiên, khi một lớp, người ta luôn phải chăm sóc các khoảng trống và thụt lề của Python, vì thực tế chúng ta không hoàn toàn "một lớp" ở đây, NHƯNG thực hiện một cách quản lý hỗn hợp đúng theo \ntrình tự thoát giữa bash và Python . Đây là cách chúng ta có thể đối phó với bất kỳ phần nào của chương trình Python đa dòng cổ điển. Mẫu giải pháp cũng minh họa điều này.


0

Bạn đang pha trộn rất nhiều thứ, điều đó khiến bạn khó trả lời câu hỏi của mình. Câu trả lời ngắn gọn là: Theo như tôi biết, những gì bạn muốn làm chỉ là không thể có trong Python - vì lý do chính đáng!

Câu trả lời dài hơn là bạn nên làm cho bản thân thoải mái hơn với Python, nếu bạn muốn phát triển bằng Python. Hiểu không khó đọc. Bạn có thể không quen đọc chúng, nhưng bạn phải làm quen với nó nếu bạn muốn trở thành một nhà phát triển Python. Nếu có một ngôn ngữ phù hợp với nhu cầu của bạn hơn, hãy chọn ngôn ngữ đó. Nếu bạn chọn Python, hãy chuẩn bị để giải quyết vấn đề theo cách pythonic. Tất nhiên bạn có thể tự do chiến đấu chống lại Python, nhưng nó sẽ không vui! ;-)

Và nếu bạn cho chúng tôi biết vấn đề thực sự của bạn là gì, bạn thậm chí có thể nhận được câu trả lời pythonic. "Bắt một cái gì đó trong một dòng" chúng ta thường không phải là một vấn đề lập trình.


Tôi yêu con trăn! Tôi chỉ chứng minh làm thế nào tôi nghĩ rằng sự hiểu biết có thể được cấu trúc tốt hơn nhưng không thể do dấu hai chấm là vấn đề / câu hỏi của tôi ... Tôi thấy câu trả lời của bạn rằng đa tầng được phân tách bằng dấu hai chấm như thử: if sam [ 0]! = 'Harry': print ('hellp', sam) là không thể ... điều này có đúng không? cảm ơn ... tôi chỉ sử dụng cái này cho một số mục đích gỡ lỗi vì vậy tôi đang tìm kiếm mã đơn giản nhỏ có thể gỡ bỏ dễ dàng và không chiếm nhiều dung lượng lol
Rhys

Vâng, theo như tôi biết thì không thể. Nhưng như ai đó đã được thống kê: Những gì bạn làm là một cái gì đó khác với sự hiểu biết. Nếu bạn muốn có thể loại bỏ mã dễ dàng, hãy đặt nó vào một hàm. Về vấn đề "ngoại trừ: vượt qua", hãy nghĩ về một người trang trí bỏ qua ngoại lệ hoặc một cái gì đó tương tự. Một lần nữa: Luôn cố gắng mô tả vấn đề thực sự của bạn, không phải là vấn đề với giải pháp bạn có trong đầu. ;-)
Achim

3
Tại sao mọi người phải bắt đầu câu trả lời của họ bằng những lời tuyên bố khiêu khích như "bạn đang trộn lẫn rất nhiều thứ"? Bỏ phiếu nếu tôi có thể.
John Jiang

"Bắt một thứ gì đó trong một dòng" chúng tôi thường không phải là vấn đề lập trình. "-> nhưng đó thường là vấn đề sysadmin, vì vậy câu hỏi vẫn liên quan đến khía cạnh này.
Alex F

0

Acctualy của nó có thể ;-)

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

Bạn có thể làm những thứ rất xấu xí trong python như:

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

đó là chức năng mã hóa rot13 / cesa trong một dòng có 99 ký tự.


-2

Đây là một ví dụ:

cho i trong phạm vi (80, 90): print (i, end = "") if (i! = 89) other print (i)

Đầu ra: 80 81 82 83 84 85 86 87 88 89

>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.