(dijawab 23 Nov '10 pada 19:48)
Saya bukan Pythoner besar - tapi saya menemukan sintaks ini satu kali, lupa dari mana, jadi saya pikir saya akan mendokumentasikannya:
jika Anda menggunakan sys.stdout.write
alih-alih print
( perbedaannya adalah, sys.stdout.write
mengambil argumen sebagai fungsi, dalam tanda kurung - sedangkan print
tidak ), maka untuk one-liner, Anda bisa lolos dengan membalik urutan perintah dan for
, menghapus tanda titik koma, dan melampirkan perintah dalam tanda kurung, yaitu:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
Tidak tahu bagaimana sintaks ini akan dipanggil dengan Python :)
Semoga ini membantu,
Bersulang!
(EDIT Sel 9 Apr 20:57:30 2013) Yah, saya pikir saya akhirnya menemukan apa tanda kurung kotak ini dalam satu baris; mereka adalah "daftar pemahaman" (tampaknya); perhatikan ini dengan Python 2.7:
$ STR=abc
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); print a"
<generator object <genexpr> at 0xb771461c>
Jadi perintah dalam kurung bulat / tanda kurung dilihat sebagai "objek generator"; jika kita "mengulanginya" dengan memanggil next()
- maka perintah di dalam tanda kurung akan dieksekusi (perhatikan "abc" di output):
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); a.next() ; print a"
abc
<generator object <genexpr> at 0xb777b734>
Jika sekarang kita menggunakan tanda kurung siku - perhatikan bahwa kita tidak perlu memanggil next()
untuk menjalankan perintah, perintah dijalankan segera setelah penugasan; Namun, pemeriksaan kemudian mengungkapkan bahwa a
adalah None
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
Ini tidak meninggalkan banyak info untuk dicari, untuk kotak kurung - tapi saya menemukan halaman ini yang menurut saya menjelaskan:
Tips Dan Trik Python - Edisi Pertama - Tutorial Python | Kode Mimpi :
Jika Anda ingat, format standar generator jalur tunggal adalah semacam loop satu baris 'untuk' loop di dalam kurung. Ini akan menghasilkan objek iterable 'satu tembakan' yang merupakan objek yang dapat Anda ulangi hanya dalam satu arah dan yang tidak dapat Anda gunakan kembali setelah mencapai akhir.
'Pemahaman daftar' terlihat hampir sama dengan generator satu baris biasa, kecuali bahwa tanda kurung reguler - () - diganti dengan tanda kurung siku - []. Keuntungan utama dari pemahaman alist adalah menghasilkan 'daftar', bukan 'objek satu-shot' yang dapat diulang, sehingga Anda dapat bolak-balik melewatinya, menambahkan elemen, mengurutkan, dll.
Dan memang itu adalah daftar - hanya saja elemen pertamanya menjadi tidak ada begitu dieksekusi:
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin].__class__"
abc
<type 'list'>
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin][0]"
abc
None
Pemahaman daftar didokumentasikan dalam 5. Struktur Data: 5.1.4. Daftar Pemahaman - Dokumentasi Python v2.7.4 sebagai "Pemahaman daftar menyediakan cara ringkas untuk membuat daftar"; mungkin, di situlah "eksekusi" terbatas dari daftar berperan dalam satu-liners.
Yah, semoga aku tidak terlalu melenceng di sini ...
EDIT2: dan di sini adalah baris perintah satu-liner dengan dua loop-non-bersarang; keduanya tertutup dalam tanda kurung siku "daftar pemahaman":
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; b=[sys.stdout.write(str(x)) for x in range(2)] ; print a ; print b"
abc
01[None]
[None, None]
Perhatikan bahwa "daftar" kedua b
sekarang memiliki dua elemen, karena untuk loop secara eksplisit berjalan dua kali; Namun, hasil dari sys.stdout.write()
kedua kasus itu (tampaknya) None
.