Введение
Чтобы быть в состоянии понять приемы цикла for, нам нужно сначала знать, как присваивать значения нескольким переменным одновременно. Это работает следующим образом:
|
|
Мы можем использовать ()
и []
вокруг этих значений так, как мы хотим, и все по-прежнему будет работать таким же образом. []
создает список, а ()
создает кортеж.
|
|
Мы также можем иметь []
или ()
на одной стороне, но не на другой стороне.
|
|
Python автоматически создал кортеж.
|
|
Если мы зацикливаемся на списке с парами значений в нем, мы могли бы сделать это:
|
|
Или мы можем сказать циклу for распаковать его для нас.
|
|
Эта функция часто используется со встроенными в Python функциями zip()
и enumerate()
.
zip
Что приходит вам на ум, когда вы слышите слово молния
? Механизм, широко используемый для связывания двух частей чего-либо, например рубашки или пиджака. Функции Python zip()
делают практически то же самое, это помогает нам связать соответствующие элементы вместе.
|
|
Обратите внимание, что print(user_details)
работает не так, как ожидалось:
|
|
Это потому, что zip()
является итератором, то есть ленивым: он выдает элементы по мере необходимости, вместо того, чтобы вычислять их и сохранять в памяти все сразу, как список. Таким образом, объект zip не может показать свои элементы до того, как они будут использованы, потому что он их еще не вычислил.
|
|
Если списки имеют разную длину, некоторые элементы из конца более длинного списка будут проигнорированы.
|
|
Здесь самый короткий список - “пользователи” длиной 3, поэтому “zip (пользователи, электронные письма)” принимает только первые 3 электронных письма.
Мы не рекомендуем вызывать zip()
со списками разной длины, потому что игнорирование элементов обычно не то, что вы намеревались делать.
Использование zip в цикле for
Очень часто for
зацикливается на zip()
и распаковывает возвращенные кортежи в цикле for
.
Вот почему мы представили распаковку в начале этой страницы.
При использовании таким образом нет необходимости преобразовывать результат zip(...)
в список.
|
|
enumerate
enumerate()
- это удивительная встроенная функция, предлагаемая python. При использовании дает нам объединенный индекс и элемент.
|
|
Также возможно (но более сложно) сделать это без enumerate()
:
|
|
Здесь:
range(0, len(even_nums))
дает 0,1,2,3,4,5, при этом длина списка 6 исключена. Это индексы нашего списка длиной 6.even_nums[index]
выводит каждый элементeven_nums
, потому чтоindex
берется из диапазона всех индексов в этом списке.
Поскольку об этом сложно думать и легко ошибиться, лучше использовать enumerate()
.