(odpowiedział 23 listopada 2010 o 19:48)
Nie jestem naprawdę wielkim Pythonem - ale raz znalazłem tę składnię, zapomniałem skąd, więc pomyślałem, że ją udokumentuję:
jeśli użyjesz sys.stdout.write
zamiast print
( różnica polega na tym, że sys.stdout.write
przyjmuje argumenty jako funkcję, w nawiasach - podczas print
gdy nie ), to w przypadku jednowierszowego można uniknąć odwrócenia kolejności polecenia i for
usunięcia średnika, i zawarcie polecenia w nawiasach kwadratowych, tj .:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
Nie mam pojęcia, jak ta składnia zostanie wywołana w Pythonie :)
Mam nadzieję że to pomoże,
Twoje zdrowie!
(EDYCJA Wt 9 kwietnia 20:57:30 2013) Cóż, myślę, że w końcu znalazłem, o co chodzi w tych nawiasach kwadratowych w linijkach ; są „listami” (najwyraźniej); najpierw zwróć uwagę na to w Pythonie 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>
Zatem polecenie w okrągłych nawiasach / nawiasach jest postrzegane jako „obiekt generatora”; jeśli wykonamy „iterację” przez wywołanie next()
- wówczas polecenie w nawiasie zostanie wykonane (zwróć uwagę na „abc” na wyjściu):
$ 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>
Jeśli teraz używamy nawiasów kwadratowych - pamiętaj, że nie musimy dzwonić, next()
aby wykonać polecenie, wykonuje się je natychmiast po przypisaniu; Jednak później inspekcja wykaże, że a
jest None
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
Nie pozostawia to wiele informacji do wyszukiwania, w przypadku nawiasów kwadratowych - ale natknąłem się na tę stronę, którą, jak sądzę, wyjaśnia:
Wskazówki i porady dotyczące języka Python - Pierwsze wydanie - Samouczki dotyczące języka Python | Dream.In.Code :
Jeśli pamiętacie, standardowy format generatora jednowierszowego jest rodzajem pętli jednowierszowej „w” w nawiasach. W ten sposób powstanie iterowalny obiekt „jeden strzał”, który jest obiektem, w którym można iterować tylko w jednym kierunku i którego nie można ponownie użyć po osiągnięciu końca.
„Zrozumienie listy” wygląda prawie tak samo jak zwykły generator jednowierszowy, z tym wyjątkiem, że zwykłe nawiasy kwadratowe - () - są zastępowane nawiasami kwadratowymi - []. Główną zaletą alistycznego rozumienia jest to, że tworzy „listę”, a nie „iteracyjny” obiekt iteracyjny, dzięki czemu można przechodzić przez niego w przód iw tył, dodawać elementy, sortować itp.
I rzeczywiście jest to lista - jest to tylko jej pierwszy element, gdy tylko zostanie wykonany:
$ 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
Zrozumienia list są w inny sposób udokumentowane w 5. Struktury danych: 5.1.4. Zrozumienia list - dokumentacja Python v2.7.4 jako „ Zrozumienia list zapewniają zwięzły sposób tworzenia list”; przypuszczalnie właśnie w tym przypadku obowiązuje ograniczona „wykonywalność” list w jednowierszowych liniach.
Cóż, mam nadzieję, że nie jestem tutaj zbyt daleko od znaku ...
EDYCJA 2: a tutaj jest linia poleceń z jednym wierszem z dwoma nie zagnieżdżonymi pętlami for; oba ujęte w nawiasy kwadratowe „rozumienia listy”:
$ 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]
Zauważ, że druga „lista” b
ma teraz dwa elementy, ponieważ jej pętla for jawnie uruchomiła się dwukrotnie; jednak wynik sys.stdout.write()
w obu przypadkach był (najwyraźniej) None
.