Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
709 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  syntaxe des boucles et des "lists comprehensions" [résolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

syntaxe des boucles et des "lists comprehensions" [résolu]

n°2182846
suizokukan
Posté le 27-03-2013 à 21:18:23  profilanswer
 

Bonsoir,
puisqu'il est possible d'écrire en Python :

Code :
  1. [e for e in mylist if e is not None]


je me demandais récemment pourquoi on ne pouvait écrire :

Code :
  1. for e in mylist if e is not None:
  2.     print(e)


Ou bien, qu'est-ce qui se rapprocherait le plus de l'exemple précédent ?
Merci !


Message édité par suizokukan le 27-03-2013 à 21:48:15

---------------
rule #1 : trust the python
mood
Publicité
Posté le 27-03-2013 à 21:18:23  profilanswer
 

n°2182849
masklinn
í dag viðrar vel til loftárása
Posté le 27-03-2013 à 21:22:38  profilanswer
 

Parce que c'est un ajout de syntaxe qui a été considéré sans grand intérêt: tu peux écrire

Code :
  1. for e in mylist:
  2.    if e is not None:
  3.        print(e)


ou bien

Code :
  1. for e in (for e in mylist if e is not None):
  2.    print(e)



---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2182850
suizokukan
Posté le 27-03-2013 à 21:27:34  profilanswer
 

Merci Masklinn; en fait, je pensais qu'autoriser "ma" syntaxe découlait naturellement des lists comprehensions, et que c'était le même code du parser et du générateur de bytecode qui gérait l'un et l'autre.

Message cité 1 fois
Message édité par suizokukan le 27-03-2013 à 21:28:09

---------------
rule #1 : trust the python
n°2182854
masklinn
í dag viðrar vel til loftárása
Posté le 27-03-2013 à 21:48:20  profilanswer
 

suizokukan a écrit :

Merci Masklinn; en fait, je pensais qu'autoriser "ma" syntaxe découlait naturellement des lists comprehensions, et que c'était le même code du parser et du générateur de bytecode qui gérait l'un et l'autre.


Bah non. Une boucle for classique n'est pas une expression, n'a pas de filtre et ne passe pas par du bytecode dédié (LIST_APPEND, sans même parler des genexpr). Le bytecode a des similarités (mais pas identique de loin[0]), mais le parser est complètement différent et les deux constructions sont à des endroits sans rapports dans la grammaire

 

[0]

>>> dis.dis(lambda: [e for e in mylist if e is not None])
  1           0 BUILD_LIST               0
              3 DUP_TOP            
              4 STORE_FAST               0 (_[1])
              7 LOAD_GLOBAL              0 (mylist)
             10 GET_ITER            
        >>   11 FOR_ITER                30 (to 44)
             14 STORE_FAST               1 (e)
             17 LOAD_FAST                1 (e)
             20 LOAD_CONST               0 (None)
             23 COMPARE_OP               9 (is not)
             26 JUMP_IF_FALSE           11 (to 40)
             29 POP_TOP            
             30 LOAD_FAST                0 (_[1])
             33 LOAD_FAST                1 (e)
             36 LIST_APPEND        
             37 JUMP_ABSOLUTE           11
        >>   40 POP_TOP            
             41 JUMP_ABSOLUTE           11
        >>   44 DELETE_FAST              0 (_[1])
             47 RETURN_VALUE        


>>> def f():
...     l = []
...     for e in mylist:
...             if e is not None:
...                     l.append(e)
...     return l
...
>>> dis.dis(f)
  2           0 BUILD_LIST               0
              3 STORE_FAST               0 (l)
  3           6 SETUP_LOOP              44 (to 53)
              9 LOAD_GLOBAL              0 (mylist)
             12 GET_ITER            
        >>   13 FOR_ITER                36 (to 52)
             16 STORE_FAST               1 (e)
  4          19 LOAD_FAST                1 (e)
             22 LOAD_CONST               0 (None)
             25 COMPARE_OP               9 (is not)
             28 JUMP_IF_FALSE           17 (to 48)
             31 POP_TOP            
  5          32 LOAD_FAST                0 (l)
             35 LOAD_ATTR                2 (append)
             38 LOAD_FAST                1 (e)
             41 CALL_FUNCTION            1
             44 POP_TOP            
             45 JUMP_ABSOLUTE           13
        >>   48 POP_TOP            
             49 JUMP_ABSOLUTE           13
        >>   52 POP_BLOCK          
  6     >>   53 LOAD_FAST                0 (l)
             56 RETURN_VALUE        
     


Message édité par masklinn le 27-03-2013 à 21:51:28

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2182858
suizokukan
Posté le 27-03-2013 à 22:08:37  profilanswer
 

Merci Masklinn, c'est très clair en effet : je ne pensais que la différence était aussi grande.


---------------
rule #1 : trust the python

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  syntaxe des boucles et des "lists comprehensions" [résolu]

 

Sujets relatifs
Bash avec des boucles à exécuter avec du PHP[FICO Xpress] étrange erreur - problème syntaxe
VBA (Excel 2010) Syntaxe RangeProbléme syntaxe macro excel 4
syntaxe du RedirectPermanent dans htaccess [Notepad++] modification de syntaxe langue (xml)
[jquery] Question un peu bateau sur les bouclespbl syntaxe
IFRAME et syntaxe[BATCH] 2 boucles FOR imbriquées
Plus de sujets relatifs à : syntaxe des boucles et des "lists comprehensions" [résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR