(23 Kasım 10:
19'da cevaplandı) Gerçekten büyük bir Pythoner değilim - ama bu sözdizimini bir kez buldum, nereden unuttum, bu yüzden belgelediğimi düşündüm:
Eğer kullanırsanız sys.stdout.write
yerine print
( fark varlık, sys.stdout.write
parantez içinde, bir fonksiyonu olarak argüman alır - oysa print
değil ), sonra tek astar için, komut sırasını tersine çevirmekle ilgili kurtulmak ve olabilir for
, noktalı virgül kaldırarak, ve komutun köşeli parantez içine alınması, yani:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
Bu sözdiziminin Python'da nasıl çağrılacağını bilmiyorum :)
Bu yardımcı olur umarım,
Şerefe!
(EDIT Sal 9 Nis 20:57:30 2013) Sanırım sonunda tek gömlekli bu köşeli parantezlerin ne hakkında olduğunu buldum; bunlar "liste kavrayışları" dır (görünüşe göre); ilk olarak Python 2.7'de not edin:
$ 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>
Böylece yuvarlak parantez / parantez içindeki komut bir "jeneratör nesnesi" olarak görülür; arayarak "yinelersek" next()
- parantez içindeki komut yürütülür (çıktıdaki "abc" yi not edin):
$ 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>
Şimdi köşeli parantezler kullanırsak - next()
komutun yürütülmesi için çağırmamız gerekmediğini unutmayın, atamadan hemen sonra yürütülür; Ancak daha sonra muayene ortaya koymaktadır a
edilir None
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
Bu köşeli parantez için aramak için çok fazla bilgi bırakmıyor - ama açıkladığımı düşündüğüm bu sayfaya rastladım:
Python İpuçları Ve Püf Noktaları - Birinci Baskı - Python Öğreticiler | Dream.In.Code :
Hatırlarsanız, tek hatlı bir jeneratörün standart formatı, parantez içindeki döngü için bir tür 'for' döngüsüdür. Bu, yalnızca bir yönde yineleyebileceğiniz ve sona ulaştığınızda tekrar kullanamayacağınız bir nesne olan 'tek atış' yinelenebilir bir nesne üretecektir.
'Liste kavraması', normal köşeli parantez - () - köşeli parantez - [] ile değiştirilmesinin dışında, normal tek satırlı bir jeneratörle hemen hemen aynı görünür. Alist kavrayışının en büyük avantajı, 'tek atış' yinelenebilir bir nesne yerine bir 'liste' üreten, böylece ileri geri gidip öğeler ekleyebileceğiniz, sıralayabileceğiniz vb.
Ve aslında bir liste - sadece ilk öğesi yürütülür yürütülmez hiçbiri olmaz:
$ 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
Liste kavrayışları aksi 5'de belgelenmiştir . Veri Yapıları: 5.1.4. Liste Anlamaları - Python v2.7.4 “Liste anlaşmaları liste oluşturmak için kısa ve öz bir yol sağlar”; muhtemelen, listelerin sınırlı "çalıştırılabilirliği" tek satırda devreye giriyor.
Umarım buradaki işaretten çok da kötü değilim ...
EDIT2: ve burada iç içe yerleştirilmemiş iki döngüye sahip tek satırlı bir komut satırı; her ikisi de "liste kavrama" köşeli parantez içine alınmış:
$ 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]
İkinci "liste" nin b
şimdi iki unsuru olduğuna dikkat edin , çünkü for döngüsü açık olarak iki kez koştu; ancak, sys.stdout.write()
her iki durumda da (görünüşe göre) sonucuydu None
.