2015-08-03 10 views
34

Jestem trochę zdezorientowany słowem kluczowym "in" w python.W jaki sposób python "wie", co zrobić ze słowem kluczowym "in"?

Jeśli wezmę przykładową listę krotek:

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

mogę zrobić dwa różne „dla - w” pętli i uzyskać różne wyniki:

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

Drukuje każdy zestaw wartości, na linia, np 5, 1, 9.8385465

for i in data: 
    print i 

Drukuje cały krotkę, np (5, 1, 9.8385465)

W jaki sposób Python "wie", że dostarczając jedną zmienną, chcę przypisać krotkę do zmiennej, a przez podanie trzech zmiennych chcę przypisać każdą wartość z krotki do jednej z tych zmiennych?

+7

To naprawdę nie wydaje mi się takie dziwne. Skąd wiadomo, co zrobić z tymi dwoma nieprzypadkowymi przypisaniami pętli: 'x = (1,2,3)' i 'a, b, c = (1,2,3)'? Jest po prostu zapisywany do parser/runtime. – jpmc26

+0

Przed tym nie wiedziałem, że mogę to zrobić :) Python jest dla mnie nowy i piszę w C i Java do tej pory. –

+2

@ Daniella. Co więcej, możesz zrobić "a, (b, c) = (1, (2, 3))". –

Odpowiedz

36

według the for compound statement documentation:

Each item in turn is assigned to the target list using the standard rules for assignments...

Those "standardowe zasady" są w the assignment statement documentation, a konkretnie:

Assignment of an object to a target list is recursively defined as follows.

  • If the target list is a single target: The object is assigned to that target.

  • If the target list is a comma-separated list of targets: The object must be an iterable with the same number of items as there are targets in the target list, and the items are assigned, from left to right, to the corresponding targets.

To odmienne zachowanie, w zależności od tego, czy przypisujesz pojedynczy cel, czy listę celów, jest wypiekane prosto w podstawy Pythona i obowiązuje wszędzie tam, gdzie używane jest zadanie.

3

Iteratory zwracają tylko jeden przedmiot (składnia for a in b).

Kompilator wie, że jeśli podasz więcej niż jedną rzecz dla a, zwrócona wartość musi sama w sobie być iterowalna i zawierać taką samą liczbę elementów, co lista zmiennych. Wystąpiłby błąd runtime, gdyby użytkownik miał for a, b in c, a elementy c nie zawierały dokładnie dwóch elementów.

Krótko mówiąc, "wiedział", ponieważ właśnie to powiedziałeś. Eksploduje w czasie wykonywania, jeśli kłamałeś ...

+0

To znaczy, że gdybym powiedział, powiedzmy, a, b = (1,2,3), to rzuciłby wyjątek? –

+3

@ Daniella. Tak: "ValueError: Zbyt wiele wartości do rozpakowania" –

+0

@ Daniella. - Możesz wypróbować 'a, b = (1,2,3)' w tłumaczu i sam zobaczyć wyniki. Wypróbuj również inne rzeczy, takie jak "a, b, c, d = 1,2,3" i "a, * b = 1,2,3". – TigerhawkT3

12

Nazywa się tuple unpacking i nie ma nic wspólnego ze słowem kluczowym in.

Pętla zwraca pojedynczą rzecz (w tym przypadku jest to tuple), a następnie tuple zostaje przypisana - do pojedynczego elementu w drugim przypadku lub wielu elementów w pierwszym przypadku.

Jeśli spróbujesz określający nieprawidłową liczbę zmiennych:

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 
+0

Czy to nadal nie jest rozpakowywanie, jak wskazuje błąd, "Zbyt wiele wartości do rozpakowania?" –

+0

@RiaD: Zmieniono link. –

22

To nie jest naprawdę funkcja słowa kluczowego in, ale języka Python. To samo działa z przydziałem.

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

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

Tak, aby odpowiedzieć na to pytanie, to bardziej, że Python nie wie, co zrobić z zadaniami podczas albo:

  • przypisać krotki do zmiennej lub
  • przypisać krotki do szeregu zmiennych równych liczbie elementów w krotce
Powiązane problemy