Введение
Чтобы быть в состоянии понять приемы цикла 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().
