Цикл for#
Очень часто одно и то же действие надо выполнить для набора однотипных данных. Например, преобразовать все строки в списке в верхний регистр. Для выполнения таких действий в Python используется цикл for.
Цикл for перебирает по одному элементы указанной последовательности и выполняет действия, которые указаны в блоке for, для каждого элемента.
Примеры последовательностей элементов, по которым может проходиться цикл for:
строка
список
словарь
Функция range
любой итерируемый объект
Для понимания может помочь проект pythontutor . Там имеется визуализация кода, позволяющая увидеть, что происходит на каждом этапе выполнения кода. На сайте pythontutor можно загружать свой код. Цикл for может работать с любой последовательностью элементов. Например, выше использовался список и цикл перебирал элементы списка. Аналогичным образом for работает с кортежами.
Напечатать элементы списка
Без цикла:
fruits = ["apple", "banana", "cherry"]
print(fruits[0])
print(fruits[1])
print(fruits[2])
apple
banana
cherry
Можно копировать и вставлять, но если строк будет 1000, 10000, 1000000 …
С использованием цикла:
fruits = ["apple", "banana", "cherry"]
for x in fruits:
print(x)
apple
banana
cherry
Можно прочитать это следующим образом: “Для каждого элемента x списка fruits применить операцию print(x)”.
Сначала x принимает значение apple, потом banana и так далее.
Напечатать каждый символ строки отдельно
for x in "banana":
print(x)
b
a
n
a
n
a
for x in "banana":
# вывод каждого символа строки с разделителем +
print(x, end = '+')
b+a+n+a+n+a+
Преобразовать первый символ каждой строки в верхний регистр. Преобразованный список сохранить отдельно
# исходный список
words = ['иванов','петров','сидоров']
# новый список
new_words = []
# Для (for) каждого элемента (el) списка words
for el in words:
# Выполнить операции:
# Преобразовать первую букву в верхний регистр
new_words.append(el.capitalize())
print(words)
print(new_words)
['иванов', 'петров', 'сидоров']
['Иванов', 'Петров', 'Сидоров']
Вывести список каждого отдела организации
# Словарь с фамилиями сотрудников отделов
dict_staff = {'Отдел сбыта': ['Ильина',
'Куликов',
'Сергиенко',
'Корепин',
'Климов',
'Попкова'],
'Вице-президенты':['Гладких'],
'Начальники отделов':['Новиков'],
'Координаторы':['Ожогина']}
# Проход по словарю (по ключам)
for key in dict_staff:
# Печать ключа словаря (отдел)
print(key)
# Разделитель
print('-' * 10)
# Печать значения по ключу (список отдела)
print(dict_staff[key])
# Пустая строка
print()
Метод items позволяет проходиться в цикле сразу по паре ключ-значение:
# Словарь с фамилиями сотрудников отделов
dict_staff = {'Отдел сбыта': ['Ильина',
'Куликов',
'Сергиенко',
'Корепин',
'Климов',
'Попкова'],
'Вице-президенты':['Гладких'],
'Начальники отделов':['Новиков'],
'Координаторы':['Ожогина']}
# Проход по словарю (по ключам)
for key,value in dict_staff.items():
# Печать ключа словаря (отдел)
print(key)
# Разделитель
print('-' * 10)
# Печать значения по ключу (список отдела)
print(value)
# Пустая строка
print()
Отдел сбыта
----------
['Ильина', 'Куликов', 'Сергиенко', 'Корепин', 'Климов', 'Попкова']
Вице-президенты
----------
['Гладких']
Начальники отделов
----------
['Новиков']
Координаторы
----------
['Ожогина']
Функция range#
Возвращает числовой диапазон
Синтаксис:
range(start,end,step)
start - начальное значение диапазона
end - конечное значение диапазона. В диапазон не включается
step - шаг изменнения (по-умолчанию 1)
Формируется диапазон от значения start до значения end-1.
Используется, когда необходимо цикл for применить к числовому промежутку.
range(9)
range(0, 9)
# За начальное значение диапазона берется 0
for i in range(3):
print(i)
0
1
2
for i in range(23, 26):
print(i)
23
24
25
# Печать диапазона с шагом 2
for i in range(1, 10, 2):
print(i, end=' ')
1 3 5 7 9
Примеры использования range
При использовании оператора in в цикле мы можем работать только с тем экземпляром итерируемого объекта, на который он указывает. А если необходимо использовать индексы, то нужно брать range.
Напечатать индексы четных элементов
# Исходный список
df = [1, 4, 5, 7, 9, 8, 2, 4]
# Пустой список для четных индексов
even_indexes = []
for index in range(len(df)):
# У четного числа остаток от деления на 0 равен 0 (% остаток от деления)
if index % 2 == 0:
even_indexes.append(index)
print(f'Исходный список: {df}')
print(f'Индексы четных элементов: {even_indexes}')
# Исходный список
df = [1, 4, 5, 7, 9, 8, 2, 4]
# Пустой список для четных индексов
even_indexes = []
for index in range(len(df)):
# У четного числа остаток от деления на 0 равен 0 (% остаток от деления)
if index % 2 == 0:
even_indexes.append(index)
print(f'Исходный список: {df}')
print(f'Индексы четных элементов: {even_indexes}')
Исходный список: [1, 4, 5, 7, 9, 8, 2, 4]
Индексы четных элементов: [0, 2, 4, 6]
Из заданной строки сформировать новую, где каждый символ есть максимальный символ среди соседей символа в исходной строке.
Вход: ромашка Выход: ррошшшк
input_string = input('Введите строку: ')
# Длина строки
count_chars = len(input_string)
output_string = ''
# Цикл для диапазона индексов от 0 до длина строки-1
for index in range(0,count_chars):
# Если индекс от 1 до предпоследнего
if index > 0 and index < count_chars-1:
# Вычислить максимальный среди окружающих
s = max(input_string[index],input_string[index-1],input_string[index+1])
output_string += s
# Если индекс равен 0, то сравниваем с соседом справа
elif index == 0:
s = max(input_string[index],input_string[index+1])
output_string += s
else:
# Иначе сравниваем с соседом слева
s = max(input_string[index],input_string[index-1])
output_string += s
print(output_string)
Введите строку: ромашка
ррошшшк
Вложенные циклы#
Вложенный цикл - это цикл внутри цикла.
“Внутренний цикл” будет выполняться один раз для каждой итерации “внешнего цикла”.:
adj = ["красный", "большой", "вкусный"]
fruits = ["яблоко", "банан", "вишня"]
for a in adj:
for f in fruits:
print(a,' ', f)
красный яблоко
красный банан
красный вишня
большой яблоко
большой банан
большой вишня
вкусный яблоко
вкусный банан
вкусный вишня
Напечатать таблицу умножения для чисел от 2 до 5
for x in range (2,6):
for y in range(2,6):
print(f'{x} * {y} = {x*y}') # относится к циклу по y
print('-'*10) # относится к циклу по x
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
----------
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
----------
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
----------
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
----------
Прерывание цикла: break#
Используется в случае принудительного выхода из цикла
fruits = ["apple", "banana", "cherry"]
for x in fruits:
# Если элемент равен 'banana', то прервать цикл
if x == "banana":
break
print(x)
print('Game over')
fruits = ["apple", "banana", "cherry"]
for x in fruits:
# Если элемент равен 'banana', то прервать цикл
if x == "banana":
break
print(x)
print('Game over')
apple
Game over
Пропуск части цикла: continue#
Используется в случае необходимости принудительно начать следующий шаг цикла, пропустив часть строк в его теле. а перейти к обработке следующего элемента
fruits = ["apple", "banana", "cherry"]
for x in fruits:
# Если элемент равен 'banana', то не выполнять дальнейшие инструкции цикла,
# а перейти к обработке следующего элемента
if x == "banana":
continue
print(x)
apple
cherry
Из диапазона от 1 до 10 включительно вывести только те числа, которые не делятся ни на 2, ни на 3.
Пояснение: В данном примере надо пропускать числа, которые делятся на 2 и 3
for i in range(1, 11):
if i%2 == 0 or i%3 == 0:
continue
print(i)
1
5
7
else в цикле#
else-код выполнится после того, как пройдут все витки цикла
fruits = ["apple", "cherry","orange"]
for x in fruits:
# Если элемент равен 'banana', то прервать цикл
if x == "banana":
break
print(x)
else:
print('Успешное окончание цикла. Все итерации выполнены')
print('Программа окончена')
apple
cherry
orange
Успешное окончание цикла. Все итерации выполнены
Программа окончена
В данном примере break не выполнился, поэтому ветка else выполнилась. В случае срабатывания break, else не выполняется.
fruits = ["apple", "cherry", "banana", "orange"]
for x in fruits:
# Если элемент равен 'banana', то прервать цикл
if x == "banana":
break
print(x)
else:
print('Успешное окончание цикла. Все итерации выполнены')
print('Программа окончена')
apple
cherry
Программа окончена