(відповів 23 листопада '10 о 19:48)
Я насправді не великий пітонер - але я знайшов цей синтаксис один раз, забув звідки, тому подумав, що його документую:
якщо ви використовуєте sys.stdout.write
замість print
( різниця полягає в тому, що sys.stdout.write
аргументи приймаються як функція, в дужках - тоді як print
ні ), то для однолінійки ви можете піти з інвертування порядку команди та for
, видалення крапки з комою, і додавання команди у квадратні дужки, тобто:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
Поняття не маю, як би називався цей синтаксис у Python :)
Сподіваюся, це допомагає,
Ура!
(EDIT Tue Apr 9 20:57:30 2013) Ну, я думаю, я нарешті знайшов, про що ці квадратні дужки в однокласинах; вони "перелічення розумінь" (мабуть); спочатку зазначте це в 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>
Отже команда в круглих дужках / дужках розглядається як "генераторний об'єкт"; якщо ми "повторимо" через нього викликом next()
- тоді команда всередині дужок буде виконана (зверніть увагу на "abc" у висновку):
$ 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>
Якщо ми зараз використовуємо квадратні дужки - зауважте, що нам не потрібно викликати next()
команду, щоб виконати команду, вона виконується відразу після призначення; Однак, через огляд показує , що a
це None
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
Це не залишає багато інформації для пошуку квадратних дужок, але я натрапив на цю сторінку, яку я думаю, пояснює:
Поради та хитрості Python - Перше видання - Підручники Python | Dream.In.Code :
Якщо ви пам’ятаєте, стандартний формат генератора однорядних рядків - це певний рядок 'для' циклу всередині дужок. Це призведе до отримання одноразового ітерабельного об'єкта, який є об'єктом, який ви можете повторити лише в одному напрямку і який ви не зможете повторно використовувати, як тільки досягнете мети.
"Зрозуміння списку" виглядає майже так само, як звичайний однорядковий генератор, за винятком того, що звичайні дужки - () - замінені квадратними дужками - []. Основний прогрес алістського розуміння полягає в тому, що створюється "список", а не одноразовий ітерабельний об'єкт, так що ви можете переходити назад і назад по ньому, додавати елементи, сортувати тощо.
І справді це список - це просто його перший елемент, який не стає жодним, як тільки він виконується:
$ 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
Поняття списків інакше задокументовано у 5. Структури даних: 5.1.4. Зрозуміння списку - документація Python v2.7.4 як " Зрозуміння списків забезпечує стислий спосіб створення списків"; Мабуть, саме там обмежена "виконуваність" списків починає грати в одноклапанні.
Ну, сподіваюсь, я тут не дуже страшний…
EDIT2: і ось командний рядок з одним вкладишем з двома вкладеними циклами for-циклів; обидва укладені в квадратних дужках "розуміння списку":
$ 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]
Зауважте, що другий "список" b
тепер має два елементи, оскільки його цикл явно виконується двічі; проте результат sys.stdout.write()
в обох випадках був (мабуть) None
.