Hey, it works
String to capitalize [type q to quit]: q
>>>
Пропускаем итерации с помощью continue
Иногда вам нужно не прерывать весь цикл, а только пропустить по какой-то причине одну итерацию. Рассмотрим воображаемый пример: считаем целое число, выведем на экран его значение в квадрате, если оно четное, и пропустим его, если оно нечетное. Мы даже добавим несколько комментариев. И вновь для выхода из цикла используем строку "q":
>>> while True:
…·····value = input("Integer, please [q to quit]: ")
…·····if value == 'q':······# выход
…·········break
…·····number = int(value)
…·····if number % 2 == 0:···# нечетное число
…········continue
…·····print(number, "squared is", number*number)
…
Integer, please [q to quit]: 1
1 squared is 1
Integer, please [q to quit]: 2
Integer, please [q to quit]: 3
3 squared is 9
Integer, please [q to quit]: 4
Integer, please [q to quit]: 5
5 squared is 25
Integer, please [q to quit]: q
>>>
Проверяем, завершился ли цикл заранее, с помощью else
Если цикл while завершился нормально (без вызова break), управление передается в опциональный блок else. Вы можете использовать его в цикле, где выполняете некоторую проверку и прерываете цикл, как только проверка успешно выполняется. Блок else выполнится в том случае, если цикл while будет пройден полностью, но искомый объект не будет найден:
>>> numbers = [1, 3, 5]
>>> position = 0
>>> while position < len(numbers):
…·····number = numbers[position]
…·····if number % 2 == 0:
…·········print('Found even number', number)
…·········break
…·····position += 1
… else:··# break not called
…·····print('No even number found')
…
No even number found
Такое использование ключевого слова else может оказаться нелогичным. Рассматривайте его как проверку на прерывание цикла.
Выполняем итерации с помощью for
В Python итераторы часто используются по одной простой причине. Они позволяют вам проходить структуры данных, не зная, насколько эти структуры велики и как реализованы. Вы даже можете пройти по данным, которые были созданы во время работы программы, что позволяет обработать потоки данных, которые в противном случае не поместились бы в память компьютера.
Вполне возможно пройти по последовательности таким образом:
>>> rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']
>>> current = 0
>>> while current < len(rabbits):
…·····print(rabbits[current])
…·····current += 1
…
Flopsy
Mopsy
Cottontail
Peter
Однако существует более характерный для Python способ решения этой задачи:
>>> for rabbit in rabbits:
…·····print(rabbit)
…
Flopsy
Mopsy
Cottontail
Peter
Списки вроде rabbits являются одними из итерабельных объектов в Python наряду со строками, кортежами, словарями и некоторыми другими элементами. Итерирование по кортежу или списку возвращает один элемент за раз. Итерирование по строке возвращает один символ за раз, как показано здесь:
>>> word = 'cat'
>>> for letter in word:
…·····print(letter)
…
c
a
t
Итерирование по словарю (или его функции keys()) возвращает ключи. В этом примере ключи являются типами карт в настольной игре Clue (за пределами Северной Америки она называется CluedoAmerica):
>>> accusation = {'room': 'ballroom', 'weapon': 'lead pipe',
··················'person': 'Col. Mustard'}
>>> for card in accusation:··#··или for card in accusation.keys():
…·····print(card)
…
room
weapon
person
Чтобы итерировать по значениям, а не по ключам, следует использовать функцию values():
>>> for value in accusation.values():
…·····print(value)
…
ballroom
lead pipe
Col. Mustard
Чтобы вернуть как ключ, так и значение кортежа, вы можете использовать функцию items():
>>> for item in accusation.items():
…·····print(item)
…
('room', 'ballroom')
('weapon', 'lead pipe')
('person', 'Col. Mustard')
Помните, что можете присвоить значение кортежу за один шаг. Для каждого кортежа, возвращенного функцией items(), присвойте первое значение (ключ) переменной card, а второе (значение) — переменной contents: