Выбрать главу

>>> for card, contents in accusation.items():

…·····print('Card', card, 'has the contents', contents)

Card weapon has the contents lead pipe

Card person has the contents Col. Mustard

Card room has the contents ballroom

Прерываем цикл с помощью break

Ключевое слово break в цикле for прерывает этот цикл точно так же, как и цикл while.

Пропускаем итерации с помощью continue

Добавление ключевого слова continue в цикл for позволяет перейти на следующую итерацию цикла, как и в случае с циклом while.

Проверяем, завершился ли цикл заранее, с помощью else

Как и в цикле while, в for имеется опциональный блок else, который проверяет, выполнился ли цикл for полностью. Если ключевое слово break не было вызвано, будет выполнен блок else.

Это полезно, если вам нужно убедиться в том, что предыдущий цикл выполнился полностью, вместо того чтобы рано прерваться. Цикл for в следующем примере выводит на экран название сыра и прерывается, если сыра в магазине не найдется:

>>> cheeses = []

>>> for cheese in cheeses:

…·····print('This shop has some lovely', cheese)

…·····break

… else:··# отсутствие прерывания означает, что сыра нет

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

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

Как и в цикле while, в цикле for использование блока else может показаться нелогичным. Можно рассматривать цикл for как поиск чего-то, в таком случае else будет вызываться, если вы ничего не нашли. Чтобы получить тот же эффект без блока else, используйте переменную, которая будет показывать, нашелся ли искомый элемент в цикле for, как здесь:

>>> cheeses = []

>>> found_one = False

>>> for cheese in cheeses:

…·····found_one = True

…·····print('This shop has some lovely', cheese)

…·····break

>>> if not found_one:

…·····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.