Подтвердить что ты не робот

Как 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 "знает", что, предоставляя одну переменную, я хочу назначить кортеж переменной, и что, предоставив три переменные, я хочу назначить каждое значение из кортежа одной из этих переменных?

4b9b3361

Ответ 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 не содержат ровно два элемента.

Короче говоря, он "знал", потому что это то, что вы сказали. Он будет взрываться во время выполнения, если вы лжете...