Цикл while в Python
Из этого материала вы узнаете, что такое циклы while, как они могут становиться бесконечными, как использовать инструкцию else в цикле while и как прерывать исполнение цикла.
Управление потоком инструкций: цикл While в Python
Как и другие языки программирования Python включает несколько инструкций для управления потоком. Одна из таких — if else. Еще одна — циклы. Циклы используются в тех случаях, когда нужно повторить блок кода определенное количество раз.
Что такое цикл while в Python?
Цикл while используется в Python для неоднократного исполнения определенной инструкции до тех пор, пока заданное условие остается истинным. Этот цикл позволяет программе перебирать блок кода.
while test_expression: body of while
Сначала программа оценивает условие цикла while. Если оно истинное, начинается цикл, и тело while исполняется. Тело будет исполняться до тех пор, пока условие остается истинным. Если оно становится ложным, программа выходит из цикла и прекращает исполнение тела.
Рассмотрим пример, чтобы лучше понять.
a = 1 while a 10: print('Цикл выполнился', a, 'раз(а)') a = a+1 print('Цикл окончен')
Цикл выполнился 1 раз Цикл выполнился 2 раз Цикл выполнился 3 раз Цикл выполнился 4 раз Цикл выполнился 5 раз Цикл выполнился 6 раз Цикл выполнился 7 раз Цикл выполнился 8 раз Цикл выполнился 9 раз Цикл окончен
Бесконечный цикл while в Python
Бесконечный цикл while — это цикл, в котором условие никогда не становится ложным. Это значит, что тело исполняется снова и снова, а цикл никогда не заканчивается.
Следующий пример — бесконечный цикл:
a = 1 while a==1: b = input('Как тебя зовут?') print('Привет', b, ', Добро пожаловать')
Если запустить этот код, то программа войдет в бесконечный цикл и будет снова и снова спрашивать имена. Цикл не остановится до тех пор, пока не нажать Ctrl + C .
Else в цикле while
В Python с циклами while также можно использовать инструкцию else . В этом случае блок в else исполняется, когда условие цикла становится ложным.
a = 1 while a 5: print('условие верно') a = a + 1 else: print('условие неверно')
Этот пример демонстрирует принцип работы else в цикле while.
условие верно условие верно условие верно условие верно условие неверно
Программа исполняет код цикла while до тех, пока условие истинно, то есть пока значение a меньше 5. Поскольку начальное значение a равно 1, а с каждым циклом оно увеличивается на 1, условие станет ложным, когда программа доберется до четвертой итерации — в этот момент значение a изменится с 4 до 5. Программа проверит условие еще раз, убедится, что оно ложно и исполнит блок else , отобразив «условие неверно».
Прерывания цикла while в Python
В Python есть два ключевых слова, с помощью которых можно преждевременно остановить итерацию цикла.
-
Break — ключевое слово break прерывает цикл и передает управление в конец цикла
a = 1 while a 5: a += 1 if a == 3: break print(a) # 2
a = 1 while a 5: a += 1 if a == 3: continue print(a) # 2, 4, 5
Цикл while для начинающих
Цикл while — это конструкция, позволяющая выполнять блок кода до тех, пор пока условие в этой конструкции продолжает быть истиной. Отступы тут будут работать точно так же, как и при использовании оператора if — все, что сдвинуто на четыре пробела относительно ключевого слова while будет считаться телом цикла.
С английского языка while так и переводится — до тех пор, пока.
Для начинающих особенно важно понять все детали работы цикла, поэтому разберем программу, последовательно выводящую цифры от 1 до 3 , построчно:
i = 1while i 3: print(i) i += 1
- Задаем начальное значение переменной i , которая является так называемой переменной-счетчиком ;
- Объявляем условие — пока значение счетчика меньше или равно трем , код ниже будет выполняться. Конец условия обязательно обозначаем двоеточием;
- Выводим значение переменной i (единица, в данном случае). Обратите внимание, что Python определяет начало цикла, видя отступ в четыре пробела;
- Увеличиваем значение переменной i на единицу (которое становится равное двум). Два меньше трех? Значит Python выполнит еще одну итерацию цикла, и так необходимое количество раз, пока условие не перестанет быть истиной (значение переменной i будет меньше либо равно трем).
Нашу программу можно переписать и немного по-другому, используя оператор break
i = 1while True: print(i) if i >= 3: break i += 1
В принципе, все повторения и шаги цикла аналогичны первому варианту. Отличие лишь в том, что для завершения цикла мы используем оператор break , который завершает выполнение цикла. То есть, если переменная-счетчик станет больше либо равна 3 , цикл завершится. Оператор break полезен, если условие в while написать трудно, оно слишком громоздкое, либо перед завершением цикла нужна выполнить какие-либо дополнительные действия
Хотите выучить Python на практике?
Python: Цикл While
Программы, которые мы пишем на курсе, становятся сложнее и объемнее. Они еще далеки от реальных программ, хотя уже заставляют напрячься.
В этом уроке мы переходим к одной из самых сложных базовых тем в программировании — циклам.
Прикладные программы помогают управлять сотрудниками, финансами и могут развлекать. Несмотря на различия, они выполняют заложенные в них алгоритмы, которые похожи. Алгоритм — это последовательность действий, которая приводит к ожидаемому результату.
Представим, что у нас есть книга, и мы хотим найти в ней конкретную фразу. Саму фразу мы помним, но не знаем, на какой она странице. Нам придется последовательно просматривать страницы до тех пор, пока не найдем нужную. Этот процесс и называется алгоритмом.
Алгоритм включает логические проверки и перебор страниц. Количество страниц, которое придется посмотреть, заранее неизвестно. Но сам процесс просмотра повторяется одинаковым образом. Чтобы выполнять повторяющиеся действия, нужны циклы. Каждый повтор называется итерацией.
Напишем функцию с простым циклом, который будет n раз выводить на экран строку ‘Hello!’ :
def print_hello(n): counter = 0 while counter < n: print('Hello!') counter = counter + 1 print_hello(2) # =>Hello! # => Hello!
Теперь проанализируем пример функции с циклом, который выводит на экран числа от одного до числа-аргумента:
print_numbers(3) # => 1 # => 2 # => 3
Эту функцию невозможно реализовать уже изученными средствами, так как количество выводов на экран заранее неизвестно. А с циклами проблем не будет:
def print_numbers(last_number): # i сокращение от index (порядковый номер) # используется по общему соглашению во множестве языков # как счетчик цикла i = 1 while i 1 # => 2 # => 3 # => finished!
Цикл while состоит из трех элементов:
- Ключевое слово while
- Предикат — условие, которое указывается после while и вычисляется на каждой итерации
- Блок кода — тело цикла
Каждое выполнение тела называется итерацией. В примере выше print_numbers(3) вызвал три итерации, на каждой из которых была выведена на экран переменная i . Конструкция читается так: «делать то, что указано в теле цикла, пока истинно условие i
Разберем работу этого кода для вызова print_numbers(3) :
# Инициализируется i i = 1 # Предикат возвращает true, поэтому выполняется тело цикла while 1
Процесс, который порождает цикл, должен остановиться. За это отвечает программист.
Обычно задача сводится к введению переменной — счетчику цикла. Сначала он инициализируется — ему задается начальное значение. В нашем примере это строчка i = 1 . Затем в условии цикла проверяется, не достиг ли счетчик своего предельного значения.
Предельное значение в примере определяется аргументом функции. Если условие цикла не выполнено, то тело не выполняется и интерпретатор двигается дальше — работает с инструкциями после цикла.
Если условие цикла истинно, то выполняется тело, в котором находится элемент остановки — изменение счетчика. Обычно его делают в конце тела, и это изменение — место, где нельзя обойтись без переменной. В примере выше за изменение отвечает строчка i = i + 1 .
На этом моменте новички много ошибаются. Например, можно забыть увеличить счетчик или неправильно проверить его в предикате. Это приведет к зацикливанию — цикл будет работать бесконечно и программа никогда не остановится. В таком случае ее нужно завершить принудительно.
def print_numbers(last_number): i = 1 # Этот цикл никогда не остановится # и будет печатать всегда одно значение while i
В некоторых случаях бесконечные циклы полезны. Мы не будем рассматривать такие ситуации, но покажем, как выглядит этот код:
while True: # Что-то делаем
Без циклов невозможно обойтись, когда алгоритм решения задачи требует повторения каких-то действий и количество этих операций заранее неизвестно.
Задание
Модифицируйте функцию print_numbers() так, чтобы она выводила числа в обратном порядке. Для этого нужно идти от верхней границы к нижней. То есть счётчик должен быть инициализирован максимальным значением, а в теле цикла его нужно уменьшать до нижней границы.
Пример вызова и вывода:
print_numbers(4)
4
3
2
1
finished!
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
Определения
- Цикл While — инструкция для повторения кода, пока удовлетворяется какое-то условие.
Как правильно записать цикл while в python
Цикл while (“пока”) позволяет выполнить одну и ту же последовательность действий, пока проверяемое условие истинно. Условие записывается до тела цикла и проверяется до выполнения тела цикла. Как правило, цикл while используется, когда невозможно определить точное значение количества проходов исполнения цикла.
Синтаксис цикла while в простейшем случае выглядит так:
while условие: блок инструкций
При выполнении цикла while сначала проверяется условие. Если оно ложно, то выполнение цикла прекращается и управление передается на следующую инструкцию после тела цикла while . Если условие истинно, то выполняется инструкция, после чего условие проверяется снова и снова выполняется инструкция. Так продолжается до тех пор, пока условие будет истинно. Как только условие станет ложно, работа цикла завершится и управление передастся следующей инструкции после цикла.
Например, следующий фрагмент программы напечатает на экран квадраты всех целых чисел от 1 до 10. Видно, что цикл while может заменять цикл for . in range(. ) :
i = 1 while iВ этом примере переменная i внутри цикла изменяется от 1 до 10. Такая переменная, значение которой меняется с каждым новым проходом цикла, называется счетчиком. Заметим, что после выполнения этого фрагмента значение переменной i будет равно 11 , поскольку именно при i == 11 условие i
Вот еще один пример использования цикла while для определения количества цифр натурального числа n :
5678n = int(input()) length = 0 while n > 0: n //= 10 # это эквивалентно n = n // 10 length += 1 print(length)В этом цикле мы отбрасываем по одной цифре числа, начиная с конца, что эквивалентно целочисленному делению на 10 ( n //= 10 ), при этом считаем в переменной length , сколько раз это было сделано.
В языке Питон есть и другой способ решения этой задачи: .
2. Инструкции управления циклом
После тела цикла можно написать слово else: и после него блок операций, который будет выполнен один раз после окончания цикла, когда проверяемое условие станет неверно:
i = 1 while iКазалось бы, никакого смысла в этом нет, ведь эту же инструкцию можно просто написать после окончания цикла. Смысл появляется только вместе с инструкцией break . Если во время выполнения Питон встречает инструкцию break внутри цикла, то он сразу же прекращает выполнение этого цикла и выходит из него. При этом ветка else исполняться не будет. Разумеется, инструкцию break осмыленно вызывать только внутри инструкции if , то есть она должна выполняться только при выполнении какого-то особенного условия.
Приведем пример программы, которая считывает числа до тех пор, пока не встретит отрицательное число. При появлении отрицательного числа программа завершается. В первом варианте последовательность чисел завершается числом 0 (при считывании которого надо остановиться).
3 6 -1 4 0a = int(input()) while a != 0: if a < 0: print('Встретилось отрицательное число', a) break a = int(input()) else: print('Ни одного отрицательного числа не встретилось')Во втором варианте программы сначала на вход подается количество элементов последовательности, а затем и сами элементы. В таком случае удобно воспользоваться циклом for . Цикл for также может иметь ветку else и содержать инструкции break внутри себя.
3 6 2 4n = int(input()) for i in range(n): a = int(input()) if a < 0: print('Встретилось отрицательное число', a) break else: print('Ни одного отрицательного числа не встретилось')Другая инструкция управления циклом — continue (продолжение цикла). Если эта инструкция встречается где-то посередине цикла, то пропускаются все оставшиеся инструкции до конца цикла, и исполнение цикла продолжается со следующей итерации.
Если инструкции break и continue содержатся внутри нескольких вложенных циклов, то они влияют лишь на исполнение самого внутреннего цикла. Вот не самый интеллектуальный пример, который это демонстрирует:
for i in range(3): for j in range(5): if j > i: break print(i, j)Увлечение инструкциями break и continue не поощряется, если можно обойтись без их использования. Вот типичный пример плохого использования инструкции break (данный код считает количество знаков в числе).
n = int(input()) length = 0 while True: length += 1 n //= 10 if n == 0: break print('Длина числа равна', length)Гораздо лучше переписать этот цикл так:
n = int(input()) length = 0 while n != 0: length += 1 n //= 10 print('Длина числа равна', length)Впрочем, на Питоне можно предложить и более изящное решение:
n = int(input()) print('Длина числа равна', len(str(n)))3. Множественное присваивание
В Питоне можно за одну инструкцию присваивания изменять значение сразу нескольких переменных. Делается это так:
a, b = 0, 1Этот код можно записать и так:
a = 0 b = 1Отличие двух способов состоит в том, что множественное присваивание в первом способе меняет значение двух переменных одновременно.
Если слева от знака «=» в множественном присваивании должны стоять через запятую имена переменных, то справа могут стоять произвольные выражения, разделённые запятыми. Главное, чтобы слева и справа от знака присваивания было одинаковое число элементов.
Множественное присваивание удобно использовать, когда нужно обменять значения двух переменных. В обычных языках программирования без использования специальных функций это делается так:
a = 1 b = 2 tmp = a a = b b = tmp print(a, b) # 2 1В Питоне то же действие записывается в одну строчку:
a = 1 b = 2 a, b = b, a print(a, b) # 2 1