Циклы
Последнее обновление: 15.01.2022
Циклы позволяют выполнять некоторое действие в зависимости от соблюдения некоторого условия. В языке Python есть следующие типы циклов:
-
while
-
for
Цикл while
Цикл while проверяет истинность некоторого условия, и если условие истинно, то выполняет инструкции цикла.
Он имеет следующее формальное определение:
while условное_выражение: инструкции
После ключевого слова while указывается условное выражение, и пока это выражение возвращает значение True
,
будет выполняться блок инструкций, который идет далее.
Все инструкции, которые относятся к циклу while, располагаются на последующих строках и должны иметь отступ от начала ключевого слова while.
number = 1 while number < 5: print(f"number = {number}") number += 1 print("Работа программы завершена")
В данном случае цикл while будет выполняться, пока переменная number меньше 5.
Сам блок цикла состоит из двух инструкций:
print(f"number = {number}") number += 1
Обратите внимание, что они имеют отступы от начала оператора while — в данном случае от начала строки. Благодаря этому Python может определить,
что они принадлежат циклу. В самом цикле сначала выводится значение переменной number, а потом ей присваивается новое значение. .
Также обратите внимание, что последняя инструкция print("Работа программы завершена")
не имеет отступов от начала строки, поэтому она не
входит в цикл while.
Весь процесс цикла можно представить следующим образом:
-
Сначала проверяется значение переменной number — меньше ли оно 5. И поскольку вначале переменная равна 1, то это условие возвращает
True
,
и поэтому выполняются инструкции циклаИнструкции цикла выводят на консоль строку
number = 1
. И далее значение переменной number увеличивается на единицу — теперь она равна 2. Однократное выполнение блока инструкций цикла
называется итерацией. То есть таким образом, в цикле выполняется первая итерация. -
Снова проверяется условие
number < 5
. Оно по прежнему равно True, так как number = 2, поэтому выполняются инструкции циклаИнструкции цикла выводят на консоль строку
number = 2
. И далее значение переменной number опять увеличивается на единицу — теперь она равна 3.
Таким образом, выполняется вторая итерация. -
Опять проверяется условие
number < 5
. Оно по прежнему равно True, так как number = 3, поэтому выполняются инструкции циклаИнструкции цикла выводят на консоль строку
number = 3
. И далее значение переменной number опять увеличивается на единицу — теперь она равна 4.
То есть выполняется третья итерация. -
Снова проверяется условие
number < 5
. Оно по прежнему равно True, так как number = 4, поэтому выполняются инструкции циклаИнструкции цикла выводят на консоль строку
number = 4
. И далее значение переменной number опять увеличивается на единицу — теперь она равна 5.
То есть выполняется четвертая итерация. -
И вновь проверяется условие
number < 5
. Но теперь оно равно False, так как number = 5,
поэтому выполняются выход из цикла. Все цикл — завершился. Дальше уже выполняются действия, которые определены после цикла. Таким образом, данный цикл
произведет четыре прохода или четыре итерации
В итоге при выполнении кода мы получим следующий консольный вывод:
number = 1 number = 2 number = 3 number = 4 Работа программы завершена
Для цикла while также можно определить дополнительный блок else, инструкции которого выполняются, когда условие равно False:
number = 1 while number < 5: print(f"number = {number}") number += 1 else: print(f"number = {number}. Работа цикла завершена") print("Работа программы завершена")
То есть в данном случае сначала проверяется условие и выполняются инструкции while. Затем, когда условие становится равным False, выполняются инструкции
из блока else. Обратите внимание, что инструкции из блока else также имеют отступы от начала конструкции цикла. В итоге в данном случае мы получим
следующий консольный вывод:
number = 1 number = 2 number = 3 number = 4 number =5. Работа цикла завершена Работа программы завершена
Блок else может быть полезен, если условие изначально равно False, и мы можем выполнить некоторые действия по этому поводу:
number = 10 while number < 5: print(f"number = {number}") number += 1 else: print(f"number = {number}. Работа цикла завершена") print("Работа программы завершена")
В данном случае условие number < 5
изначально равно False, поэтому цикл не выполняет ни одной итерации и сразу переходит в блоку else.
Цикл for
Другой тип циклов представляет конструкция for. Этот цикл пробегается по набору значений, помещает каждое значение в
переменную, и затем в цикле мы можем с этой переменной производить различные действия. Формальное определение цикла for:
for переменная in набор_значений: инструкции
После ключевого слова for идет название переменной, в которую будут помещаться значения. Затем после оператора
in указывается набор значений и двоеточие.
А со следующей строки располагается блок инструкций цикла, которые также должны иметь отступы от начала цикла.
При выполнении цикла Python последовательно получает все значения из набора и передает их переменную. Когда все значения из набора будут
перебраны, цикл завершает свою работу.
В качестве набора значений, например, можно рассматривать строку, которая по сути представляет набор символов. Посмотрим на примере:
message = "Hello" for c in message: print(c)
В цикле определяется переменную c
, после оператора in
в качестве перебираемого набора указана переменная message, которая хранит
строку «Hello». В итоге цикл for будет перебираеть последовательно все символы из строки message и помещать их в переменную c. Блок самого цикла
состоит из одной инструкции, которая выводит значение переменной с на консоль. Консольный вывод программы:
Цикл for также может иметь дополнительный блок else, который выполняется после завершения цикла:
message = "Hello" for c in message: print(c) else: print(f"Последний символ: {c}. Цикл завершен"); print("Работа программы завершена") # инструкция не имеет отступа, поэтому не относится к else
В данном случае мы получим следующий консольный вывод:
H e l l o Последний символ: o. Цикл завершен Работа программы завершена
Стоит отметить, что блок else имеет доступ ко всем переменным, которые определены в цикле for.
Вложенные циклы
Одни циклы внутри себя могут содержать другие циклы. Рассмотрим на примере вывода таблицы умножения:
i = 1 j = 1 while i < 10: while j < 10: print(i * j, end="t") j += 1 print("n") j = 1 i += 1
Внешний цикл while i < 10:
срабатывает 9 раз пока переменная i не станет равна 10. Внутри этого цикла срабатывает
внутренний цикл while j < 10:
. Внутренний цикл также срабатывает 9 раз пока переменная j не станет равна 10.
Причем все 9 итераций внутреннего цикла срабатывают в рамках одной итерации внешнего цикла.
В каждой итерации внутреннего цикла на консоль будет выводится произведение чисел i и j. Затем значение переменной j увеличивается на единицу.
Когда внутренний цикл закончил работу, значений переменной j сбрасывается в 1, а значение переменной i увеличивается на единицу и происходит переход к
следующей итерации внешнего цикла. И все повторяется, пока переменная i не станет равна 10. Соответственно внутренний цикл сработает всего
81 раз для всех итераций внешнего цикла. В итоге мы получим следующий консольный вывод:
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
Подобным образом можно определять вложенные циклы for:
for c1 in "ab": for c2 in "ba": print(f"{c1}{c2}")
В данном случае внешний цикл проходит по строке «ab» и каждый символ помещает в переменную c1. Внутренний цикл проходит по строке «ba», помещает каждый
символ строки в переменную c2 и выводит сочетание обоих символов на консоль. То есть в итоге мы получим все возможные сочетания символов a и b:
Выход из цикла. break и continue
Для управления циклом мы можем использовать специальные операторы break и continue.
Оператор break осуществляет выход из цикла. А оператор continue выполняет переход к следующей итерации цикла.
Оператор break может использоваться, если в цикле образуются условия, которые несовместимы с его дальнейшим выполнением. Рассмотрим следующий пример:
number = 0 while number < 5: number += 1 if number == 3 : # если number = 3, выходим из цикла break print(f"number = {number}")
Здесь цикл while проверяет условие number < 5
. И пока number не равно 5, предполагается, что значение number будет
выводиться на консоль. Однако внутри цикла также проверяется другое условие: if number == 3
. То есть, если значение number равно 3, то с помощью
оператора break выходим из цикла. И в итоге мы получим следующий консольный вывод:
В отличие от оператора break
оператор continue выполняет переход к следующей
итерации цикла без его завершения. Например, в предыдущем примере заменим break на continue:
number = 0 while number < 5: number += 1 if number == 3 : # если number = 3, переходим к новой итерации цикла continue print(f"number = {number}")
И в этом случае если значение переменной number равно 3, последующие инструкции после оператора continue не будут выполняться:
number = 1 number = 2 number = 4 number = 5
Циклы в Python (и в других языках программирования) используются для автоматизации повторяющихся задач. Они позволяют выполнять одни и те же действия многократно в течение программы, пока не будет выполнено определенное условие.
Например, если вы хотите вывести на экран числа от 1 до 10, вместо того чтобы написать десять отдельных строк с командой print(), можно использовать цикл for. Вот как это можно сделать:
for i in range(1, 11):
print(i)
Этот код создает цикл for, который перебирает числа от 1 до 10 (включительно) и выводит каждое число на экран. Это намного эффективнее, чем написание десяти отдельных команд print(), и может сократить объем кода.
Еще один пример использования циклов — это обработка данных в списке или другой последовательности. Например, если у вас есть список имен людей и вы хотите вывести каждое имя с приветствием, можно использовать цикл for для перебора списка и вывода каждого имени. Вот как это может выглядеть:
names = ['Андрей', 'Мария', 'Иван', 'Ольга']
for name in names:
print('Привет, ' + name + '!')
Этот код создает цикл for, который перебирает список имен и выводит каждое имя с приветствием на экран. Это может быть полезно, если вы хотите написать программу, которая приветствует пользователей по именам, хранящимся в списке.
Таким образом, циклы в Python (и в других языках программирования) помогают упростить и автоматизировать задачи, которые требуют повторения одних и тех же действий многократно.
Содержание
- Итерация, итерируемый объект
- Основные типы циклов в Python
- Цикл for в Python
- Синтаксис цикла for
- Функция range()
- Функция range() с одним аргументом
- range() с двумя аргументами
- range() с тремя аргументами
- range() с отрицательными аргументами
- Перебор последовательностей с помощью цикла for
- Функция enumerate()
- Использование параметров sep и end функции print() в цикле for
- Задания для закрепления
- Цикл while
- Синтаксис цикла
- Условие выхода из цикла
- Задание для закрепления
- Инструкции управления циклом
- break
- continue
- Использование else в цикле
- pass
- return и циклы
- Задания для закрепления
- Вложенные циклы
- Особенности использования break и continue в случае вложенных циклов
- Задания для закрепления
- Множественное присваивание в Python
- Видеоурок по циклам
- Задания для закрепления работы с циклами
Итерация, итерируемый объект
Итерация — это один шаг или повторение цикла.
Например, если у вас есть список с пятью элементами, то для перебора всех элементов нужно выполнить пять итераций.
Итерируемый объект — это что-то, по чему можно проходиться итерациями.
Например, строка — это итерируемый объект, потому что мы можем выполнить итерацию для каждого символа в строке.
В Python есть два основных типа циклов: цикл for и цикл while.
Цикл for используется для перебора элементов в последовательности (например, в списке или строке) и выполнения одних и тех же действий для каждого элемента. Синтаксис цикла for выглядит так:
for variable in sequence:
statement(s)
Где variable
— это переменная, которая будет использоваться для хранения текущего элемента последовательности, sequence
— это последовательность элементов, которые нужно перебрать, а statement(s)
— это команды, которые будут выполняться для каждого элемента последовательности.
Цикл while используется для повторения действий до тех пор, пока выполняется определенное условие. Синтаксис цикла while выглядит так:
while condition:
statement(s)
Где condition
— это условие, которое должно быть выполнено для продолжения выполнения цикла, а statement(s)
— это команды, которые будут выполняться до тех пор, пока условие не перестанет выполняться.
В Python также есть несколько инструкций управления циклами, таких как break
, continue
, и else
, которые можно использовать для изменения поведения цикла в зависимости от определенных условий. Кроме того, в Python можно создавать вложенные циклы, когда один цикл находится внутри другого, что позволяет более эффективно обрабатывать данные и решать различные задачи.
Цикл for в Python
Синтаксис цикла for
Синтаксис цикла for в Python выглядит следующим образом:
for variable in sequence:
statement(s)
Где:
variable
— это переменная, которая будет использоваться для хранения текущего элемента последовательности;sequence
— это последовательность элементов, которые нужно перебрать;statement(s)
— это команды, которые будут выполняться для каждого элемента последовательности.
Цикл for используется для перебора элементов в последовательности, например, в списке или строке. Для каждого элемента в последовательности переменная variable
будет хранить значение этого элемента, и затем будут выполнены команды statement(s)
.
Пример использования цикла for для перебора элементов в списке:
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
В этом примере мы создаем список fruits
, содержащий три элемента. Затем мы используем цикл for для перебора всех элементов списка fruits
. Переменная fruit
будет хранить значение каждого элемента, начиная с первого элемента списка. Затем мы выводим каждый элемент списка на экран с помощью функции print()
. В результате выполнения этого кода на экране будет выведено:
apple
banana
cherry
При необходимости можно использовать дополнительные команды внутри цикла for, например, для обработки каждого элемента или для изменения значений переменных в зависимости от значения текущего элемента.
Функция range()
Функция range()
используется для генерации числовых последовательностей, которые можно использовать в цикле for
для выполнения определенных действий заданное количество раз.
Синтаксис функции range()
выглядит следующим образом:
range(start, stop, step)
Где:
start
— необязательный аргумент, который указывает начальное значение последовательности. По умолчанию он равен 0.stop
— обязательный аргумент, который указывает конечное значение последовательности. Оно не включается в последовательность.step
— необязательный аргумент, который указывает шаг, с которым генерируются числа в последовательности. По умолчанию он равен 1.
Пример использования функции range()
для генерации числовых последовательностей в цикле for
:
for i in range(5):
print(i)
В этом примере мы используем функцию range()
для генерации последовательности чисел от 0 до 4. Цикл for
используется для перебора каждого элемента в этой последовательности. На каждой итерации значение i
будет увеличиваться на 1, и мы будем выводить это значение на экран с помощью функции print()
. В результате выполнения этого кода на экране будет выведено:
0
1
2
3
4
Мы также можем использовать функцию range()
для генерации последовательности чисел с другим начальным значением и шагом:
for i in range(1, 10, 2):
print(i)
В этом примере мы используем функцию range()
для генерации последовательности чисел от 1 до 9 с шагом 2. Цикл for
используется для перебора каждого элемента в этой последовательности, и на каждой итерации мы будем выводить это значение на экран с помощью функции print()
. В результате выполнения этого кода на экране будет выведено:
1
3
5
7
9
Функция range()
также позволяет генерировать последовательности чисел в обратном порядке с помощью отрицательного шага. Например:
for i in range(10, 0, -1):
print(i)
В этом примере мы используем функцию range()
для генерации последовательности чисел от 10 до 1 с шагом -1. Цикл for
используется для перебора каждого элемента в этой последовательности, и на каждой итерации мы будем выводить это значение на экран с помощью функции print()
. В результате выполнения этого кода на экране будет следующее:
10
9
8
7
6
5
4
3
2
1
Функция range() с одним аргументом
Функция range()
с одним аргументом используется для генерации последовательности чисел от 0 до заданного значения. Формат вызова функции выглядит следующим образом:
range(stop)
Где:
stop
— обязательный параметр, определяющий значение верхней границы последовательности (не включается в неё).
Пример использования функции range()
с одним аргументом в цикле for
:
for i in range(5):
print(i)
В этом примере функция range()
генерирует последовательность чисел от 0 до 4, которая используется в цикле for
для перебора элементов. На каждой итерации значение i
будет увеличиваться на 1, и мы будем выводить его на экран с помощью функции print()
. В результате выполнения этого кода на экране будет выведено:
0
1
2
3
4
Можно заметить, что последовательность не содержит значение 5, так как оно не включается в неё. Если нам нужно включить значение 5, мы можем изменить вызов функции следующим образом:
for i in range(6):
print(i)
Таким образом, функция range()
с одним аргументом очень удобна, когда мы хотим сгенерировать последовательность целых чисел от 0 до некоторого заданного значения и использовать её в цикле for
.
range() с двумя аргументами
Функция range()
с двумя аргументами используется для генерации последовательности чисел с определенным шагом. Формат вызова функции выглядит следующим образом:
range(start, stop)
Где:
start
— опциональный параметр, определяющий значение первого элемента последовательности. По умолчанию равен 0.stop
— обязательный параметр, определяющий значение верхней границы последовательности (не включается в неё).
Пример использования функции range()
с двумя аргументами в цикле for
:
for i in range(2, 10):
print(i)
В этом примере функция range()
генерирует последовательность чисел от 2 до 9, которая используется в цикле for
для перебора элементов. На каждой итерации значение i
будет увеличиваться на 1, и мы будем выводить его на экран с помощью функции print()
. В результате выполнения этого кода на экране будет выведено:
2
3
4
5
6
7
8
9
range() с тремя аргументами
Функция range()
с тремя аргументами используется для создания последовательности чисел с определенным шагом (инкрементом). Три аргумента функции range()
задают начальное значение, конечное значение и шаг.
Синтаксис:
range(start, stop, step)
start
— начальное значение (включительно). По умолчанию равно 0.stop
— конечное значение (исключительно). Обязательный аргумент.step
— шаг. По умолчанию равен 1.
Примеры использования:
# Печать чисел от 1 до 10 с шагом 2
for i in range(1, 11, 2):
print(i, end=' ')
# Печать чисел от 10 до 1 с шагом -1
for i in range(10, 0, -1):
print(i, end=' ')
В первом примере цикл for проходит по значениям от 1 до 10 (включительно) с шагом 2 и печатает каждое значение. Результат выполнения кода:
1 3 5 7 9
Во втором примере цикл for проходит по значениям от 10 до 1 (не включительно) с шагом -1 и печатает каждое значение. Результат выполнения кода:
10 9 8 7 6 5 4 3 2 1
range() с отрицательными аргументами
Функция range()
также может использоваться с отрицательными аргументами, в том числе и со вторым аргументом, указывающим на конец последовательности. В таком случае начальное значение должно быть больше конечного, а шаг должен быть отрицательным числом.
Например, если мы хотим напечатать числа от 10 до 1 в порядке убывания, мы можем использовать отрицательный шаг:
for i in range(10, 0, -1):
print(i, end=' ')
Результат выполнения кода:
10 9 8 7 6 5 4 3 2 1
Аналогично, мы можем напечатать числа от 5 до -5 в порядке убывания с шагом -1:
for i in range(5, -6, -1):
print(i, end=' ')
Результат выполнения кода:
5 4 3 2 1 0 -1 -2 -3 -4 -5
Заметим, что в данном случае конечное значение равно -6, а не -5, поскольку последовательность не включает в себя значение -5.
Перебор последовательностей с помощью цикла for
В Python можно перебирать элементы различных последовательностей, таких как строки, списки, кортежи, с помощью цикла for
.
Синтаксис цикла for
для перебора элементов последовательности очень прост. Мы указываем переменную, которая будет хранить значения элементов последовательности, затем указываем саму последовательность, которую мы хотим перебрать. Далее в теле цикла мы можем выполнять действия с каждым элементом последовательности.
Рассмотрим пример. Предположим, у нас есть список my_list
с элементами [1, 2, 3, 4, 5]
. Мы можем перебрать этот список следующим образом:
my_list = [1, 2, 3, 4, 5]
for element in my_list:
print(element)
Результат выполнения кода:
1
2
3
4
5
Здесь мы определяем переменную element
, которая будет хранить значения элементов списка my_list
на каждой итерации цикла for
. В теле цикла мы просто печатаем значение этой переменной с помощью функции print()
.
Точно так же мы можем перебрать и символы в строке. Например, у нас есть строка "hello world"
. Мы можем перебрать ее символы следующим образом:
my_string = "hello world"
for char in my_string:
print(char)
Результат выполнения кода:
h
e
l
l
o
w
o
r
l
d
Здесь мы также определяем переменную char
, которая будет хранить значения символов строки my_string
на каждой итерации цикла for
. В теле цикла мы печатаем значение этой переменной с помощью функции print()
.
Функция enumerate()
Мы также можем использовать функцию enumerate()
для получения индексов элементов при переборе последовательности. Например:
my_list = [1, 2, 3, 4, 5]
for index, element in enumerate(my_list):
print(f"Index: {index}, Element: {element}")
Index: 0, Element: 1
Index: 1, Element: 2
Index: 2, Element: 3
Index: 3, Element: 4
Index: 4, Element: 5
Здесь мы использовали функцию enumerate()
, которая возвращает пару значений — индекс элемента и сам элемент на каждой итерации цикла for
. Мы определяем две переменные — index
и element
, которые будут хранить соответствующие значения, и затем печатаем их.
Использование параметров sep и end функции print() в цикле for
Функция print()
в Python имеет два параметра, которые могут быть использованы в цикле for
: sep
и end
.
Параметр sep
задает разделитель между значениями, которые нужно вывести на экран. По умолчанию, разделителем является пробел. Однако, вы можете изменить разделитель на любой другой символ. Например, если вы хотите, чтобы значения выводились через запятую, то нужно передать параметру sep
значение ,
.
Параметр end
задает символ, который должен быть выведен в конце строки. По умолчанию, этот символ является символом новой строки n
. Если вы хотите изменить этот символ на другой, то нужно передать значение параметру end
.
Пример использования параметров sep
и end
в цикле for
:
numbers = [1, 2, 3, 4, 5]
for num in numbers:
print(num, end=', ', sep='')
# Вывод: 1, 2, 3, 4, 5,
В этом примере мы выводим все значения из списка numbers
через запятую, и добавляем запятую в конце строки. Обратите внимание, что мы передали пустую строку в качестве разделителя, чтобы убрать пробелы между значениями.
Таким образом, использование параметров sep
и end
в цикле for
может значительно упростить форматирование вывода на экран.
Задания для закрепления
Задание 1. Вывести на экран все четные числа от 0 до 20
Решение
for i in range(0, 21, 2):
print(i)
Здесь мы используем range()
с тремя аргументами, чтобы генерировать последовательность четных чисел от 0 до 20 с шагом 2. Затем мы просто выводим каждое число на экран.
Задание 2. Посчитать сумму первых 10 натуральных чисел
Решение
sum = 0
for i in range(1, 11):
sum += i
print(sum)
Здесь мы используем range()
с двумя аргументами, чтобы генерировать последовательность чисел от 1 до 10. Затем мы движемся по этой последовательности, на каждой итерации (шаге) добавляя текущее число к переменной sum
. В конце мы выводим сумму на экран.
Задание 3. Вывести на экран таблицу умножения от 1 до 10
Решение
for i in range(1, 11):
for j in range(1, 11):
print(i * j, end='t')
print()
Здесь мы используем вложенные циклы for
, чтобы итерироваться по числам от 1 до 10. Внешний цикл движется по первым множителям, а внутренний цикл движется по вторым множителям. На каждой итерации мы выводим произведение множителей на экран, разделяя их табуляцией. В конце каждой строки мы выводим символ перевода строки, чтобы перейти на следующую строку таблицы.
Задание 4. Вывести на экран последовательность чисел в обратном порядке
Решение
for i in range(10, 0, -1):
print(i)
Здесь мы используем range()
с тремя аргументами и отрицательным шагом, чтобы генерировать последовательность чисел от 10 до 1 в обратном порядке. Затем мы просто выводим каждое число на экран.
Задание 5. Напишите программу, которая перебирает строку, находит все цифры в ней и выводит их
Решение
text = "abc123xyz789"
for char in text:
if char.isdigit():
print(char)
Цикл while
Цикл while в Python позволяет выполнять набор инструкций до тех пор, пока выполняется заданное условие. Он отличается от цикла for тем, что не требует указания последовательности элементов, по которой нужно пройтись, а лишь проверяет условие и выполняет инструкции в теле цикла до тех пор, пока условие верно.
Обычно цикл while используется в тех случаях, когда невозможно знать заранее, сколько раз нужно выполнить цикл, либо когда количество итераций не определено. Например, это может быть полезно при чтении ввода пользователя, когда непонятно, сколько раз нужно будет прочитать ввод.
Цикл for, в свою очередь, используется для перебора элементов в последовательности, таких как строки, списки, кортежи и другие итерируемые объекты. Кроме того, for обычно применяется, когда нужно произвести определенное количество итераций.
Поэтому, если заранее известен список или последовательность элементов, то обычно цикл for будет предпочтительнее, т.к. он обеспечивает простоту итерации по элементам, а цикл while — более универсален и позволяет выполнять циклические действия до тех пор, пока условие выполняется.
Например, цикл while может быть использован для выполнения некоторого действия до тех пор, пока пользователь не введет определенную команду, а цикл for — для перебора элементов списка или строки.
Синтаксис цикла
Цикл while в Python позволяет выполнять повторяющиеся блоки кода до тех пор, пока выполняется определенное условие. Синтаксис цикла while выглядит следующим образом:
while условие:
блок кода
В начале каждой итерации цикла, проверяется условие, и если оно истинно, то выполняется блок кода, который находится в теле цикла. Затем снова проверяется условие, и если оно по-прежнему истинно, то цикл продолжается. Цикл будет продолжаться до тех пор, пока условие не станет ложным. Если условие ложно с самого начала, то блок кода в теле цикла не выполнится ни разу.
Один из примеров использования цикла while — это чтение ввода пользователя с клавиатуры. Например, мы можем написать цикл, который запрашивает у пользователя числа, пока он не введет число 0:
sum = 0
num = 1
while num != 0:
num = int(input("Введите число (введите 0 для выхода): "))
sum += num
print("Сумма введенных чисел равна", sum)
В этом примере мы создаем переменную sum
и переменную num
, которая будет использоваться для чтения ввода пользователя. Затем мы начинаем цикл while, который будет выполняться, пока значение переменной num
не станет равным 0. Внутри цикла мы запрашиваем у пользователя ввод числа, преобразуем его в целое число с помощью функции int()
, добавляем его к переменной sum
, и затем проверяем условие, чтобы определить, продолжать ли цикл. Если пользователь введет число 0, то условие num != 0
станет ложным, и цикл завершится. Мы выводим сумму введенных чисел на экран с помощью функции print()
.
Условие выхода из цикла
Условие выхода из цикла while определяется в теле цикла и используется для проверки того, должен ли цикл продолжаться или завершиться. Как только условие становится ложным, цикл прекращается и управление передается к следующей инструкции после цикла.
Синтаксис условия выхода из цикла while выглядит так:
while условие:
# блок инструкций
Условие — это логическое выражение, которое проверяется перед каждой итерацией цикла. Если выражение истинно, то блок инструкций выполняется, а затем условие проверяется снова. Если выражение ложно, то цикл прекращается и управление передается к следующей инструкции после цикла.
Например, давайте рассмотрим пример использования цикла while для подсчета суммы чисел от 1 до 10:
i = 1
summa = 0
while i <= 10:
summa += i
i += 1
print(summa)
В этом примере мы инициализируем переменную i
со значением 1 и переменную summa
со значением 0. Затем мы используем цикл while для перебора значений от 1 до 10, пока i
меньше или равно 10. Внутри цикла мы добавляем значение i
к переменной summa
и увеличиваем i
на 1. После того, как i
достигнет значения 11, условие станет ложным, цикл завершится, и сумма чисел от 1 до 10 будет выведена на экран.
Обычно цикл while используется в тех случаях, когда неизвестно, сколько раз нужно выполнить блок инструкций, и условие выхода из цикла зависит от каких-то внешних факторов. Например, ввод данных с клавиатуры, проверка наличия элементов в списке, обработка событий и т.д.
Однако, если заранее известно количество итераций, то в этом случае лучше использовать цикл for.
Задание для закрепления
Задание 6. Написать программу, которая будет запрашивать у пользователя пароли до тех пор, пока он не введет правильный пароль. Правильный пароль задан заранее и равен «qwerty». После ввода правильного пароля программа должна вывести сообщение «Добро пожаловать!».
Решение
# Запрашиваем у пользователя пароли, пока он не введет правильный пароль
password = ""
while password != "qwerty":
password = input("Введите пароль: ")
# Выводим на экран сообщение об успешной авторизации
print("Добро пожаловать!")
Инструкции управления циклом
break
Инструкция break
в Python используется для принудительного выхода из цикла. Как только интерпретатор Python достигает инструкции break
, выполнение цикла прекращается, и управление передается на следующую инструкцию после цикла.
Синтаксис использования break
простой. Вы можете поместить эту инструкцию внутри цикла, и если какое-либо условие выполняется, то цикл немедленно завершается:
while условие:
if some_condition:
break
# остальной код
или
for элемент in последовательность:
if some_condition:
break
# остальной код
Здесь some_condition
— это условие, которое, если оно становится истинным, приводит к прерыванию цикла.
Вот пример использования break
в цикле while
, который выходит из цикла, если пользователь вводит слово "stop"
:
while True:
user_input = input("Введите что-нибудь: ")
if user_input == "stop":
break
print("Вы ввели:", user_input)
print("Цикл завершен.")
Как только пользователь вводит слово «stop», программа выходит из цикла и продолжает выполнение кода после цикла.
Инструкция break
также может использоваться в циклах for
. В следующем примере цикл for
перебирает элементы списка и завершается, как только находит первый элемент, который делится нацело на 5:
numbers = [1, 3, 5, 7, 10, 12]
for num in numbers:
if num % 5 == 0:
print("Первый элемент, который делится нацело на 5, это", num)
break
Здесь, как только мы находим элемент, который делится нацело на 5, мы выводим его на экран и прерываем цикл.
break
следует использовать с осторожностью, потому что он может привести к преждевременному прерыванию цикла и нежелательным побочным эффектам. В некоторых случаях лучше использовать инструкцию continue
, чтобы перейти к следующей итерации цикла, вместо того, чтобы немедленно выйти из него.
continue
Инструкция continue
используется в цикле для пропуска текущей итерации и перехода к следующей. Она может быть полезна, когда нужно пропустить некоторые элементы в последовательности или выполнить определенные условия в цикле.
Синтаксис continue
прост: когда интерпретатор Python встречает эту инструкцию внутри цикла, он переходит к следующей итерации, игнорируя все операторы, которые находятся ниже.
Пример использования continue
:
for i in range(1, 6):
if i == 3:
continue
print(i)
В этом примере цикл for
перебирает числа от 1 до 5. Если число равно 3, то оператор continue
переводит выполнение программы к следующей итерации, пропуская вывод числа 3. Таким образом, вывод программы будет:
1
2
4
5
В этом примере мы использовали continue
, чтобы пропустить вывод числа 3 и перейти к выводу 4. Если бы мы не использовали continue
, то число 3 также было бы выведено в консоль на экран.
Использование else в цикле
Инструкция else
в теле цикла — это опциональный (не обязательный) блок кода, который выполняется после того, как цикл завершается. Она выполняется только в том случае, если цикл завершился естественным путем, то есть без использования инструкций break
. Синтаксис выглядит следующим образом:
while <условие>:
<блок кода>
else:
<блок кода>
или
for <переменная> in <итерируемый объект>:
<блок кода>
else:
<блок кода>
Здесь блок кода после else
будет выполнен, когда завершится цикл. Если же цикл был прерван инструкцией break
, блок кода после else
не будет выполнен.
Пример:
numbers = [1, 2, 3, 4, 5]
for num in numbers:
if num == 3:
print("Число 3 найдено.")
break
else:
print("Число 3 не найдено.")
В этом примере мы создали список чисел и проходимся по нему с помощью цикла for. Если в списке встретится число 3, то будет выполнен блок кода внутри if, который выведет на экран «Число 3 найдено.» Затем выполнится инструкция break, которая прервет цикл.
Если же в списке не будет числа 3, то инструкция break не выполнится и цикл завершится нормально. Тогда выполнится блок кода внутри инструкции else, который выведет на экран «Число 3 не найдено.»
pass
Инструкция pass
в Python — это оператор-заглушка, который не делает ничего. Он используется, когда синтаксически требуется оператор, но никакой действительной работы не нужно выполнять.
Например, если вы пишете функцию или цикл, но еще не определили тело, вы можете использовать pass
в качестве временной заглушки, чтобы избежать ошибок синтаксиса:
def my_function():
pass
for i in range(10):
pass
return и циклы
Инструкция return
используется для возврата значения из функции. В циклах return
используется для выхода из цикла и возврата значения из функции. Когда оператор return
выполняется внутри цикла, цикл останавливается и управление передается обратно в вызывающую функцию.
Например, если вы хотите выйти из цикла, когда определенное условие выполняется, вы можете использовать return
:
def find_number(numbers, target):
for num in numbers:
if num == target:
return True
return False
В этой функции find_number
мы проходимся по каждому элементу списка numbers
и проверяем, равен ли он целевому числу target
. Если мы находим его, мы возвращаем значение True
. Если мы проходимся по всем элементам списка и не находим целевое число, мы возвращаем False
.
Таким образом, return
используется для преждевременного выхода из цикла, если необходимо вернуть результат, и выхода из функции в целом.
Задания для закрепления
Задание 7. Написать программу, которая будет запрашивать у пользователя целые числа до тех пор, пока он не введет отрицательное число. После этого программа должна вывести на экран сумму всех введенных положительных чисел.
Решение
# Запрашиваем у пользователя числа, пока он не введет отрицательное число
sum = 0
while True:
num = int(input("Введите целое число: "))
if num < 0:
break
sum += num
# Выводим на экран сумму положительных чисел
print("Сумма положительных чисел: ", sum)
Задание 8. Написать программу, которая будет запрашивать у пользователя строку до тех пор, пока он не введет пустую строку. После этого программа должна вывести на экран количество символов в самой длинной из введенных строк.
Решение
# Запрашиваем у пользователя строки, пока он не введет пустую строку
max_length = 0
while True:
string = input("Введите строку: ")
if string == "":
break
length = len(string)
if length > max_length:
max_length = length
# Выводим на экран длину самой длинной строки
print("Самая длинная строка имеет длину ", max_length, " символов.")
Вложенные циклы
Вложенные циклы — это циклы, которые находятся внутри других циклов. Такие циклы используются, когда необходимо повторять некоторые операции для каждого элемента вложенной структуры данных.
Синтаксис вложенных циклов аналогичен синтаксису обычных циклов. Внутренний цикл выполнится для каждой итерации внешнего цикла.
Вложенные циклы также могут быть использованы для решения задач, связанных с перебором всех возможных комбинаций значений. Например, для перебора всех пар чисел от 1 до 5 можно использовать следующий код:
for i in range(1, 6):
for j in range(1, 6):
print(i, j)
В этом примере внешний цикл перебирает значения i
от 1 до 5, а внутренний цикл перебирает значения j
от 1 до 5 для каждого значения i
. В результате мы получим все возможные комбинации чисел от 1 до 5.
Особенности использования break и continue в случае вложенных циклов
В случае с вложенными циклами инструкции break
и continue
имеют особенности использования.
Когда break
используется внутри вложенного цикла, он прерывает выполнение только этого цикла и переходит к следующей строке кода после этого цикла. Если вложенных циклов несколько, то break
прерывает только самый внутренний цикл.
Рассмотрим пример, где используется вложенный цикл для поиска простых чисел от 2 до 10. Для этого мы будем проверять, делится ли каждое число от 2 до 10 на все числа от 2 до этого числа. Если делитель находится, значит число не простое, и мы переходим к следующему числу. Если же делителя не нашлось, то число простое и мы выводим его на экран.
for i in range(2, 10):
for j in range(2, i):
if i % j == 0:
break
else:
print(i, " - простое число")
В этом примере, если мы находим делитель, то инструкция break
прерывает вложенный цикл for j
. Если делителя нет, то выполняется инструкция else
, которая выводит на экран простое число.
Если мы хотим прервать внешний цикл, используем break
повторно. В следующем примере используется вложенный цикл для поиска палиндромных чисел. Мы прерываем внешний цикл, когда находим первое палиндромное число.
for i in range(10, 100):
for j in range(10, 100):
num = i * j
str_num = str(num)
if str_num == str_num[::-1]:
print(num, " - палиндромное число")
break
else:
continue
break
В этом примере, если мы находим палиндромное число, инструкция break
прерывает внешний цикл, и программа завершается. Если мы проходим все числа без нахождения палиндромного числа, то инструкция continue
переходит к следующей итерации внешнего цикла, а break
с меткой outer
прерывает внешний цикл после последней итерации.
Задания для закрепления
Задание 9. Напишите программу, которая выводит на экран следующую последовательность чисел:
1
12
123
1234
12345
Решение
Решение
for i in range(1, 6):
for j in range(1, i+1):
print(j, end='')
print()
Задание 10. Напишите программу, которая выводит на экран следующую последовательность чисел:
1
22
333
4444
55555
Решение
Решение
for i in range(1, 6):
for j in range(i):
print(i, end='')
print()
Задание 11. Напишите программу, которая выводит на экран следующую последовательность чисел:
1
23
456
78910
Решение
Решение
count = 1
for i in range(1, 5):
for j in range(i):
print(count, end='')
count += 1
print()
Задание 12. Напишите программу, которая выводит на экран следующую последовательность символов:
*
**
***
****
*****
****
***
**
*
Решение
Решение
for i in range(1, 6):
for j in range(i):
print('*', end='')
print()
for i in range(4, 0, -1):
for j in range(i):
print('*', end='')
print()
Множественное присваивание в Python
Множественное присваивание — это возможность присваивать нескольким переменным значения одновременно. В Python это можно сделать следующим образом:
a, b = 1, 2
В данном примере происходит множественное присваивание переменным a
и b
значений 1 и 2 соответственно. Это эквивалентно выполнению двух отдельных присваиваний:
a = 1
b = 2
С помощью множественного присваивания можно легко поменять значения двух переменных местами, не используя третью переменную:
a, b = b, a
В этом случае значения переменных a
и b
поменяются местами.
Также множественное присваивание может использоваться в циклах, например, для перебора последовательностей:
my_list = [1, 2, 3, 4, 5]
for i, value in enumerate(my_list):
print(i, value)
В данном примере enumerate()
возвращает пару (i, value)
для каждого элемента списка my_list
, которые затем распаковываются в переменные i
и value
с помощью множественного присваивания.
Видеоурок по циклам
Задания для закрепления работы с циклами
Задание 13. Дано два числа: a и b, a<b. Напечатать в столбик и строчку все числа от a до b включительно, а также квадраты этих чисел.
Решение
Для решения этой задачи можно использовать цикл for для перебора чисел от a до b и вывода каждого числа и его квадрата. Можно также использовать функцию range для генерации последовательности чисел.
Вот код решения задачи:
a = 1
b = 10
# Вывод чисел в столбик
for i in range(a, b+1):
print(i, i**2)
# Вывод чисел в строку
for i in range(a, b+1):
print(i, i**2, end=" ")
Задание 14. Дано два целых числа: a1 и a2. Если a1<a2, то напечатайте числа от a1 до a2 в порядке возрастания. В противном случае, напечатайте числа от a1 до a2 в порядке убывания.
Решение
В данной задаче нужно определить порядок, в котором нужно выводить числа в зависимости от того, какое из чисел больше. Для этого можно использовать условный оператор if.
Затем, в зависимости от порядка, нужно выбрать соответствующий цикл: цикл for для порядка возрастания и цикл while для порядка убывания.
Вот код, который решает данную задачу:
a1 = int(input("Введите первое число: "))
a2 = int(input("Введите второе число: "))
if a1 < a2:
for i in range(a1, a2+1):
print(i)
else:
while a1 >= a2:
print(a1)
a1 -= 1
Сначала пользователь вводит два числа. Затем мы проверяем, какое число больше, и выбираем соответствующий цикл. Если a1 < a2, то мы используем цикл for, который выводит числа в порядке возрастания, начиная с a1 и заканчивая a2. Если a1 >= a2, то мы используем цикл while, который выводит числа в порядке убывания, начиная с a1 и уменьшая его на 1 на каждой итерации, пока a1 не станет меньше a2.
Задание 15. Напишите программу, которая выводит на экран следующую последовательность символов:
Решение
В данной задаче нужно определить порядок, в котором нужно выводить числа в зависимости от того, какое из чисел больше. Для этого можно использовать условный оператор if.
Затем, в зависимости от порядка, нужно выбрать соответствующий цикл: цикл for для порядка возрастания и цикл while для порядка убывания.
Вот код, который решает данную задачу:
a1 = int(input("Введите первое число: "))
a2 = int(input("Введите второе число: "))
if a1 < a2:
for i in range(a1, a2+1):
print(i)
else:
while a1 >= a2:
print(a1)
a1 -= 1
Задание 16. Дано 20 чисел. Посчитайте их среднее арифметическое. Числа вводятся пользователем с клавиатуры
Решение
Для решения этой задачи мы можем использовать цикл while
и переменные, чтобы хранить сумму чисел и количество чисел. Вот код решения:
# инициализируем счетчики и сумму
count = 0
sum = 0
# вводим числа до тех пор, пока не наберем 20
while count < 20:
num = int(input("Введите число: "))
sum += num
count += 1
# вычисляем среднее арифметическое
avg = sum / 20
# выводим результат
print("Среднее арифметическое:", avg)
В этом коде мы используем переменную count
, чтобы отслеживать количество введенных чисел, и переменную sum
, чтобы хранить сумму этих чисел. Затем мы вычисляем среднее арифметическое, деля сумму на количество чисел. И, наконец, мы выводим результат с помощью функции print()
.
Задание 17. Дано число k. Вычислите сумму квадратов нечетных чисел от 1 до k.
Решение
Для решения этой задачи можно использовать цикл for. Необходимо пройти циклом по всем нечетным числам от 1 до k и прибавлять к сумме квадрат текущего числа.
Вот код решения:
k = int(input("Введите число: "))
sum_of_squares = 0
for i in range(1, k+1, 2):
sum_of_squares += i**2
print("Сумма квадратов нечетных чисел от 1 до", k, ":", sum_of_squares)
Сначала мы считываем число k с помощью функции input()
. Затем инициализируем переменную sum_of_squares
нулем, в которую будем добавлять квадраты нечетных чисел.
Далее, с помощью цикла for
мы проходим по всем нечетным числам от 1 до k с шагом 2 (используя третий аргумент функции range()
). Если текущее число нечетное, то мы добавляем его квадрат к переменной sum_of_squares
.
Наконец, мы выводим результат с помощью функции print()
.
Задание 18. Дано число n. Мы вводим это число, а затем ровно n натуральных чисел. Посчитать, сколько среди этих чисел кратных трем
Задание 19. Напишите программу, которая выводит на экран следующую последовательность символов:
Решение
Для решения данной задачи мы можем использовать цикл for и оператор условия if. Необходимо сначала ввести число n, затем в цикле for запрашивать у пользователя n чисел. При каждом вводе числа мы проверяем, делится ли оно на 3 без остатка, и если да, увеличиваем на 1 счетчик кратных трём чисел. В конце программы выводим количество кратных трём чисел.
Пример решения:
n = int(input("Введите количество чисел: "))
count = 0
for i in range(n):
num = int(input("Введите число: "))
if num % 3 == 0:
count += 1
print("Количество чисел, кратных трем:", count)
Для проверки работы программы можно ввести, например, такую последовательность чисел: 5, 9, 12, 17, 21. В этом случае программа должна вывести количество чисел, кратных трем: 3.
Задание 20. Дано число n. Мы вводим это число, а затем ровно n слов, каждое с новой строки. Посчитать, сколько в этих словах сочетаний букв «ла».
Решение
Для решения данной задачи можно использовать цикл while и метод строки count()
, который возвращает количество вхождений заданной подстроки в строку.
Пример решения:
n = int(input("Введите количество слов: "))
count = 0
i = 1
while i <= n:
word = input(f"Введите слово №{i}: ")
count += word.count("ла")
i += 1
print(f"Количество сочетаний 'ла': {count}")
Сначала мы запрашиваем у пользователя количество слов n
. Затем мы объявляем переменную count
, которая будет хранить общее количество сочетаний «ла» во всех словах. Также мы объявляем переменную i
, которая будет использоваться для перебора слов.
Затем мы запускаем цикл while, который будет повторяться n
раз. На каждой итерации цикла мы запрашиваем у пользователя слово с помощью функции input()
. Затем мы используем метод строки count()
для подсчета количества сочетаний «ла» в текущем слове и добавляем это значение к переменной count
.
После того, как цикл завершен, мы выводим общее количество сочетаний «ла» во всех словах на экран с помощью функции print()
.
Задание 21. Дано число n>100. Напечатайте все числа, чьи кубы не превышают n
Решение
Для решения этой задачи мы можем использовать цикл while, в котором будем проверять, не превысил ли куб текущего числа значение n. Если куб числа не превышает n, то мы будем выводить это число, а затем увеличивать его на 1. Если же куб числа уже превышает n, то мы выходим из цикла.
Вот код, который решает данную задачу:
n = int(input("Введите число n: "))
num = 1
while num ** 3 <= n:
print(num)
num += 1
Мы начинаем со значения num = 1 и проверяем, не превышает ли куб этого числа значение n. Если не превышает, то мы выводим число и увеличиваем его на 1. Если превышает, то мы выходим из цикла. Таким образом, мы будем выводить все числа, чьи кубы не превышают значение n.
Задание 22. Простым числом называется натуральное число, большее единицы, которое имеет ровно два делителя: единицу и само себя. Дано число n. Определите, является ли число простым.
Решение
Для определения, является ли число n простым, необходимо проверить, есть ли у него делители кроме 1 и самого себя. Для этого достаточно перебрать все числа от 2 до n-1 и проверить, делится ли n на каждое из них без остатка. Если найдется делитель, то число не является простым. Если после проверки всех чисел делителей не найдено, то число является простым.
n = int(input("Введите число: "))
if n < 2:
print(n, "не является простым числом")
else:
is_prime = True
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
is_prime = False
break
if is_prime:
print(n, "является простым числом")
else:
print(n, "не является простым числом")
Сначала мы получаем число n
от пользователя и проверяем, меньше ли оно 2. Если n
меньше 2, то это не является простым числом.
Если n
больше или равно 2, мы создаем флаг is_prime
и устанавливаем его значение на True
. Затем мы запускаем цикл for
от 2 до корня из n
+ 1. Для каждого значения i
в этом диапазоне мы проверяем, делится ли n
на i
без остатка. Если это так, то n
не является простым числом, и мы устанавливаем is_prime
в значение False
и выходим из цикла с помощью break
.
Если n
является простым числом, то is_prime
останется равным True
. Мы выводим сообщение, указывающее, является ли n
простым числом или нет.
Перебор чисел можно ограничить числом int(n**0.5) + 1, потому что если число n не имеет делителей меньше или равных квадратному корню из n, то его делители должны быть больше квадратного корня из n.
Например, если мы ищем делители числа 25, то первые два возможных делителя — это 1 и 25, а следующие два — это 5 и 5. Мы можем остановить поиск делителей после того, как мы перебрали все числа от 1 до 5, так как дальнейший поиск будет бессмысленен, так как мы уже рассмотрели все возможные делители.
Таким образом, если мы перебираем числа от 1 до int(n**0.5) + 1, то мы рассматриваем все возможные делители, меньшие или равные квадратному корню из n. Если мы не нашли делитель до этого числа, то n — простое число.
Задание 23. Каждый день Хоббит съедает на 20 грамм больше еды, чем в предыдущий день. В первый день Хоббит съел x грамм еды. Определите, сколько дней Хоббит будет кушать, чтобы съесть не менее y грамм еды. Программа получает на вход действительные числа x и y и должна вывести одно натуральное число.
Решение
Решение задачи с помощью Python:
x = float(input("Введите количество съеденной еды в первый день, грамм: "))
y = float(input("Введите общее количество съеденной еды, грамм: "))
day = 1 # количество дней
total_food = x # общее количество съеденной еды
while total_food < y:
x += 20 # с каждым днем Хоббит съедает на 20 грамм больше еды
total_food += x # добавляем количество еды, съеденной в текущий день к общему количеству еды
day += 1 # увеличиваем количество дней на 1
print("Хоббит будет кушать", day, "дней.")
Пример вывода:
Введите количество съеденной еды в первый день, грамм: <strong>50</strong>
Введите общее количество съеденной еды, грамм: <strong>500</strong>
Хоббит будет кушать <strong>5 дней</strong>.
Задание 24. Дана последовательность неотрицательных чисел. Последовательность вводится пользователем с клавиатуры, пока не будет введено отрицательное число. Посчитать количество нулей в последовательности.
Решение
Вот решение задачи на Python:
count = 0 # переменная для хранения количества нулей
num = 0 # переменная для ввода чисел пользователем
while num >= 0:
num = int(input("Введите неотрицательное число (для окончания введите отрицательное): "))
if num == 0:
count += 1 # увеличиваем счетчик нулей
print("Количество нулей в последовательности:", count)
На каждой итерации цикла мы запрашиваем у пользователя число и проверяем, является ли оно нулем. Если да, то увеличиваем счетчик нулей. Если пользователь ввел отрицательное число, то цикл прерывается и выводится количество нулей в последовательности.
Задание 25. Дана последовательность неотрицательных чисел. Последовательность вводится пользователем с клавиатуры, пока не будет введено отрицательное число. Посчитать среднее арифметическое всех чисел кратных 3.
Решение
Для решения этой задачи нам нужно вводить числа с клавиатуры и проверять каждое число на кратность 3. Если число кратно 3, то мы добавляем его к сумме всех чисел, кратных 3, и увеличиваем счетчик на 1. В конце мы делим сумму на количество чисел, чтобы получить среднее арифметическое.
Вот код на Python, который решает эту задачу:
count = 0
sum = 0
num = int(input("Введите число: "))
while num >= 0:
if num % 3 == 0:
count += 1
sum += num
num = int(input("Введите число: "))
if count == 0:
print("В последовательности нет чисел, кратных 3")
else:
average = sum / count
print("Среднее арифметическое чисел, кратных 3, равно", average)
Здесь мы используем цикл while, чтобы вводить числа, пока не будет введено отрицательное число. Внутри цикла мы проверяем, является ли число кратным 3, и, если да, то добавляем его к сумме и увеличиваем счетчик на 1. После цикла мы проверяем, были ли введены числа, кратные 3, и, если да, то выводим среднее арифметическое. Если в последовательности не было чисел, кратных 3, то выводим сообщение об этом.
Задание 26. Дана последовательность неотрицательных чисел. Последовательность вводится пользователем с клавиатуры, пока не будет введено отрицательное число. Максимальное число в последовательности и его позицию. Если максимальных чисел несколько, вывести позицию последнего из них. Номера позиции начинаются с нуля.:
Решение
Решение
max_num = -1
max_pos = -1
pos = 0
while True:
num = int(input())
if num < 0:
break
if num >= max_num:
max_num = num
max_pos = pos
pos += 1
print(max_num)
print(max_pos)
В этом решении мы создаем переменную max_num
, которая будет содержать максимальное число в последовательности, и переменную max_pos
, которая будет содержать позицию этого числа. Мы начинаем сразу с -1
для обработки случая, когда первое число в последовательности будет 0
. Мы также создаем переменную pos
, которая будет использоваться для отслеживания текущей позиции в последовательности.
Затем мы используем бесконечный цикл while True
, чтобы получить все числа из последовательности, введенные пользователем, пока не будет введено отрицательное число. Для каждого числа мы проверяем, больше ли оно или равно max_num
. Если это так, мы обновляем max_num
и max_pos
соответствующим образом. Затем мы увеличиваем pos
на единицу для следующего числа.
В конце мы печатаем максимальное число и его позицию в последовательности.
Задание 27. Дана последовательность неотрицательных чисел. Последовательность вводится пользователем с клавиатуры, пока не будет введено отрицательное число. Определите третье по величине число в последовательности.
Решение
Одним из способов решения данной задачи без использования составных типов данных является использование трех переменных:
max1
— максимальное число в последовательностиmax2
— второе по величине число в последовательностиmax3
— третье по величине число в последовательности
Алгоритм решения будет следующим:
- Инициализируем переменные
max1
,max2
,max3
значением-1
- Вводим числа последовательности с клавиатуры до тех пор, пока не будет введено отрицательное число
- Если введенное число
num
большеmax1
, то сначала значениеmax2
присваиваем текущему значениюmax1
, затем значениеmax1
присваиваемnum
- Если введенное число между
max1
иmax2
, то значениеmax2
присваиваемnum
- Если введенное число между
max2
иmax3
, то значениеmax3
присваиваемnum
- После окончания ввода последовательности, выводим значение переменной
max3
Пример решения на Python:
max1 = max2 = max3 = -1
while True:
num = int(input("Введите число: "))
if num < 0:
break
if num > max1:
max2 = max1
max1 = num
elif max2 < num <= max1:
max2 = num
elif max3 < num <= max2:
max3 = num
print("Третье по величине число в последовательности:", max3)
Пример работы программы:
Введите число: 5
Введите число: 8
Введите число: 2
Введите число: 10
Введите число: 3
Введите число: 6
Введите число: 7
Введите число: -1
Третье по величине число в последовательности: 7
Пример работы программы:
Введите число: 5
Введите число: 2
Введите число: 5
Введите число: 1
Введите число: 3
Введите число: 5
Введите число: -1
Количество чисел в последовательности равных минимальному значению: 1
Задание 28. Дана последовательность неотрицательных чисел. Последовательность вводится пользователем с клавиатуры, пока не будет введено отрицательное число. Определите количество чисел в последовательности равных минимальному значению.
Решение
- Инициализируем переменные
min_value
иcount_min_value
первым введенным числом. - Считываем числа с клавиатуры до тех пор, пока не будет введено отрицательное число.
- Если считанное число меньше
min_value
, то обновляем значения переменныхmin_value
иcount_min_value
. - Если считанное число равно
min_value
, то увеличиваем значение переменнойcount_min_value
на 1. - По окончании считывания выводим значение переменной
count_min_value
.
Вот код на Python:
min_value = count_min_value = int(input("Введите число: "))
if min_value >= 0:
while True:
number = int(input("Введите число: "))
if number < 0:
break
if number < min_value:
min_value = number
count_min_value = 1
elif number == min_value:
count_min_value += 1
print("Количество чисел в последовательности равных минимальному значению:", count_min_value)
else:
print("Последовательность пуста")
Пример работы программы:
Введите число: 5
Введите число: 2
Введите число: 5
Введите число: 1
Введите число: 3
Введите число: 5
Введите число: -1
Количество чисел в последовательности равных минимальному значению: 1
Задание 29. Напишите программу, которая запрашивает у пользователя число n и выводит на экран первые n чисел Фибоначчи.
Числа Фибоначчи — это последовательность чисел, начинающаяся с 0 и 1, где каждое последующее число равно сумме двух предыдущих. То есть, первые числа Фибоначчи выглядят так: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 и т.д.
Решение
Решение
n = int(input("Введите количество чисел Фибоначчи: "))
a, b = 0, 1
if n <= 0:
print("Введите число больше 0")
elif n == 1:
print(a)
else:
print(a, b, end=" ")
for i in range(2, n):
c = a + b
print(c, end=" ")
a = b
b = c
Пример работы программы:
Введите количество чисел Фибоначчи: 10
0 1 1 2 3 5 8 13 21 34
В этой задаче мы используем цикл for для генерации последовательности чисел Фибоначчи. Мы начинаем с чисел a = 0 и b = 1, и затем в цикле вычисляем следующее число как сумму a и b, сохраняем его в переменную c, выводим на экран и перезаписываем значения a и b, чтобы продолжать генерацию последовательности. Если пользователь введет число меньше или равное 0, программа выведет сообщение об ошибке. Если пользователь введет 1, программа выведет только число 0.
Задание 30. Напечатать минимальное число, большее 400, которое нацело делится на 19.
Решение
Для решения этой задачи можно использовать цикл while, который будет перебирать все числа больше 400 до тех пор, пока не будет найдено число, которое нацело делится на 19.
Начнем с числа 400 и будем увеличивать его на 1 на каждой итерации цикла. Проверим, делится ли текущее число на 19 без остатка с помощью оператора %. Если да, то это и есть искомое число, и мы можем вывести его на экран и завершить цикл с помощью оператора break.
num = 400
while True:
if num % 19 == 0:
print(num)
break
num += 1
Пример работы программы:
418
Цикл for/in
Еще одной важной инструкцией языка Python является цикл for/in, который можно смело назвать универсальным
итератором последовательностей, поскольку он позволяет выполнять обход элементов в любых объектах, поддерживающих возможность совершения итераций. При этом сюда относятся как встроенные объекты, например, строки,
списки или словари, так и объекты, создаваемые с помощью классов (о них чуть позже).
В общем виде для цикла for используется следующий синтаксис:
for <Переменная> in <Итерируемый объект>:
<Тело цикла>
else:
<Дополнительный блок инструкций>
В ходе выполнения цикла for интерпретатор один за другим присваивает переменной заголовка элементы итерируемого объекта и выполняет для них инструкции
тела цикла (см. пример №1). Если цикл нужно прервать, используется ключевое слово break, которое передает управление
инструкции, следующей сразу за циклом. Кроме того, в цикле for разрешается использовать необязательный блок else,
набор инструкций которого выполняется только после удачного завершения цикла (т.е. при отсутствии ошибки или прерывания за счет использования инструкции
break).
# Формируем список.
li = [2, 5, 9, 4]
# Задаем начальную сумму.
sum = 0
# Запускаем цикл по элементам списка.
for elem in li:
# Если сумма чисел меньше 8,
if sum < 8:
# наращиваем ее.
sum += elem
# Выводим для наглядности на экран.
print(sum)
# Иначе
else:
# выводим предупреждение и
print("Превышен лимит суммы эл-тов!")
# прерываем цикл.
break
# Если цикл не был прерван.
else:
# Выводим итоговое сообщение.
print("Сумма эл-тов равна:", sum)
# Выводим сообщение о завершении проверки.
print("Проверка списка завершена!")
2
7
16
Превышен лимит суммы эл-тов!
Проверка списка завершена!
Пример №1. Использование цикла for (часть 1).
В примере с помощью инструкции цикла for список проверяется на превышение лимита суммы его элементов. Для этого используется знакомая нам вложенная
условная инструкция if/else, которая и проверяет сумму на достижение лимита. Если в ходе очередной итерации цикла сумма не достигает указанного предела,
значение счетчика суммы sum увеличивается на значение переменной заголовка цикла elem, т.е.
sum += elem. После этого цикл переходит к следующей итерации и присваивает переменной elem значение следующего элемента
списка. И так до тех пор, пока не будет завершен обход всех элементов списка или не будет достигнут лимит суммы. Если лимит суммы достигнут не будет, сработает набор инструкций блока
else цикла, т.е. итоговая сумма будет выведена на экран. После этого будет выполнена инструкция, следующая за циклом. В случае достижения лимита,
сработает набор инструкций блока else условной инструкции if, т.е. будет выведено предупреждение, а цикл будет
прерван инструкцией break, которая передаст управление инструкции, опять же, следующей за циклом.
Обратите внимание, что в нашем примере были использованы два блока else: один принадлежит условной инструкции if,
а другой – инструкции цикла for/in. Отличить их легко по уровню отступов. Оба блока не являются обязательными в своих конструкциях, но в нашем
случае конструкция for/else, позволяет выводить итоговое сообщение не всегда, а только в случае успешного завершения цикла.
Также стоит помнить, что значение переменной заголовка цикла elem при каждой новой итерации обновляется, поэтому после завершения цикла в ней
будет храниться значение, присвоенное в ходе последней итерации.
Давайте рассмотрим еще несколько наглядных вариаций цикла for/in, чтобы увидеть, как он используется на практике (см. пример
№2).
# Выводим символы строки.
name = 'Григорий'
for s in name: print(s, end=' ')
print('', end='nn')
# Используем функцию range(a, b, step).
for n in range(1, len(name), 2):
# Выводим каждую вторую букву имени.
print(name[n], end=' ')
print('', end='nn')
# Выводим ключи и значения словаря.
d = {'one': 1, 'two': 2}
for key in d: print(key, '->', d[key])
print('', end='n')
# Используем распаковывание кортежей.
d = [(1, 2), (3, 4), (5, 6)]
for x, y in d: print(x + y, end=' ')
print('', end='nn')
# А здесь расширенный синтаксис распаковывания.
d = [(1, 2, 3), (4, 5, 6)]
for x, *y in d: print(x, y, end=' ')
Г р и г о р и й
р г р й
one -> 1
two -> 2
3 7 11
1 [2, 3] 4 [5, 6]
Пример №2. Использование цикла for (часть 2).
Как видим, инструкция цикла for в Python действительно имеет весьма простой синтаксис и с легкостью позволяет
совершать обход элементов в любых итерируемых объектах, в особенности внутри упорядоченных последовательностей вроде строк или списков, в которых обход осуществляется поочередно
в порядке возрастания индексов их элементов.
Цикл while
Инструкция цикла while представляет собой универсальный цикл общего назначения. Он служит для повторного выполнения кода, расположенного в его теле,
до тех пор, пока условие цикла остается истинным, т.е. имеет значение True. В общем случае синтаксис цикла while в
Python можно представить в следующем виде:
while <Условное выражение>:
<Тело цикла>
else:
<Дополнительный блок инструкций>
Работает цикл while следующим образом: каждый раз перед выполнением новой итерации, т.е. перед очередным выполнением блока инструкций в теле
цикла, происходит проверка его условия и, если результат будет иметь значение True, код в теле цикла выполняется; далее интерпретатор возвращается в начало цикла
и снова проверяет его условие, повторяя все процедуры заново до тех пор, пока условие цикла не вернет значение False; в этом случае интерпретатор прерывает
выполнение цикла и, пропустив блок инструкций в его теле, передает управление либо необязательному ключевому слову else, выполняя дополнительный блок
инструкций, либо инструкции, следующей за циклом. При этом следует иметь в виду, что набор инструкций блока else выполняется только тогда, когда выход из
цикла производится не инструкцией break (см. пример №3).
# Формируем список.
li = [2, 5, 9, 4]
# Задаем начальную сумму.
sum = 0
# Устанавливаем счетчик итераций.
k = 0
# Запускаем цикл по элементам списка.
while k < len(li):
# Если сумма чисел меньше 8,
if sum < 8:
# наращиваем ее.
sum += li[k]
# Отслеживаем показания счетчика и суммы.
print(k, ':', sum)
# Счетчик увеличиваем на 1.
k += 1
# Иначе
else:
# выводим предупреждение и
print("Превышен лимит суммы эл-тов!")
# прерываем цикл.
break
# Если цикл не был прерван.
else:
# Выводим итоговое сообщение.
print("Сумма эл-тов равна:", sum)
# Выводим сообщение о завершении проверки.
print("Проверка списка завершена!")
0 : 2
1 : 7
2 : 16
Превышен лимит суммы эл-тов!
Проверка списка завершена!
Пример №3. Использование цикла while (часть 1).
В нашем примере цикл совершил три итерации. На первых двух итерациях сумма элементов списка наращивалась, но не достигла допустимого предела. В результате этого цикл пошел на третий виток,
где сумма элементов все-таки превысила лимит. Это привело к тому, что цикл был прерван инструкцией break, а интерпретатор начал обрабатывать выражение
вызова функции print(), следующее за циклом. Если бы общая сумма всех элементов списка оказалась меньше допустимого лимита, цикл продолжил бы работу до
тех пор, пока переменная счетчика не стала бы равной четырем, а условие цикла не вернуло бы False. Далее интерпретатор пропустил бы блок инструкций тела
цикла и стал бы обрабатывать дополнительный набор инструкций его блока else. Попробуйте уменьшить значение элементов списка и убедитесь в этом.
Стоит заметить, что в языке Python отсутствует цикл do/while, имеющийся в других языках программирования. Однако его
можно имитировать, добавив в конец тела цикла условную инструкцию одновременно с инструкцией break (см. пример №4).
# Устанавливаем счетчик.
k = 1
# Запускаем бесконечный цикл.
while True:
# Выводим номер итерации.
print(k, end=' ')
# Счетчик увеличиваем на 1.
k += 1
# Имитируем условную часть цикла do/while.
if k > 5: break
1 2 3 4 5
Пример №4. Использование цикла while (часть 2).
Как видим, в данной имитации тело цикла при любом значении счетчика будет выполнено как минимум один раз, что является побочным эффектом проверки условия в конце цикла свойственного
реальной конструкции do/while.
Кстати, обратите внимание, что при использовании счетчиков в наших примерах мы инициализировали их вне циклов. Это нужно для того, чтобы при каждой новой итерации их значения не сбрасывались
циклом в первоначальное состояние.
Инструкции break и continue
Инструкции break и continue используются только внутри циклов и выполняют примерно те же функции, что и
в других языках программирования: break прерывает объемлющий цикл и передает управление следующей за циклом инструкции, а continue
прерывает только текущую итерацию и производит переход в начало цикла, т.е. в строку заголовка. При этом обе инструкции могут появляться в любом месте внутри тела цикла, но как правило,
их используют во вложенных в цикл условных инструкциях if, чтобы выполнить необходимое действие в ответ на некоторое условие (см. пример
№5).
# Устанавливаем счетчик.
k = 1
# Запускаем бесконечный цикл.
while True:
# Задаем условие прерывания цикла.
if k > 10:
# Прерываем цикл и идем дальше.
break
# Отсеиваем четные числа.
if k%2 == 0:
# Счетчик обязательно увеличиваем.
k += 1
# Пропускаем дальнейшие инструкции
# и возвращаемся в заголовок цикла.
continue
# Выводим нечетные числа на экран.
print(k, end=' ')
# Счетчик увеличиваем на 1.
k += 1
# Инструкция после цикла.
print('nВывод нечетных чисел окончен!n')
# Допустим, что имеется список чисел от 1 до 20.
li = list(range(1, 21))
# Запускаем цикл по элементам списка.
for k in li:
# Задаем условие прерывания цикла.
if k > 10:
# Прерываем цикл и идем дальше.
break
# Отсеиваем четные числа.
if k%2 == 0:
# Счетчик обязательно увеличиваем.
k += 1
# Пропускаем дальнейшие инструкции
# и возвращаемся в заголовок цикла.
continue
# Выводим нечетные числа на экран.
print(k, end=' ')
# Счетчик увеличиваем на 1.
k += 1
# Инструкция после цикла.
print('nВывод нечетных чисел окончен!')
1 3 5 7 9
Вывод нечетных чисел окончен!
1 3 5 7 9
Вывод нечетных чисел окончен!
Пример №5. Использование инструкций break и continue (часть 1).
Здесь хотелось бы обратить внимание на то, что все виды циклов в Python могут иметь другие вложенные циклы и условные инструкции, позволяя нужным образом
изменять дальнейший ход выполнения программы. Но дело в том, что каждая отдельная инструкция break или continue
относится только к одному ближайшему объемлющему циклу. Поэтому, например, выйти сразу из всех внешних циклов при помощи всего лишь одной инструкции break
расположенной в самом глубоком вложенном цикле не получится, нужно использовать инструкцию во всех циклах текущей иерархии (см. пример №6).
# Задаем стартовое значение счетчика.
y = 1
# Внешний цикл.
for x in range(1, 11):
# Умножение на 1 пропускаем.
if x == 1:
# Переходим в начало цикла for.
continue
# Внутренний цикл.
while True:
# Умножение на 1 пропускаем.
if y == 1:
# Увеличиваем счетчик на единицу.
y += 1
# Переходим в начало цикла while.
continue
# Выводим произведение чисел.
print('{} x {} = {}'.format(x, y, x*y))
# При достижении значения y == 5.
if y == 5:
# Переходим на новую строку.
print()
# Сбрасываем значение счетчика.
y = 2
# А внутренний цикл прерываем (внешний нет).
break
# Увеличиваем счетчик на единицу.
y += 1
# При достижении значения x == 5.
if x == 5:
# Прерываем и внешний цикл.
break
# Выводим сообщение о завершении циклов.
print('Таблица умножения от 2 до 5 распечатана!')
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
Таблица умножения от 2 до 5 распечатана!
Пример №6. Использование инструкций break и continue (часть 2).
В Python отсутствует возможность использования конструкций вида break n или continue n,
где n указывало бы на количество прерываний внешних циклов. Вместо этого необходимо использовать собственные инструкции для каждого из
n циклов по отдельности.
Краткие итоги параграфа
-
Для обхода элементов в любых объектах, поддерживающих возможность совершения итераций, в Python предназначен цикл
for/in. В ходе выполнения этого цикла интерпретатор один за другим присваивает переменной заголовка элементы итерируемого объекта и выполняет для них
инструкции тела цикла. -
Для многократного повторного выполнения кода (не только обхода элементов) служит универсальный цикл общего назначения while, который выполняет блок
инструкций, расположенный в его теле, до тех пор, пока условие цикла остается истинным, т.е. имеет значение True. -
При необходимости в циклах for и while разрешается использовать необязательный блок
else, набор инструкций которого выполняется только после удачного завершения цикла (т.е. при отсутствии ошибки или прерывания за счет использования
инструкции break). - При использовании счетчиков следует инициализировать их вне циклов, чтобы при каждой новой итерации их значения не сбрасывались циклом в первоначальное состояние.
-
Для прерывания циклов в Python используется инструкция break, которая прерывает объемлющий цикл и передает управление
следующей за циклом инструкции. Если нужно прервать только текущую итерацию, необходимо использовать инструкцию continue, которая после прерывания
итерации производит переход в начало цикла, т.е. в строку заголовка. Обе инструкции могут появляться в любом месте внутри тела цикла, но как правило, их используют во вложенных
в цикл условных инструкциях if, чтобы выполнить необходимое действие в ответ на некоторое условие. -
Следует помнить, что в Python разрешается использовать многоуровневые вложенные циклы, однако при этом отсутствует возможность использования конструкций
вида break n или continue n, где n указывало бы на количество прерываний внешних
циклов. Вместо этого необходимо использовать собственные инструкции для каждого из n циклов по отдельности.
Вопросы и задания для самоконтроля
1. Для чего в программировании используются циклы? Какие виды циклов присутствуют в арсенале языка Python?
Показать решение.
Ответ. Циклы в программировании используются для организации многократного исполнения набора инструкций. В языке
Python циклы представлены конструкциями for/in и while: основным предназначением
цикла for является обход элементов итерируемого объекта, а while представляет собой универсальный цикл общего назначения.
Стоит заметить, что с помощью инструкции while можно сымитировать в том числе и счетный цикл for, однако программный код,
как хорошо видно из наших примеров выше, получится менее компактным и может выполняться медленнее.
2. Допустимо ли в Python использование вложенных друг в друга циклов?
Показать решение.
Ответ. В Python разрешается использовать как вложенные циклы, так и вложенные условные инструкции
if.
3. Обязательно ли использование блока else в циклах? При каких условиях он выполняется?
Показать решение.
Ответ. Блок инструкций оператора else в циклах не является обязательным, а его инструкции выполняются только
после удачного завершения цикла (т.е. при отсутствии ошибки или прерывания за счет использования оператора break).
4. В чем заключается основное отличие инструкции break от инструкции continue?
Показать решение.
Ответ. Инструкция break полностью прерывает объемлющий цикл и передает управление следующей за циклом
инструкции, в то время как инструкция continue прерывает только текущую итерацию и производит переход в начало цикла, т.е. в строку его заголовка.
5. Выведите все элементы списка [10, 20, 30] на экран сперва при помощи цикла for, а
затем и цикла while.
Показать решение.
# Сохраняем список в переменной.
li = [10, 20, 30]
# Организуем цикл по эл-там списка.
for elem in li:
# Выводим значения на экран.
print(elem, end=' ')
# Сделаем отступ для цикла while.
print()
# Инициализируем счетчик для цикла.
k = 0
# Узнаем требуемое количество итераций.
i = len(li)
# Организуем цикл по эл-там списка.
while k < i:
# Выводим значения на экран.
print(li[k], end=' ')
# Наращиваем значение счетчика.
k += 1
10 20 30
10 20 30
6. Дополнительные упражнения и задачи по теме расположены в разделе
«Циклы for и while»
нашего сборника задач и упражнений по языку программирования Python.
Быстрый переход к другим страницам
#Руководства
- 4 апр 2023
-
0
Они есть практически в каждом языке программирования, но в Python с ними работать приятнее всего. Как, впрочем, и со всем остальным.
Иллюстрация: Катя Павловская для Skillbox Media
Журналист, изучает Python. Любит разбираться в мелочах, общаться с людьми и понимать их.
Код в Python обычно выполняется последовательно: первая строка, потом вторая, третья и так далее. Но некоторые конструкции позволяют нарушать этот порядок, чтобы совершать более сложные операции.
Например, циклы выполняют один и тот же блок кода несколько раз. В Python есть два основных вида циклов: while и for. О них и поговорим.
- Как работают циклы
- Цикл while в Python
- Цикл for в Python
- Функция range()
- Однострочный цикл: генератор списков
- Прерывание цикла: ключевое слово break
- Пропуск части цикла: ключевое слово continue
- Последнее действие в цикле: ключевое слово else
- Бесконечный цикл
- Как сделать аналог do while в Python
- Вложенные циклы в Python
Любой цикл состоит из двух обязательных элементов:
- условие — начальный параметр; цикл запустится только при его выполнении и закончится, как только условие перестанет выполняться;
- тело — сама программа, которая выполняется внутри цикла.
Схематически его можно представить так:
В синтаксисе Python в конце строки с условием ставится двоеточие, а всё тело выделяется отступом (табуляцией или четырьмя пробелами).
программа до цикла условие: первая строка тела вторая строка тела программа после цикла
While — наиболее простой и понятный вид цикла. Его ещё называют циклом с предусловием.
x = 1
while x < 5:
print(x)
x += 1 # Означает то же самое, что x = x + 1
>>> 1
>>> 2
>>> 3
>>> 4
С языка Python на русский программу можно перевести так: «Пока икс меньше пяти, печатай икс и прибавляй к нему единицу».
Но в простоте while кроется и опасность: его легко сделать бесконечным. Например, если в коде выше мы уберём x += 1, то получится вот так:
# Этот код будет выполняться бесконечно
x = 1
while x < 5:
print(x)
Здесь с переменной x ничего не происходит. Она всегда равна единице, поэтому условие цикла никогда не перестанет выполняться. Соответственно, он никогда не завершится.
Чтобы избежать таких ситуаций, при использовании while нужно следить: перестанет ли когда-нибудь выполняться условие? Ещё можно использовать оператор break — о нём мы расскажем чуть позже.
Цикл for программисты используют куда чаще, чем while. Для него мы устанавливаем не условие в чистом виде, а некий массив данных: список, кортеж, строку, словарь, диапазон или любой другой итерируемый объект.
На каждой итерации цикла программа как бы спрашивает: «Остались ли в объекте ещё элементы, по которым я не прошла?»
Допустим, у нас есть список с числами: [14, 101, -7, 0]. Мы можем использовать его вместе с for, чтобы напечатать каждый элемент по отдельности.
num_list = [14, 101, -7, 0] for number in num_list: print(number) >>> 14 >>> 101 >>> -7 >>> 0
Здесь переменная number обновляется при каждом новом витке цикла. Сначала она хранит в себе первый элемент, потом второй, и так — пока список не закончится.
Как и любую другую переменную, мы могли назвать number как угодно. Часто используют буквы i, j и k. Если внутри цикла мы ни разу не обращаемся к этой переменной, то среди питонистов её принято обозначать символом нижнего подчёркивания _.
Когда нужно применить for к числовому промежутку, его можно задать диапазоном. Для этого используют функцию range(). В неё можно передать от одного до трёх аргументов.
Если аргумент один, то сформируется диапазон от нуля до числа, предшествующего значению аргумента.
for i in range(3): print(i) >>> 0 >>> 1 >>> 2
Если аргумента два, то сформируется диапазон от значения первого аргумента до числа, предшествующего значению второго аргумента.
for i in range(23, 26): print(i) >>> 23 >>> 24 >>> 25
Если аргумента три, то первые два работают, как в прошлом случае. Третий же означает шаг, с которым числа следуют друг за другом.
for i in range(10, 20, 3): print(i) >>> 10 >>> 13 >>> 16 >>> 19
Если в теле цикла for выполняется всего одно действие, синтаксис Python позволяет сократить его запись до:
i for i in iterable_object
Это синтаксический сахар, который не добавляет новой функциональности, но влияет на внешний вид кода. Так можно легко и быстро генерировать списки.
num_list = [i for i in range(1, 11)] print(num_list) >>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
В такую конструкцию также можно добавить дополнительное условие. Сделаем генератор, который будет выводить только чётные числа. При этом не будем создавать переменную для получившегося списка, а сразу напечатаем его.
print([i for i in range(1, 11) if i % 2 == 0]) >>> [2, 4, 6, 8, 10]
Конструкция if i % 2 == 0 означает: «если при делении i на 2 остаток равен 0».
С самой переменной i тоже можно проводить операции. Используем предыдущий генератор, но теперь будем выводить не сами чётные числа, а их квадраты.
print([i ** 2 for i in range(1, 11) if i % 2 == 0]) >>> [4, 16, 36, 64, 100]
Главное при таком подходе — сильно не увлекаться. Если код тяжело прочесть и понять (например, когда к i применяется сразу несколько функций и методов и вдобавок задаётся сложное условие), то лучше разбить его на несколько строк. Понятность важнее лаконичности.
Бывают случаи, когда нужно завершить цикл принудительно, даже если его условие всё ещё выполняется. В таких случаях используют ключевое слово break.
Возьмём строку Hi, loop! и будем выводить каждый её символ. Если встретим запятую, досрочно завершим цикл.
string = 'Hi, loop!' for i in string: if i == ',': break print(i) >>> H >>> i
Если же в строке запятой не будет, то цикл пройдёт по каждому её символу — и только потом завершится.
string = 'Hi loop!' for i in string: if i == ',': break print(i) >>> H >>> i >>> >>> l >>> o >>> o >>> p >>> !
Иногда возникает необходимость принудительно начать следующий шаг цикла, пропустив часть строк в его теле. Для таких случаев существует ключевое слово continue.
Возьмём числа от 1 до 10 включительно и выведем из них только те, которые не делятся ни на 2, ни на 3.
for i in range(1, 10): if i%2 == 0 or i%3 == 0: continue print(i) >>> 1 >>> 5 >>> 7
Как видим, если срабатывает условие if (то есть если число делится на 2 или на 3 без остатка), то оставшаяся часть тела не работает — и i не печатается.
Обычно ключевое слово else употребляют в связке с if, но у него есть и другое применение. Его можно использовать вместе с while или for. В таком случае else-код выполнится после того, как пройдут все витки цикла.
Если же цикл досрочно прервётся из-за break, то часть программы в else не выполнится.
Вспомним наш код со строкой Hi, loop! и добавим к нему else.
string = 'Hi, loop!' for i in string: if i == ',': break print(i) else: print('Цикл завершился без break') >>> H >>> i
В строке была запятая, сработал break — не выполнилось else-условие. Теперь уберём из неё запятую и посмотрим, что получится.
string = 'Hi loop!' for i in string: if i == ',': break print(i) else: print('Цикл завершился без break') >>> H >>> i >>> >>> l >>> o >>> o >>> p >>> ! >>> Цикл завершился без break
Цикл прошёл все свои итерации, завершился самостоятельно, и поэтому код в else выполнился. Он также будет работать, если цикл не совершил ни одного витка.
while 1 == 0: print('Эта строка никогда не выполнится') else: print('Цикл завершился без break') >>> Цикл завершился без break
Иногда использовать бесконечный цикл может быть хорошей идеей. Например, мы пишем игру: она должна работать до тех пор, пока игрок из неё не выйдет. В этом случае в условии выхода нужно будет прописать break.
Чтобы цикл был бесконечным, его условие должно выполняться всегда. Это можно сделать разными способами.
# Способ №1 — «пока истинно» while True: pass # pass — оператор-заглушка, который ничего не делает
Если сделать while False, то цикл, наоборот, никогда не начнётся.
# Способ №2 — «пока проверяемое значение — любое ненулевое число»
while 1:
pass
while -4:
pass
while 2023:
pass
Если сделать while 0, то цикл никогда не начнётся.
# Способ №3 — «пока проверяемое значение — непустой элемент»
while 'string':
pass
while [False, 'list', 0]:
pass
Если после while поставить пустой элемент — например, строку str() или список list(), то цикл никогда не начнётся.
# Способ №4 — корректное уравнение
while 1 == 1:
pass
while 0 != 1:
pass
Альтернативный подход — поместить после while переменную, в которой лежит подходящее условие. Например:
# Способ №1 condition = True while condition: pass # Способ №2 condition = 1 while condition: pass # Способ №3 condition = 'string' while condition: pass
В таких случаях для выхода из цикла можно не использовать оператор break, а заменить значение в переменной condition на False, 0, None или любой пустой элемент. Цикл закончит последний виток и завершится, потому что условие больше не будет выполняться.
Такой подход применяется, когда нужно завершить цикл из других мест программы: например, из функции или вложенного цикла. Ещё одно отличие: так как цикл завершается «естественно», без оператора break, в нём выполнится else-код (если он есть).
condition = True x = 0 while condition: print(x) x += 1 if x == 3: condition = False else: print('Цикл завершился без break') >>> 0 >>> 1 >>> 2 >>> Цикл завершился без break
В некоторых языках программирования есть ещё один вид цикла — с постусловием. Он всегда проходит хотя бы один виток и только после этого проверяет, выполняется ли условие. Вот его схема:
В Java и C++ такое достигается с помощью конструкции do while, но в Python её нет. Зато можно сделать аналог. Для этого нужно использовать бесконечный цикл, а внутри его тела прописать условие завершения.
x = 12 while True: x += 1 print(x) if x > 5: break >>> 13
Каким бы ни было значение x, такой цикл пройдёт хотя бы один виток. А это и есть постусловие.
Циклы в Python можно вкладывать друг в друга — то есть в теле одного цикла вызывать другой. Логика программы при этом усложняется.
Можно вкладывать друг в друга сколько угодно циклов. При этом для каждого нового уровня вложенности нужно увеличивать отступ. Выглядит это так:
while condition: pass while inner_condition: pass pass
Напишем программу, которая будет выводить номер итерации внешнего и внутреннего цикла.
for i in range(3): print(f'Итерация внешнего цикла: {i}') for j in range(2): print(f'Итерация внутреннего цикла: {j}') >>> Итерация внешнего цикла: 0 >>> Итерация внутреннего цикла: 0 >>> Итерация внутреннего цикла: 1 >>> Итерация внешнего цикла: 1 >>> Итерация внутреннего цикла: 0 >>> Итерация внутреннего цикла: 1 >>> Итерация внешнего цикла: 2 >>> Итерация внутреннего цикла: 0 >>> Итерация внутреннего цикла: 1
- Циклы — один из основных инструментов любого Python-разработчика. С их помощью всего за пару строчек кода можно совершить сразу множество повторяющихся действий.
- Циклы состоят из условия и тела. Код в теле выполняется только до тех пор, пока соблюдено условие.
- В Python есть два вида циклов: while и for. В while условие задаётся явным образом. В for перебирается каждый элемент коллекции.
- К обоим видам можно применять разные операторы: break для прерывания, continue для пропуска части тела, else для совершения последнего действия перед выходом из цикла.
- Циклы можно делать бесконечными (тогда программа никогда не завершится или завершится только при выполнении определённого условия) и вкладывать друг в друга.
Нейросети вам помогут.
Большой вебинар по нейросетям. 15 экспертов, 7 топ-нейросетей. Научитесь использовать ИИ в своей работе и повысьте эффективность.
Узнать больше
Содержание:развернуть
- Применение циклов
- Итерации
- Синтаксис for
- range() и enumerate()
- break и continue
- else
- Best practice
-
Цикл по списку
-
Цикл по словарю
-
Цикл по строке
-
Как сделать цикл for с шагом
-
Обратный цикл for
-
for в одну строку
Циклы являются мощнейшим инструментом, предоставляемым высокоуровневыми языками программирования. Эти управляющие конструкции позволяют многократно выполнять требуемую последовательность инструкций. Циклы в языке Python представлены двумя основными конструкциями: while
и for
.
Подробнее о циклах while вы можете прочитать здесь:
Применение циклов
Концепция циклов — это не просто очередная абстрактная выдумка программистов. Повторяющиеся раз за разом операции окружают нас и в реальной жизни:
🥣 добавление щепотки приправ в варящийся бульон и помешивание его до тех пор, пока пакетик специй не закончится.
🕙 следование строгому расписанию каждый будний день, пока не наступят долгожданные выходные.
🌄 даже банальная смена времён года.
— всё это циклы, и представить нормальную жизнь без них попросту невозможно.
Впрочем, то же касается и программирования. Представьте, что вам нужно последовательно напечатать числа от 1 до 9999999999. В отсутствии циклов, эту задачу пришлось бы выполнять ручками, что потребовало бы колоссального количества кода и огромных временных затрат:
print(1)
print(2)
print(3)
# ...
# 9999999995 строк
# ...
print(9999999998)
print(9999999999)
Циклы же позволяют уместить такую многокилометровую запись в изящную и простую для понимания конструкцию, состоящую всего из двух строчек:
for i in range(1, 10000000000):
print(i)
Смысл её крайне прост. В основе цикла for
лежат последовательности, и в примере выше это последовательность чисел от 1 до 9999999999. for
поэлементно её перебирает и выполняет код, который записан в теле цикла. В частности, для решения данной задачи туда была помещена инструкция, позволяющая выводить значение элемента последовательности на экран.
Итерации
- Итерация (Iteration) — это одно из повторений цикла (один шаг или один «виток» циклического процесса). К примеру цикл из 3-х повторений можно представить как 3 итерации.
- Итерируемый объект (Iterable) — объект, который можно повторять. Проще говоря это объект, который умеет отдавать по одному результату за каждую итерацию.
- Итератор (iterator) — итерируемый объект, в рамках которого реализован метод __next__, позволяющий получать следующий элемент.
👉 Чтобы выполнить итерацию, Python делает следующее:
- Вызывает у итерируемого объекта метод
iter()
, тем самым получая итератор. - Вызывает метод
next()
, чтобы получить каждый элемент от итератора. - Когда метод next возвращает исключение
StopIteration
, цикл останавливается.
Пример создания итерируемого объекта
Для того чтобы создать собственный класс итерируемого объекта, нужно всего лишь внутри него реализовать два метода: __iter__() и __next__():
- внутри метода __next__ () описывается процедура возврата следующего доступного элемента;
- метод __iter__() возвращает сам объект, что даёт возможность использовать его, например, в циклах с поэлементным перебором.
Создадим простой строковый итератор, который на каждой итерации, при получении следующего элемента (т.е. символа), приводит его к верхнему регистру:
class ToUpperCase:
def __init__(self, string_obj, position=0):
"""сохраняем строку, полученную из конструктора,
в поле string_obj и задаём начальный индекс"""
self.string_obj = string_obj
self.position = position
def __iter__(self):
""" возвращаем сам объект """
return self
def __next__(self):
""" метод возвращает следующий элемент,
но уже приведенный к верхнему регистру """
if self.position >= len(self.string_obj):
# исключение StopIteration() сообщает циклу for о завершении
raise StopIteration()
position = self.position
# инкрементируем индекс
self.position += 1
# возвращаем символ в uppercase-e
return self.string_obj[position].upper()
low_python = "python"
high_python = ToUpperCase(low_python)
for ch in high_python:
print(ch, end="")
> PYTHON
Синтаксис for
Как было замечено, цикл for
python — есть средство для перебора последовательностей. С его помощью можно совершать обход строк, списков, кортежей и описанных выше итерируемых объектов.
В простейшем случае он выглядит так:
for item in collection:
# do something
Если последовательность collection
состоит, скажем, из 10 элементов, for
будет поочерёдно обходить их, храня значение текущего элемента в переменной item
.
Принцип работы for
максимально схож с таковым у циклов foreach
, применяемых во многих других высокоуровневых языках.
aliceQuote = "The best way to explain it is to do it."
# с помощью цикла for посчитаем количество символов (с пробелами) в строке
# зададим счетчик
count = 0
# будем посимвольно обходить весь текст
for letter in aliceQuote:
# на каждой новой итерации:
# в переменной letter будет храниться следующий символ предложения;
# увеличиваем счетчик на 1;
count += 1
print(count)
> 39
range() и enumerate()
Вы уже наверняка запомнили, что for
работает с последовательностями. В программировании очень часто приходится повторять какую-то операцию фиксированное количество раз. А где упоминается «количество чего-то», существует и последовательность, числовая.
👉 Для того чтобы выполнить какую-либо инструкцию строго определенное число раз, воспользуемся функцией range()
:
# скажем Миру привет целых пять раз!
for i in range(5):
print("Hello World!")
>
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
range()
можно представлять, как функцию, что возвращает последовательность чисел, регулируемую количеством переданных в неё аргументов. Их может быть 1, 2 или 3:
range(stop)
;range(start, stop)
;range(start, stop, step)
.
Здесь start
— это первый элемент последовательности (включительно), stop
— последний (не включительно), а step
— разность между следующим и предыдущим членами последовательности.
# 0 - начальный элемент по умолчанию
for a in range(3):
print(a)
>
0
1
2
# два аргумента
for b in range(7, 10):
print(b)
>
7
8
9
# три аргумента
for c in range(0, 13, 3):
print(c)
>
0
3
6
9
12
Подробнее о функции range тут:
👉 Чрезвычайно полезная функция enumerate()
определена на множестве итерируемых объектов и служит для создания кортежей на основании каждого из элементов объекта. Кортежи строятся по принципу (индекс элемента, элемент), что бывает крайне удобно, когда помимо самих элементов требуется ещё и их индекс.
# заменим каждый пятый символ предложения, начиная с 0-го, на *
text = "Это не те дроиды, которых вы ищете"
new_text = ""
for char in enumerate(text):
if char[0] % 5 == 0:
new_text += '*'
else:
new_text += char[1]
print(new_text)
> *то н* те *роид*, ко*орых*вы и*ете
break и continue
Два похожих оператора, которые можно встретить и в других языках программирования.
break
— прерывает цикл и выходит из него;continue
— прерывает текущую итерацию и переходит к следующей.
# break
for num in range(40, 51):
if num == 45:
break
print(num)
>
40
41
42
43
44
Здесь видно, как цикл, дойдя до числа 45 и вернув истину в условном выражении, прерывается и заканчивает свою работу.
# continue
for num in range(40, 51):
if num == 45:
continue
print(num)
>
40
41
42
43
44
46
47
48
49
50
В случае continue
происходит похожая ситуация, только прерывается лишь одна итерация, а сам же цикл продолжается.
else
Если два предыдущих оператора можно часто встречать за пределами Python, то else
, как составная часть цикла, куда более редкий зверь. Эта часть напрямую связана с оператором break
и выполняется лишь тогда, когда выход из цикла был произведен НЕ через break
.
group_of_students = [21, 18, 19, 21, 18]
for age in group_of_students:
if age < 18:
break
else:
print('Всё в порядке, они совершеннолетние')
> Всё в порядке, они совершеннолетние
Best practice
Цикл по списку
Перебрать list
в цикле не составляет никакого труда, поскольку список — объект итерируемый:
# есть список
entities_of_warp = ["Tzeench", "Slaanesh", "Khorne", "Nurgle"]
# просто берём список, «загружаем» его в цикл и без всякой задней мысли делаем обход
for entity in entities_of_warp:
print(entity)
>
Tzeench
Slaanesh
Khorne
Nurgle
Так как элементами списков могут быть другие итерируемые объекты, то стоит упомянуть и о вложенных циклах. Цикл внутри цикла вполне обыденное явление, и хоть количество уровней вложенности не имеет пределов, злоупотреблять этим не следует. Циклы свыше второго уровня вложенности крайне тяжело воспринимаются и читаются.
strange_phonebook = [
["Alex", "Andrew", "Aya", "Azazel"],
["Barry", "Bill", "Brave", "Byanka"],
["Casey", "Chad", "Claire", "Cuddy"],
["Dana", "Ditrich", "Dmitry", "Donovan"]
]
# это список списков, где каждый подсписок состоит из строк
# следовательно можно (зачем-то) применить тройной for
# для посимвольного чтения всех имён
# и вывода их в одну строку
for letter in strange_phonebook:
for name in letter:
for character in name:
print(character, end='')
> A l e x A n d r e w A y a A z a z e l B a r ...
Цикл по словарю
Чуть более сложный пример связан с итерированием словарей. Обычно, при переборе словаря, нужно получать и ключ и значение. Для этого существует метод .items()
, который создает представление в виде кортежа для каждого словарного элемента.
Цикл, в таком случае, будет выглядеть следующим образом:
# создадим словарь
top_10_largest_lakes = {
"Caspian Sea": "Saline",
"Superior": "Freshwater",
"Victoria": "Freshwater",
"Huron": "Freshwater",
}
# обойдём его в цикле for и посчитаем количество озер с солёной водой и количество озёр с пресной
salt = 0
fresh = 0
# пара "lake, water", в данном случае, есть распакованный кортеж, где lake - ключ словаря, а water - значение.
# цикл, соответственно, обходит не сам словарь, а его представление в виде пар кортежей
for lake, water in top_10_largest_lakes.items():
if water == 'Freshwater':
fresh += 1
else:
salt += 1
print("Amount of saline lakes in top10: ", salt)
print("Amount of freshwater lakes in top10: ", fresh)
> Amount of saline lakes in top10: 1
> Amount of freshwater lakes in top10: 3
Цикл по строке
Строки, по сути своей — весьма простые последовательности, состоящие из символов. Поэтому обходить их в цикле тоже совсем несложно.
word = 'Alabama'
for w in word:
print(w, end=" ")
> A l a b a m a
Как сделать цикл for с шагом
Цикл for
с шагом создается при помощи уже известной нам функции range
, куда, в качестве третьего по счету аргумента, нужно передать размер шага:
# выведем числа от 100 до 1000 с шагом 150
for nums in range(100, 1000, 150):
print(nums)
>
100
250
400
550
700
850
Обратный цикл for
Если вы еще не убедились в том, что range()
полезна, то вот ещё пример: благодаря этой функции можно взять и обойти последовательность в обратном направлении.
# выведем числа от 40 до 50 по убыванию
# для этого установим step -1
for nums in range(50, 39, -1):
print(nums)
>
50
49
48
47
46
45
44
43
42
41
40
for в одну строку
Крутая питоновская фишка, основанная на так называемых list comprehensions
или, по-русски, генераторов. Их запись, быть может, несколько сложнее для понимания, зато очевидно короче и, по некоторым данным, она работает заметно быстрее на больших массивах данных.
В общем виде генератор выглядит так:
[результирующее выражение | цикл | опциональное условие]
Приведем пример, в котором продублируем каждый символ строки inputString
:
# здесь letter * 2 — результирующее выражение; for letter in inputString — цикл, а необязательное условие опущено
double_letter = [letter * 2 for letter in "Banana"]
print(double_letter)
> ['BB', 'aa', 'nn', 'aa', 'nn', 'aa']
Другой пример, но теперь уже с условием:
# создадим список, что будет состоять из четных чисел от нуля до тридцати
# здесь if x % 2 == 0 — необязательное условие
even_nums = [x for x in range(30) if x % 2 == 0]
print(even_nums)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
—