Changement dans l’unpacking des iterables en Python 3


Ahhh, l’unpacking… On croit qu’on a complètement fait le tour de cette fonctionalité merveilleuse, et PAF, on découvre encore autre chose.

Par exemple, la syntaxe a été améliorée avec Python 3, et accepte maintenant un unpacking partiel !

Ca se fait en l’utilisant l’opérateur splat, c’est à dire l’étoile :

>>> l = list(range(5))
>>> l
[0, 1, 2, 3, 4]
>>> a, *b = l
>>> a
0
>>> b
[1, 2, 3, 4]
>>> a, *b, c = l
>>> a
0
>>> b
[1, 2, 3]
>>> c
4

Ca marche bien entendu également dans les boucles for.

6 thoughts on “Changement dans l’unpacking des iterables en Python 3

  • foxmask

    on ne peut pas faire cela en python 2.x ?

    bon je me réponds zamoimeme j’ai fait le test tout connement : nan on peut pas : sinon ca donne

    In [4]: a, *b = l
    File "", line 1
    a, *b = l
    ^
    SyntaxError: invalid syntax

  • Sam Post author

    @foxmask : en 2.7, on pouvait faire :

    a, b = l[0], l[1:]

    Mais ça ne marque qu’avec les sliceable, donc pas avec tous les itérables comme les générateurs.

  • Recher

    Ça donnerait quoi ça ?

    liste = [0, 1, 2]
    a, b, c, *d = liste

    Ça fait une exception, ou ça met une liste vide dans d ?

    (j’ai pas de python 3 sous la main pour le tester)

  • residante

    Liste vide apparemment ce qui n’est pas plus mal.

    >>> liste = [0, 1, 2]
    >>> a, b, c, *d = liste
    >>> a, b, c, d
    (0, 1, 2, [])
  • A horse with no

    @Recher : si tu as un navigateur sous la main, tu as un python 3 sous la main ;)

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.