Как python "знает", что делать с ключевым словом "in"?
Я немного смущен ключевым словом "in" в python.
Если я беру примерный список кортежей:
data = [
(5, 1, 9.8385465),
(10, 1, 8.2087544),
(15, 1, 7.8788187),
(20, 1, 7.5751283)
]
Я могу сделать два разных цикла for-in и получить разные результаты:
for G,W,V in data:
print G,W,V
Это печатает каждый набор значений в строке, например. 5, 1, 9.8385465
for i in data:
print i
Это печатает весь набор, например. (5, 1, 9.8385465)
Как python "знает", что, предоставляя одну переменную, я хочу назначить кортеж переменной, и что, предоставив три переменные, я хочу назначить каждое значение из кортежа одной из этих переменных?
Ответы
Ответ 1
В соответствии с документацией составных операторов for
:
Каждый элемент в свою очередь присваивается целевому списку с использованием стандартного правила для присвоений...
Эти "стандартные правила" находятся в документации инструкции присваивания, в частности:
Назначение объекта целевому списку рекурсивно определяется как следующим образом.
-
Если целевой список является единственной целью: объект присваивается этой цели.
-
Если целевой список представляет собой список целей, разделенных запятыми: объект должен быть итерабельным с тем же количеством элементов, что и цели в целевом списке, а элементы назначаются слева направо, чтобы соответствующие цели.
Таким образом, это различное поведение в зависимости от того, назначается ли вам одна цель или список целей, испекается прямо в фундаментальных принципах Python и применяется везде, где используется назначение.
Ответ 2
На самом деле это не функция ключевого слова in
, а языка Python. То же самое работает с назначением.
x = (1, 2, 3)
print(x)
>>> (1, 2, 3)
a, b, c = (1, 2, 3)
print(a)
>>> 1
print(b)
>>> 2
print(c)
>>> 3
Итак, чтобы ответить на ваш вопрос, более того, что Python знает, что делать с присваиваниями, когда вы:
- назначить кортеж переменной или
- назначает кортеж ряду переменных, равным количеству элементов в кортеже
Ответ 3
Он вызвал распаковку кортежей и не имеет ничего общего с ключевым словом in
.
В этом случае цикл for
возвращает одну вещь (a tuple
), а затем присваивается tuple
- одному элементу во втором случае или нескольким элементам в первом случае.
Если вы попытаетесь указать неправильное количество переменных:
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
Ответ 4
Итераторы, как правило, возвращают один элемент (синтаксис for a in b
).
Компилятор знает, что если вы укажете более чем одну вещь для a
, то возвращаемое значение должно быть итерируемым и содержать то же количество элементов, что и ваш список переменных. Это вызовет ошибку времени выполнения, если у вас есть for a, b in c
, а элементы c
не содержат ровно два элемента.
Короче говоря, он "знал", потому что это то, что вы сказали. Он будет взрываться во время выполнения, если вы лжете...