Bagaimana cara meletakkan beberapa pernyataan dalam satu baris?

146

Saya tidak yakin dengan judul apa untuk merenungkan pertanyaan ini dengan tepat, coding golf tampaknya cocok jika agak tidak spesifik.

Saya tahu sedikit pemahaman tentang python tetapi tampaknya sangat sulit untuk 'dibaca'. Cara saya melihatnya, pemahaman mungkin mencapai hal yang sama seperti kode berikut:

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

Kode ini jauh lebih mudah dibaca daripada bagaimana pemahaman saat ini bekerja tetapi saya perhatikan Anda tidak boleh memiliki dua ':' dalam satu baris ... ini membawa saya juga ...

pertanyaan saya:

Apakah ada cara agar saya bisa memasukkan contoh berikut ke dalam SATU BARIS.

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

Sesuatu seperti ini akan bagus:

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

Tapi sekali lagi saya menemukan konflik ':' Saya juga ingin tahu apakah ada cara untuk menjalankan try (atau sesuatu seperti itu) tanpa kecuali, tampaknya sama sekali tidak ada gunanya saya perlu memasukkan kecuali: lulus di sana. Ini adalah garis yang terbuang.

Terima kasih atas masukannya ... dan berikut ada smileynya : D

Rhys
sumber
Mengapa harus mengeluarkan pengecualian?
Ignacio Vazquez-Abrams
2
sam [2] mungkin tidak ada. Ini adalah contoh hipotetis. terima kasih
Rhys
4
Pemahaman adalah sesuatu yang berbeda dengan Python. Menempatkan semuanya dalam satu baris bukanlah pemahaman.
Felix Kling
Saya sadar akan hal ini ya. Terima kasih. Saya baru saja mendemonstrasikan bagaimana menurut saya pemahaman dapat bekerja lebih baik tetapi tidak bisa karena titik dua yang merupakan akar masalah / pertanyaan saya
Rhys
Cukup gunakan \ns dan gunakan spasi untuk indentasi.

Jawaban:

148

Sayangnya, apa yang Anda inginkan tidak dimungkinkan dengan Python (yang membuat Python hampir tidak berguna untuk program baris perintah satu baris). Bahkan penggunaan tanda kurung secara eksplisit tidak menghindari pengecualian sintaks. Anda bisa mendapatkan urutan pernyataan sederhana, dipisahkan dengan titik koma:

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

Tetapi segera setelah Anda menambahkan konstruksi yang memperkenalkan blok indentasi (seperti if), Anda memerlukan jeda baris. Juga,

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

legal dan mungkin mendekati apa yang Anda inginkan.

Adapun try ... excepthal: Ini akan sama sekali tidak berguna tanpa file except. trymengatakan "Saya ingin menjalankan kode ini, tetapi mungkin muncul pengecualian". Jika Anda tidak peduli dengan pengecualian, tinggalkan try. Tapi begitu Anda memasukkannya, Anda berkata "Saya ingin menangani kemungkinan pengecualian". The passkemudian mengatakan Anda ingin tidak menanganinya secara khusus. Tetapi itu berarti kode Anda akan terus berjalan, yang tidak akan terjadi sebaliknya.

ThomasH
sumber
1
menarik, saya pikir contoh terakhir Anda paling mendekati jawaban yang saya cari. terima kasih
Rhys
berkenaan dengan pertanyaan 'coba' ... Bagaimana Jika, saya tahu pada titik tertentu itu akan mengeluarkan pengecualian tetapi saya hanya ingin kode terus berjalan ... misalnya, untuk memeriksa apakah suatu string dapat berupa bilangan bulat coba: int (string) ... Jika tidak bisa, lanjutkan saja ke baris berikutnya, tidak perlu pengecualian. Saya mengerti apa yang Anda katakan, tetapi apakah ada cara lain yang dapat mengakomodasi jenis pemeriksaan / penanganan kesalahan ini
Rhys
4
Re try:: Aturan sintaks Python tidak akan membiarkan Anda lolos dengan klausa "coba" tunggal tanpa disertai klausa "kecuali". Apa yang saya lakukan adalah membungkus fungsi coba-kecuali dalam sendiri, dan memanggil ini sebagai gantinya. Suka if (checkint(s))...dan def checkint(s): try: int(s)\nreturn True\nexcept: return False.
ThomasH
ThomasH, saya berharap komentar Anda adalah jawaban atas pertanyaan di suatu tempat sehingga saya dapat memberikan suara positif. Luar biasa.
Ivan X
5
@ThomasH " (yang membuat Python hampir tidak berguna untuk program satu baris baris perintah) ": tidak menghalangi saya. 95% kasing tidak membutuhkan jalur baru. Dan sisanya melalui \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr
53

