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