Простой Python. Современный стиль программирования (Любанович) - страница 57

>…·····print('This is not much of a cheese shop, is it?')

>…

>This is not much of a cheese shop, is it?

Итерирование по нескольким последовательностям с помощью функции 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.