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

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

Marsh Posté le 27-03-2013 à 21:18:23    

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
Reply

Marsh Posté le 27-03-2013 à 21:18:23   

Reply

Marsh Posté le 27-03-2013 à 21:22:38    

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
Reply

Marsh Posté le 27-03-2013 à 21:27:34    

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
Reply

Marsh Posté le 27-03-2013 à 21:48:20    

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
Reply

Marsh Posté le 27-03-2013 à 22:08:37    

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


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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed