Итерирование по нескольким последовательностям с помощью функции zip()
Существует еще один полезный прием — параллельное итерирование по нескольким последовательностям с помощью функции zip():
>>>> days = ['Monday', 'Tuesday', 'Wednesday']
>>>> fruits = ['banana', 'orange', 'peach']
>>>> drinks = ['coffee', 'tea', 'beer']
>>>> desserts = ['tiramisu', 'ice cream', 'pie', 'pudding']
>>>> for day, fruit, drink, dessert in zip(days, fruits, drinks, desserts):
>…·····print(day, ": drink", drink, "eat", fruit, "enjoy", dessert)
>…
>Monday: drink coffee — eat banana — enjoy tiramisu
>Tuesday: drink tea — eat orange — enjoy ice cream
>Wednesday: drink beer — eat peach — enjoy pie
Функция zip() прекращает свою работу, когда выполняется самая короткая последовательность. Один из списков (desserts) оказался длиннее остальных, поэтому никто не получит пудинг, пока мы не увеличим остальные списки.
В разделе «Словари» главы 3 показывается, как с помощью функции dict() можно создавать словари из последовательностей, содержащих два элемента, вроде кортежей, списков или строк. Вы можете использовать функцию zip(), чтобы пройти по нескольким последовательностям и создать кортежи из элементов с одинаковыми смещениями. Создадим два кортежа из соответствующих друг другу английских и французских слов:
>>>> english = 'Monday', 'Tuesday', 'Wednesday'
>>>> french = 'Lundi', 'Mardi', 'Mercredi'
Теперь используем функцию zip(), чтобы объединить эти кортежи в пару. Значение, возвращаемое функцией zip(), само по себе не является списком или кортежем, но его можно преобразовать в любую из этих последовательностей:
>>>> list(zip(english, french))
>[('Monday', 'Lundi'), ('Tuesday', 'Mardi'), ('Wednesday', 'Mercredi')]
Передайте результат работы функции zip() непосредственно функции dict() — и у нас готов небольшой англо-французский словарь!
>>>> dict(zip(english, french))
>{'Monday': 'Lundi', 'Tuesday': 'Mardi', 'Wednesday': 'Mercredi'}
Генерирование числовых последовательностей с помощью функции range()
Функция range() возвращает поток чисел в заданном диапазоне без необходимости создавать и сохранять крупную структуру данных вроде списка или кортежа. Это позволяет вам создавать большие диапазоны, не использовав всю память компьютера и не обрушив программу.
Вы можете применять функцию range() аналогично slice(): range(start, stop, step). Если опустите значение start, диапазон начнется с 0. Необходимым является лишь значение stop: как и в случае со slice(), оно определяет последнее значение, которое будет создано прямо перед остановкой функции. Значение по умолчанию step равно 1, но вы можете изменить его на -1.