Anda bisa menggunakan pernyataan exec built-in, misalnya:

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

Dimana \nbaris baru dan \tdigunakan sebagai lekukan (tab).
Selain itu, Anda harus menghitung spasi yang Anda gunakan, sehingga indentasi Anda sama persis.

Namun, seperti yang telah dikatakan semua jawaban lain, ini tentu saja hanya digunakan ketika Anda benar - benar harus meletakkannya di satu baris.

exec adalah pernyataan yang cukup berbahaya (terutama saat membangun aplikasi web) karena memungkinkan eksekusi kode Python arbitrer.

elecprog
sumber
4
Terima kasih! Ini harus ditandai sebagai jawaban yang benar, karena ini benar-benar berfungsi, tidak seperti yang lain. Tetapi tentu saja, jangan pernah melakukan ini kecuali Anda harus melakukannya! Saya sebenarnya membutuhkan sintaks ini, karena saya harus memasukkan skrip ke dalam kotak teks satu baris tetap.
Sanjay Manohar
Terima kasih! Penyelamat! Saya tidak menggunakan ini di skrip saya, tetapi di shell interaktif ini berguna untuk debugging ... Saya sering hanya keluar dari shell interaktif dan memulai ulang untuk mendapatkan lingkungan yang bersih dan kemudian saya harus mengulangi langkah-langkah tertentu, yaitu mengimpor a modul, menjalankan beberapa fungsi dan kemudian melakukan beberapa pengujian dengan fungsi tertentu. Soooo, saya sedang mencari cara untuk menempatkan "mengimpor modul, menjalankan beberapa fungsi" dalam satu baris, jadi saya dapat dengan cepat memanggilnya kembali dari riwayat dan menjalankannya (alih-alih harus memanggil kembali 5 item berbeda dari riwayat) +1
oneindelijk
exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass") lebih bagus :)
kxr
Terima kasih kxr :) (Saya menggunakan ide Anda untuk meningkatkan jawaban)
elecprog
7

Ya, posting ini berusia 8 tahun, tetapi jika seseorang datang ke sini juga mencari jawaban: Anda sekarang dapat menggunakan titik koma. Namun, Anda tidak dapat menggunakan if / elif / else staments, for / while loop, dan Anda tidak dapat menentukan fungsi. Kegunaan utama ini adalah saat menggunakan modul yang diimpor di mana Anda tidak perlu mendefinisikan fungsi apa pun atau menggunakan pernyataan if / elif / else / for / while / loops.

Berikut adalah contoh yang mengambil artis sebuah lagu, nama lagu, dan mencari liriknya yang jenius:

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())
symbxlz.dll
sumber
6

Saya sarankan untuk tidak melakukan ini ...

Apa yang Anda gambarkan bukanlah pemahaman.

PEP 8 Style Guide untuk Python Kode , yang saya lakukan merekomendasikan, telah ini mengatakan pada pernyataan majemuk:

  • Pernyataan gabungan (beberapa pernyataan pada baris yang sama) umumnya tidak disarankan.

Iya:

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

Lebih baik tidak:

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

Berikut adalah contoh pemahaman untuk membedakannya:

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

Saya tidak memberi insentif ini, tetapi katakanlah Anda menggunakan baris perintah, Anda tidak memiliki apa-apa selain Python dan Anda benar-benar membutuhkan satu baris, Anda dapat melakukan ini:

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

Apa yang kami lakukan di sini adalah pemrosesan awal \n sebelum mengevaluasi kode Python.

Itu sangat hacky! Jangan menulis kode seperti ini.

Tiago Lopo
sumber
1

mungkin dengan "dan" atau "atau"

setelah salah perlu menulis "atau"

setelah benar-benar perlu menulis "dan"

Suka

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

hasil:

false 1
false 2
false 3
true 4
false 5

atau mungkin suka

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

sampai di sini dengan mencari di google "bagaimana menempatkan beberapa pernyataan dalam satu baris python", tidak menjawab pertanyaan secara langsung, mungkin orang lain membutuhkan ini.

Shimon Doodkin
sumber
1

Untuk python -csolusi yang berorientasi, dan asalkan Anda menggunakan shell Bash, ya Anda dapat memiliki sintaks satu baris sederhana seperti dalam contoh ini:

Misalkan Anda ingin melakukan sesuatu seperti ini (sangat mirip dengan sampel Anda, termasuk except: passinstruksi):

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

