Python Language Déballer les Iterables


Exemple

Python 3.x 3.0

Dans Python 3, vous pouvez décompresser une itération sans connaître le nombre exact d'éléments, et même avoir une variable contenant la fin de l'itérable. Pour cela, vous fournissez une variable pouvant collecter une liste de valeurs. Cela se fait en plaçant un astérisque avant le nom. Par exemple, décompresser une list :

first, second, *tail, last = [1, 2, 3, 4, 5]
print(first)
# Out: 1
print(second)
# Out: 2
print(tail)
# Out: [3, 4]
print(last)
# Out: 5

Remarque : Lorsque vous utilisez la syntaxe de la *variable , la variable sera toujours une liste, même si le type d’origine n’était pas une liste. Il peut contenir zéro ou plusieurs éléments en fonction du nombre d'éléments de la liste d'origine.

first, second, *tail, last = [1, 2, 3, 4]
print(tail)
# Out: [3]

first, second, *tail, last = [1, 2, 3]
print(tail)
# Out: []
print(last)
# Out: 3

De même, décompresser un str :

begin, *tail = "Hello"
print(begin)
# Out: 'H'
print(tail)
# Out: ['e', 'l', 'l', 'o']

Exemple de déballage d'une date ; _ est utilisé dans cet exemple comme une variable jetable (nous nous intéressons uniquement à la valeur de l' year ):

person = ('John', 'Doe', (10, 16, 2016))
*_, (*_, year_of_birth) = person
print(year_of_birth)
# Out: 2016

Il convient de mentionner que, puisque * mange un nombre variable d’éléments, vous ne pouvez pas avoir deux * pour la même itération dans une affectation - il ne saurait pas combien d’éléments entrent dans la première décompression, et combien dans la seconde. :

*head, *tail = [1, 2]
# Out: SyntaxError: two starred expressions in assignment
Python 3.x 3.5

Jusqu'à présent, nous avons discuté du déballage dans les missions. * et ** ont été étendus dans Python 3.5 . Il est maintenant possible d'avoir plusieurs opérations de décompression dans une expression:

{*range(4), 4, *(5, 6, 7)}
# Out: {0, 1, 2, 3, 4, 5, 6, 7}
Python 2.x 2.0

Il est également possible de décompresser une itération en arguments de fonction:

iterable = [1, 2, 3, 4, 5]
print(iterable)
# Out: [1, 2, 3, 4, 5]
print(*iterable)
# Out: 1 2 3 4 5
Python 3.x 3.5

Le déballage d'un dictionnaire utilise deux étoiles adjacentes ** ( PEP 448 ):

tail = {'y': 2, 'z': 3}
{'x': 1, **tail}
 # Out: {'x': 1, 'y': 2, 'z': 3}

Cela permet à la fois de remplacer les anciennes valeurs et de fusionner les dictionnaires.

dict1 = {'x': 1, 'y': 1}
dict2 = {'y': 2, 'z': 3}
{**dict1, **dict2}
# Out: {'x': 1, 'y': 2, 'z': 3}
Python 3.x 3.0

Python 3 a supprimé le déballage des tuple dans les fonctions. Par conséquent, ce qui suit ne fonctionne pas en Python 3

# Works in Python 2, but syntax error in Python 3:
map(lambda (x, y): x + y, zip(range(5), range(5)))
# Same is true for non-lambdas:
def example((x, y)):
    pass

# Works in both Python 2 and Python 3:
map(lambda x: x[0] + x[1], zip(range(5), range(5)))
# And non-lambdas, too:
def working_example(x_y):
    x, y = x_y
    pass

Voir PEP 3113 pour une justification détaillée.