Question Comment python "sait-il" quoi faire avec le mot-clé "in"?


Je suis un peu dérouté par le mot-clé "in" en python.

Si je prends une liste d'échantillons de tuples:

data = [
    (5, 1, 9.8385465),
    (10, 1, 8.2087544),
    (15, 1, 7.8788187),
    (20, 1, 7.5751283)
]

Je peux faire deux boucles "for-in" différentes et obtenir des résultats différents:

for G,W,V in data:
    print G,W,V

Cela imprime chaque ensemble de valeurs sur une ligne, par ex. 5, 1, 9.8385465

for i in data:
    print i

Ceci imprime le tuple entier, par ex. (5, 1, 9.8385465)

Comment python "sait-il" qu'en fournissant une variable, je veux affecter le tuple à une variable, et qu'en fournissant trois variables, je veux affecter chaque valeur du tuple à l'une de ces variables?


34
2017-08-03 21:17


origine


Réponses:


Selon la for documentation de relevé composé:

Chaque article à son tour est affecté à la liste cible en utilisant la norme   règles pour les devoirs ...

Ceux "règles standard" sont dans la documentation de la cession d'affectation, Plus précisément:

L'affectation d'un objet à une liste cible est définie récursivement comme   suit

  • Si la liste cible est une cible unique: l'objet est affecté à cette cible.

  • Si la liste cible est une liste de cibles séparées par des virgules: L'objet doit être une itération avec le même nombre d'éléments qu'il y a de cibles   dans la liste cible, et les éléments sont affectés, de gauche à droite, à   les cibles correspondantes.

Ce comportement différent, selon que vous affectiez une seule cible ou une liste de cibles, est directement intégré aux fondamentaux de Python et s'applique partout où l’affectation est utilisée.


36
2017-08-03 21:23



Ce n'est pas vraiment une caractéristique de la in mot-clé, mais du langage Python. Le même fonctionne avec l'affectation.

x = (1, 2, 3)
print(x)
>>> (1, 2, 3)

a, b, c = (1, 2, 3)
print(a)
>>> 1
print(b)
>>> 2
print(c)
>>> 3

Donc, pour répondre à votre question, Python sait mieux que faire avec les affectations lorsque vous:

  • assigner un tuple à une variable, ou
  • assigner un tuple à un nombre de variables égal au nombre d'éléments du tuple

22
2017-08-03 21:24



C'est appelé déballage de tuple, et n'a rien à voir avec le in mot-clé.

le for loop renvoie la seule chose (un tuple dans ce cas), et puis que tuple est assigné - à un seul élément dans le second cas ou à plusieurs éléments dans le premier cas.

Si vous essayez de spécifier le nombre incorrect de variables:

for G,W in data:
    print G,W

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack

12
2017-08-03 21:22



Les itérateurs renvoient théoriquement un seul élément (le for a in b syntaxe).

Le compilateur sait que si vous spécifiez plus d'une chose pour a que la valeur renvoyée doit être elle-même itérable et contenir le même nombre d'éléments que votre liste de variables. Cela provoquerait une erreur d'exécution si vous aviez for a, b in c et les éléments de c ne contenait pas exactement deux éléments.

Donc en bref, il "savait" parce que c'est ce que vous lui avez dit. Il va exploser à l'exécution si vous avez menti ...


3
2017-08-03 21:21