Ini TIDAK akan berfungsi dan menghasilkan Kesalahan ini:

  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 `

Ini karena persaingan antara Bash dan Python Interpretation of \nescape sequence. Untuk mengatasi masalah ini, seseorang dapat menggunakan $'string'sintaks Bash untuk memaksa \ninterpretasi Bash SEBELUM Python. Untuk membuat contoh lebih menantang saya menambahkan end=..\n..spesifikasi Python yang khas dalam panggilan cetak Python: pada akhirnya Anda akan bisa mendapatkan \ninterpretasi KEDUA dari bash dan Python bekerja bersama, masing-masing pada bagian teks yang menjadi perhatian. Sehingga akhirnya solusi yang tepat adalah seperti ini:

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

Itu mengarah ke hasil bersih yang tepat tanpa kesalahan:

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

Catatan: ini seharusnya bekerja juga dengan execsolusi berorientasi, karena masalahnya masih sama (kompetisi interpreter Bash dan Python).

Note2: seseorang dapat mengatasi masalah dengan mengganti beberapa \noleh beberapa ;tetapi tidak akan bekerja kapan saja (tergantung pada konstruksi Python), sementara solusi saya memungkinkan untuk selalu "satu baris" setiap bagian dari program Python multi-baris klasik.

Note3: tentu saja, ketika satu lapisan, seseorang harus selalu menjaga spasi dan lekukan Python, karena sebenarnya kami tidak hanya "satu lapisan" di sini, TETAPI melakukan pengelolaan campuran yang tepat dari \nurutan pelarian antara bash dan Python . Ini adalah bagaimana kita dapat menangani bagian manapun dari program Python multi-baris klasik. Contoh larutan juga menggambarkan hal ini.

Pierre13fr
sumber
0

Anda mencampurkan banyak hal, yang membuat Anda sulit menjawab pertanyaan Anda. Jawaban singkatnya adalah: Sejauh yang saya tahu, apa yang ingin Anda lakukan tidak mungkin dilakukan dengan Python - untuk alasan yang bagus!

Jawaban yang lebih panjang adalah Anda harus membuat diri Anda lebih nyaman dengan Python, jika Anda ingin mengembangkan dengan Python. Pemahaman tidak sulit untuk dibaca. Anda mungkin tidak terbiasa membacanya, tetapi Anda harus terbiasa jika ingin menjadi pengembang Python. Jika ada bahasa yang lebih sesuai dengan kebutuhan Anda, pilih yang itu. Jika Anda memilih Python, bersiaplah untuk memecahkan masalah dengan cara pythonic. Tentu saja Anda bebas melawan Python, tetapi itu tidak akan menyenangkan! ;-)

Dan jika Anda memberi tahu kami apa masalah Anda yang sebenarnya, Anda bahkan mungkin mendapatkan jawaban pythonic. "Mendapatkan sesuatu dalam satu baris" biasanya bukan masalah pemrograman.

Achim
sumber
Saya suka python! Saya baru saja mendemonstrasikan bagaimana menurut saya pemahaman mungkin lebih terstruktur tetapi tidak bisa karena titik dua yang merupakan akar dari masalah / pertanyaan saya ... Saya melihat dari jawaban Anda bahwa multistatement dipisahkan oleh titik dua seperti coba: if sam [ 0]! = 'Harry': print ('hellp', sam) tidak mungkin ... apakah ini benar? terima kasih ... saya hanya menggunakan ini untuk beberapa tujuan debug jadi saya mencari kode sederhana kecil yang dapat dihapus dengan mudah dan tidak memakan banyak ruang lol
Rhys
Ya, sejauh yang saya tahu itu tidak mungkin. Tetapi sebagai seseorang yang sudah menyatakan: Apa yang Anda lakukan adalah sesuatu yang berbeda dari pemahaman. Jika Anda ingin dapat menghapus kode dengan mudah, masukkan ke dalam sebuah fungsi. Mengenai masalah "kecuali: pass", pikirkan tentang dekorator yang mengabaikan pengecualian atau semacamnya. Sekali lagi: Selalu coba gambarkan masalah Anda yang sebenarnya, bukan masalah dengan solusi yang sudah Anda pikirkan. ;-)
Achim
3
Mengapa orang harus memulai jawaban mereka dengan pernyataan yang tidak pantas untuk provokatif seperti "Anda mencampur banyak hal"? Turunkan suara jika saya bisa.
John Jiang
"Mendapatkan sesuatu dalam satu baris" kami biasanya bukan masalah pemrograman. "-> tetapi itu sering merupakan masalah sysadmin, jadi pertanyaannya masih relevan dalam aspek ini.
Alex F
0

Aktualnya mungkin ;-)

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

Anda dapat melakukan hal-hal yang sangat jelek dengan python seperti:

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

yang berfungsi untuk enkripsi rot13 / cesa dalam satu baris dengan 99 karakter.

yamm
sumber
-2

Berikut ini contohnya:

untuk i dalam kisaran (80, 90): print (i, end = "") if (i! = 89) else print (i)

Keluaran: 80 81 82 83 84 85 86 87 88 89

>

JZP
sumber