(Répondu le 23 novembre 10 à 19:48)
Je ne suis pas vraiment un grand Pythoner - mais j'ai trouvé cette syntaxe une fois, j'ai oublié d'où, alors j'ai pensé la documenter:
si vous utilisez à la sys.stdout.write
place de print
( la différence étant, sys.stdout.write
prend les arguments comme une fonction, entre parenthèses - alors print
que non ), alors pour une ligne, vous pouvez vous en sortir en inversant l'ordre de la commande et en for
supprimant le point-virgule, et mettre la commande entre crochets, c'est-à-dire:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
Je n'ai aucune idée de la façon dont cette syntaxe serait appelée en Python :)
J'espère que cela t'aides,
À votre santé!
(EDIT Tue Apr 9 20:57:30 2013) Eh bien, je pense que j'ai finalement trouvé de quoi parlaient ces crochets dans les lignes simples ; ce sont des «compréhensions de liste» (apparemment); notez d'abord cela dans 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>
Ainsi, la commande entre crochets / parenthèses est considérée comme un "objet générateur"; si nous "itérons" à travers elle en appelant next()
- alors la commande à l'intérieur de la parenthèse sera exécutée (notez "abc" dans la sortie):
$ 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>
Si nous utilisons maintenant des crochets - notez que nous n'avons pas besoin d'appeler next()
pour que la commande s'exécute, elle s'exécute immédiatement lors de l'affectation; Cependant, une inspection ultérieure révèle que a
est None
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
Cela ne laisse pas beaucoup d'informations à rechercher, pour le cas des crochets - mais je suis tombé sur cette page qui, je pense, explique:
Trucs et astuces Python - Première édition - Tutoriels Python | Dream.In.Code :
Si vous vous souvenez, le format standard d'un générateur de ligne unique est une sorte de boucle d'une ligne «pour» entre crochets. Cela produira un objet itérable à un coup qui est un objet sur lequel vous pouvez itérer dans une seule direction et que vous ne pouvez pas réutiliser une fois que vous avez atteint la fin.
Une «compréhension de liste» ressemble presque à un générateur ordinaire sur une seule ligne, sauf que les crochets réguliers - () - sont remplacés par des crochets - []. L'avantage majeur de la compréhension des listes est qu'il produit une `` liste '', plutôt qu'un objet itérable `` à un coup '', de sorte que vous pouvez aller et venir à travers lui, ajouter des éléments, trier, etc.
Et en effet, c'est une liste - c'est juste que son premier élément devient nul dès qu'il est exécuté:
$ 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
Les compréhensions de liste sont par ailleurs documentées en 5. Structures de données: 5.1.4. Liste des compréhensions - La documentation de Python v2.7.4 comme "Les compréhensions de liste fournissent un moyen concis de créer des listes"; on peut supposer que c'est là que l '«exécutabilité» limitée des listes entre en jeu dans les lignes simples.
Eh bien, j'espère que je ne suis pas trop loin de la réalité ici ...
EDIT2: et voici une ligne de commande à une ligne avec deux boucles for non imbriquées; tous deux placés entre crochets "compréhension de liste":
$ 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]
Notez que la deuxième "liste" a b
maintenant deux éléments, car sa boucle for a explicitement fonctionné deux fois; cependant, le résultat de sys.stdout.write()
dans les deux cas était (apparemment) None
.