Циклы в программировании. Цикл while. Урок 10 курса «Python. Введение в программирование»
Циклы являются такой же важной частью структурного программирования, как условные операторы. С помощью циклов можно организовать повторение выполнения участков кода. Потребность в этом возникает довольно часто. Например, пользователь последовательно вводит числа, и каждое из них требуется добавлять к общей сумме. Или нужно вывести на экран квадраты ряда натуральных чисел и тому подобные задачи.
Цикл while
«While» переводится с английского как «пока». Но не в смысле «до свидания», а в смысле «пока имеем это, делаем то».
Можно сказать, while является универсальным циклом. Он присутствует во всех языках, поддерживающих структурное программирование, в том числе в Python. Его синтаксис обобщенно для всех языков можно выразить так:
while логическое_выражение { выражение 1; … выражение n; }
Это похоже на условный оператор if
. Однако в случае циклических операторов их тела могут выполняться далеко не один раз. В случае
, если логическое выражение в заголовке возвращает истину, то тело выполняется единожды. После этого поток выполнения программы возвращается в основную ветку и выполняет следующие выражения, расположенные ниже всей конструкции условного оператора.
В случае while
, после того как его тело выполнено, поток возвращается к заголовку цикла и снова проверяет условие. Если логическое выражение возвращает истину, то тело снова выполняется. Потом снова возвращаемся к заголовку и так далее.
Цикл завершает свою работу только тогда, когда логическое выражение в заголовке возвращает ложь, то есть условие выполнения цикла больше не соблюдается. После этого поток выполнения перемещается к выражениям, расположенным ниже всего цикла. Говорят, «происходит выход из цикла».
Рассмотрите блок-схему цикла while
.
На ней ярко-голубыми прямоугольниками обозначена основная ветка программы, ромбом – заголовок цикла с логическим выражением, бирюзовым прямоугольником – тело цикла.
С циклом while возможны две исключительные ситуации:
Если при первом заходе в цикл логическое выражение возвращает
False
, то тело цикла не выполняется ни разу. Эту ситуацию можно считать нормальной, так как при определенных условиях логика программы может предполагать отсутствие необходимости в выполнении выражений тела цикла.Если логическое выражение в заголовке
while
никогда не возвращаетFalse
, а всегда остается равнымTrue
, то цикл никогда не завершится, если только в его теле нет оператора принудительного выхода из цикла (break
) или вызовов функций выхода из программы –
,exit()
в случае Python. Если цикл повторяется и повторяется бесконечное количество раз, то в программе происходит зацикливание. В это время она зависает и самостоятельно завершиться не может.
Вспомним наш пример из урока про исключения. Пользователь должен ввести целое число. Поскольку функция input()
возвращает строку, то программный код должен преобразовать введенное к целочисленному типу с помощью функции int()
. Однако, если были введены символы, не являющиеся цифрами, то возникает исключение ValueError
, которое обрабатывается веткой except
. На этом программа завершается.
Другими словами, если бы программа предполагала дальнейшие действия с числом (например, проверку на четность), а она его не получила, то единственное, что программа могла сделать, это закончить свою работу досрочно.
Но ведь можно просить и просить пользователя корректно вести число, пока он его не введет. Вот как может выглядеть реализующий это код:
n = input("Введите целое число: ") while type(n) != int: try: n = int(n) except ValueError: print("Неправильно ввели!") n = input("Введите целое число: ") if n % 2 == 0: print("Четное") else: print("Нечетное")
Примечание 1. Не забываем, в языке программирования Python в конце заголовков сложных инструкций ставится двоеточие.
Примечание 2. В выражении type(n) != int
с помощью функции type()
проверяется тип переменной n. Если он не равен int
, то есть значение n не является целым числом, а является в данном случае строкой, то выражение возвращает истину. Если же тип int
, то данное логическое выражение возвращает ложь.
Примечание 3. Оператор %
в языке Python используется для нахождения остатка от деления. Так, если число четное, то оно без остатка делится на 2, то есть остаток будет равен нулю. Если число нечетное, то остаток будет равен единице.
Проследим алгоритм выполнения этого кода. Пользователь вводит данные, они имеют строковый тип и присваиваются переменной n. В заголовке while
проверяется тип n. При первом входе в цикл тип n всегда строковый, то есть он не равен int
. Следовательно, логическое выражение возвращает истину, что позволяет зайти в тело цикла.
Здесь в ветке try
совершается попытка преобразования строки к целочисленному типу. Если она была удачной, то ветка except
пропускается, и поток выполнения снова возвращается к заголовку while
.
Теперь n связана с целым числом, следовательно, ее тип int
, который не может быть не равен int
. Он ему равен. Таким образом логическое выражение type(n) != int
возвращает False
, и весь цикл завершает свою работу. Далее поток выполнения переходит к оператору if-else, находящемуся в основной ветке программы. Здесь могло бы находиться что угодно, не обязательно условный оператор.
Вернемся назад. Если в теле try
попытка преобразования к числу была неудачной, и было выброшено исключение ValueError
, то поток выполнения программы отправляется в ветку except
и выполняет находящиеся здесь выражения, последнее из которых просит пользователя снова ввести данные.
После завершения except
снова проверяется логическое выражение в заголовке цикла. Оно даст True
, так как значение n по-прежнему строка.
Выход из цикла возможен только тогда, когда значение n будет успешно конвертировано в число.
Рассмотрим следующий пример:
total = 100 i = 0 while i < 5: n = int(input()) total = total - n i = i + 1 print("Осталось", total)
Сколько раз «прокрутится» цикл в этой программе, то есть сколько итераций он сделает? Ответ: 5.
Сначала переменная i равна 0. В заголовке цикла проверяется условие
i < 5
, и оно истинно. Тело цикла выполняется. В нем меняется значение i, путем добавления к нему единицы.Теперь переменная i равна 1. Это меньше пяти, и тело цикла выполняется второй раз. В нем i меняется, ее новое значение 2.
Два меньше пяти. Тело цикла выполняется третий раз. Значение i становится равным трем.
Три меньше пяти. На этой итерации i присваивается 4.
Четыре по прежнему меньше пяти. К i добавляется единица, и теперь ее значение равно пяти.
Далее начинается шестая итерация цикла. Происходит проверка условия i < 5
. Но поскольку теперь оно возвращает ложь, то выполнение цикла прерывается, и его тело не выполняется.
«Смысловая нагрузка» данного цикла – это последовательное вычитание из переменной total вводимых чисел. Переменная for
, который так и называется: «цикл со счетчиком». Его преимущество заключается в том, что в теле цикла не надо изменять переменную-счетчик, ее значение меняется автоматически в заголовке for
.
В языке Python тоже есть цикл for
. Но это не цикл со счетчиком. В Питоне он предназначен для перебора элементов последовательностей и других сложных объектов. Данный цикл и последовательности будут изучены в последующих уроках.
Для while
наличие счетчика не обязательно. Представим, что надо вводить числа, пока переменная total больше нуля. Тогда код будет выглядеть так:
total = 100 while total > 0: n = int(input()) total = total - n print("Ресурс исчерпан")
Сколько раз здесь выполнится цикл? Неизвестно, все зависит от вводимых значений. Поэтому у цикла со счетчиком известно количество итераций, а у цикла без счетчика – нет.
Самое главное для цикла while
– чтобы в его теле происходили изменения значений переменных, которые проверяются в его заголовке, и чтобы хоть когда-нибудь наступил случай, когда логическое выражение в заголовке возвращает False
. Иначе произойдет зацикливание.
Примечание 1. Не обязательно в выражениях total = total - n
и i = i + 1
повторять одну и ту же переменную. В Python допустим сокращенный способ записи подобных выражений: total -= n
и i += 1
.
Примечание 2. При использовании счетчика он не обязательно должен увеличиваться на единицу, а может изменяться в любую сторону на любое значение. Например, если надо вывести числа кратные пяти от 100 до 0, то изменение счетчика будет таким
, или i -= 5
.
Примечание 3. Для счетчика не обязательно использовать переменную с идентификатором i. Можно назвать переменную-счетчик как угодно. Однако так принято в программировании, что счетчики обозначают именами i и j (иногда одновременно требуются два счетчика).
Практическая работа
Измените последний код из урока так, чтобы переменная total не могла уйти в минус. Например, после предыдущих вычитаний ее значение стало равным 25. Пользователь вводит число 30. Однако программа не выполняет вычитание, а выводит сообщение о недопустимости операции, после чего осуществляет выход из цикла.
Используя цикл
while
, выведите на экран для числа 2 его степени от 0 до 20. Возведение в степень в Python обозначается как**
. Фрагмент вывода:... 32 64 128 256 512 1024 ...
Примеры решения и дополнительные уроки в android-приложении и pdf-версии курса
Цикл while в Python (неопределенная итерация) — Регина Баталова
Содержание- Цикл while
- Операторы Python break и continue
- Условный оператор else
- Бесконечные циклы
- Вложенные циклы while
- Однолинейные циклы while
- Вывод
Итерация — выполнение одного и того же блока кода снова и снова. Конструкция программирования, реализующая итерацию, называется циклом.
В программировании есть два типа итераций: неопределенные и определенные:
В этом уроке вы:
- Узнаете о цикле
while
, конструкции управления Python, используемой для неопределенной итерации - Узнаете, как преждевременно выйти из цикла или итерации цикла
- Исследуете бесконечные циклы
По окончании вы должны хорошо понимать, как использовать неопределенную итерацию в Python.
Цикл
while
Давайте посмотрим, как используется оператор while
для построения циклов в Python. Мы начнем с более простого и будем усложнять.
Характер элементарного цикла while
показан ниже:
while : <statement(s)>
statement(s)
представляет собой блок для многократного выполнения, часто называется телом цикла. Обозначается отступом, как в операторе if
.
Запомните: все конструкции управления в Python используют отступы для определения блоков.
Управляющая конструкция — expr
обычно включает в себя одну или несколько переменных, которые инициализируются до начала цикла, а затем изменяются где-то в теле цикла.
Когда встречается while
цикл, expr
сначала оценивается в логическом контексте. Если это правда, тело цикла выполняется. Затем expr
проверяется снова, и если это опять правда, то выполняется снова. Это продолжается до тех пор, пока expr
станет ложью, после чего выполнение программы переходит к первому оператору после тела цикла.
Рассмотрим этот цикл:
while < expr >: < statement(s) >
Вот что происходит в этом примере:
n
изначально равно 5. Выражение вwhile
заголовке оператораn > 0
имеет значение true, поэтому тело цикла выполняется. Внутри тела циклаn
уменьшается на 1 до 4 и затем печатается.- Когда тело цикла завершено, выполнение программы возвращается к началу цикла, и выражение проверяется снова. Оно все еще true, поэтому тело выполняется снова и 3 печатается.
- Это продолжается до тех пор, пока не
n
станет 0. В этот момент, когда выражение проверяется, оно ложно, и цикл завершается.
Обратите внимание, что управляющее выражение цикла while
проверяется первым, прежде чем еще что‑то произойдет. Если начинать с false, тело цикла не будет выполнено вообще:
n = 5 while n > 0: n -= 1 print(n)
В приведенном выше примере, когда встречается цикл, n
равно 0. Управляющее выражение n > 0
уже ложно, поэтому тело цикла никогда не выполнится.
Вот еще один while
цикл, включающий список, а не числовое сравнение:
a = ['foo', 'bar', 'baz'] while a: print(a.pop(-1))
Когда список оценивается в логическом контексте, он является истинным, если в нем есть элементы, и ложным, если он пуст. В этом примере a истинно, пока в нем есть элементы. После того, как все элементы будут удалены с помощью метода .pop ()
и список будет пуст, a примет значение «false», и цикл завершится.
Операторы Python
break
и continue
В каждом примере, который вы видели до этого, все тело while
цикла выполняется на каждой итерации. Python предоставляет два ключевых слова, которые преждевременно завершают итерацию цикла:
- Оператор break немедленно завершает цикл. Выполнение программы продолжается до первого оператора, следующего за телом цикла.
- Оператор continue немедленно завершает текущую итерацию цикла. В основном используется для пропуска итерации, или переходу к следующей итерации.
Различие между break
и continue
показано на рисунке:
Это файл скрипта с именем break.py
который демонстрирует работу оператора break
:
n = 5 while n > 0: n -= 1 if n == 2: break print(n) print('Цикл завершен.')
Запуск break.py
из интерпретатора командной строки приводит к следующему результату:
C:\Users\pythonguru\Documents>python break.py 4 3 Цикл завершен.
Когда n
станет равно 2, break оператор выполняется, цикл полностью завершается, и выполнение программы переходит к print()
оператору.
Следующий скрипт continue.py идентичен, за исключением continue оператора вместо break:
n = 5 while n > 0: n -= 1 if n == 2: continue print(n) print('Цикл завершен. ')
Вывод continue.py
выглядит так:
C:\Users\pythonguru\Documents>python continue.py 4 3 1 0 Цикл завершен.
На этот раз, когда n
равно 2, continue оператор вызывает завершение этой итерации.
Таким образом, 2 не печатается. Выполнение возвращается к началу цикла, условие переоценивается, и оно все еще выполняется. Цикл возобновляется, завершается, когда n
становится 0, как ранее.
Условный оператор
else
Python допускает необязательное наличие else
в конце цикла while
. Это уникальная особенность Python, не встречающаяся в большинстве других языков программирования. Синтаксис показан ниже:
while : <statement(s)> else: <additional_statement(s)>
additional_statement(s
, указанный в условии else
, будет выполняться , когда прервётся цикл while
.
У вас может возникнуть вопрос: «Чем это полезно?». Вы можете сделать то же самое, поместив эти операторы сразу после while
цикла, без else
:
while <expr>: <statement(s)> <additional_statement(s)>
Какая разница?
В последнем случае, без else
, additional_statement(s)
будет выполняться после завершения while цикла, несмотря ни на что.
Когда условия помещены в else
, они будут выполняться только в том случае, если цикл завершается «по истощению», то есть, если цикл повторяется до тех пор, пока условие управления не станет ложным. Если цикл завершается break
оператором, условие else
не будет выполнено.
Рассмотрим следующий пример:
n = 5 while n > 0: n -= 1 print(n) else: print('Цикл выполнен.')
В этом случае цикл повторялся до тех пор, пока условие не стало false: n стало 0, а условие n > 0 стало ложным. Поскольку цикл прожил свою естественную жизнь, так сказать, условие else
было выполнено. Теперь обратите внимание на разницу здесь:
n = 5 while n > 0: n -= 1 print(n) if n == 2: break else: print('Цикл выполнен.')
Этот цикл преждевременно завершается с помощью break
, поэтому else
не выполняется.
Может показаться, что значение слова else не совсем соответствует while
циклу, а также if
оператору. Гвидо ван Россумએ, создатель Python, сказал, что, если бы он начал сначала, то исключил бы условие else
цикла while
из языка.
Какая-нибудь из следующих интерпретаций может помочь сделать ее более понятной:
- Думайте о заголовке цикла (while n > 0) как об if операторе (if n > 0), который выполняется снова и снова, и
else
выполняется, когда условие становится false. - Думайте об
else
, как если бы это был nobreak, поскольку следующий блок выполняется, если не былbreak
.
Если вы не найдете ни одну из этих интерпретаций полезной, просто проигнорируйте их.
Когда может быть полезным else
в цикле while
? Одна распространенная ситуация, если вы ищете в списке определенный элемент. Вы можете использовать break
для выхода из цикла, если элемент найден, и else
может содержать код, который должен быть выполнен, если элемент не найден:
a = ['foo', 'bar', 'baz', 'qux'] s = 'corge' i = 0 while i < len(a): if a[i] == s: # Processing for item found break i += 1 else: # Processing for item not found print(s, 'not found in list.')
Примечание. Приведенный выше код полезен для иллюстрации концепции, но на самом деле вы вряд ли будете искать список таким образом.
Прежде всего, списки обычно обрабатываются с определенной итерацией, а не
while
циклом. Определенная итерация (for) рассматривается в следующем уроке.Во-вторых, Python предоставляет встроенные способы поиска элемента в списке. Вы можете использовать
in
оператор:if s in a: print(s, 'found in list.') else: print(s, 'not found in list.')
list.index()
метод также будет работать. Этот метод вызывает исключение ValueError, если элемент не найден в списке, поэтому для его использования необходимо понимать обработку исключений. В Python вы используетеtry
оператор для обработки исключения. Пример приведен ниже:try: print(a.index('corge')) except ValueError: print(s, 'not found in list.')Вы узнаете об обработке исключений позже.
Условие else
с циклом while
— это немного странное, редко встречающееся явление. Но не избегайте его, в некоторых ситуациях else
может внести ясность в ваш код!
Бесконечные циклы
Предположим, вы пишете while
цикл, который теоретически никогда не заканчивается. Звучит странно, не правда ли?
Рассмотрим этот пример:
while True: print('foo')
Этот код был завершен сочетанием Ctrl+C , которое вызывает прерывание с помощью клавиатуры.Или это продолжалось бы бесконечно.
Правда никогда не станет ложью, либо у нас всех очень большие проблемы. Таким образом, while
True положит начало бесконечного цикла, который теоретически будет работать вечно.
Возможно это не похоже на то, что вы хотели бы сделать, но на самом деле этот шаблон используется довольно часто. Например, вы можете написать код для службы, которая запускается и работает постоянно, принимая запросы на обслуживание. «постоянно» в этом контексте означает, что он работает пока вы не отключите его.
Говоря более прозаично, запомните, что циклы могут быть разорваны с помощью оператора break
. Возможно, намного проще будет завершить цикл на основе условий, распознанных в теле цикла, а не на условии, оцененном сверху.
Вот еще один вариант показанного выше цикла, который последовательно удаляет элементы из списка, .pop()
пока он не станет пустым:
a = ['foo', 'bar', 'baz'] while True: if not a: break print(a.pop(-1))
Когда a
становится пустым, not
a становится истинным, и break
оператор выходит из цикла.
Вы также можете указать несколько break операторов в цикле:
while True: if <expr1>: # One condition for loop termination break ... if <expr2>: # Another termination condition break ... if <expr3>: # Yet another break
В подобных случаях, когда есть несколько условий для завершения цикла, часто проще выйти с помощью break из нескольких разных мест, чем пытаться указать все условия завершения в заголовке цикла.
Бесконечные циклы могут быть очень полезны. Просто помните, что вы должны убедиться, что цикл действительно разорвался, чтобы он не стал бесконечным.
Вложенные циклы while
Управляющие конструкции Python могут быть вложены друг в друга. Например, условные операторы if/elif/else
могут быть вложенными:
if age < 18: if gender == 'M': print('son') else: print('daughter') elif age >= 18 and age < 65: if gender == 'M': print('father') else: print('mother') else: if gender == 'M': print('grandfather') else: print('grandmother')
Точно так же while
цикл может содержаться в другом while
цикле, как показано здесь:
a = ['foo', 'bar'] while len(a): print(a.pop(0)) b = ['baz', 'qux'] while len(b): print('>', b. pop(0))
Оператор break
или continue
, найденный во вложенных циклах, применяется к ближайшему охватывающему циклу:
while <expr1>: statement statement while <expr2>: statement statement break # Applies to while <expr2>: loop break # Applies to while e<xpr1>: loop
Кроме того, while циклы могут быть вложены в if/elif/else операторы, и наоборот:
if <expr>: statement while <expr>: statement statement else: while <expr>: statement statement statement
while <expr>: if <expr>: statement elif <expr>: statement else: statement if <expr>: statement
Фактически, все управляющие кострукции Python могут смешиваться друг с другом в любой степени, в какой вам угодно. Так и должно быть. Представьте, как было бы неприятно, если бы были ограничения, такие как «while
цикл не может быть заключен в if
оператор» или «while
циклы могут быть вложены друг в друга не более чем на четыре глубины». Вам было бы очень трудно помнить все.
Казалось бы, произвольные числовые или логические ограничения считаются признаком плохого дизайна программного языка. К счастью, в Python этого не много.
Однолинейные циклы
while
Как и в if
операторе, while
цикл может быть указан в одной строке. Если в блоке, составляющем тело цикла, есть несколько операторов, они могут быть разделены точкой с запятой (;):
n = 5 while n > 0: n -= 1; print(n)
Это работает только с простыми утверждениями, вы не сможете объединить два составных оператора в одну строку. Таким образом, вы можете указать while
цикл в одной строке, как указано выше, и пишете if
оператор в одной строке:
if True: print('foo')
Но вы не можете сделать так:
while n > 0: n -= 1; if True: print('foo')
Помните, что PEP 8препятствует нескольким утверждениям в одной строке. Поэтому, вам не желательно делать так очень часто.
Вывод
В этом блоке вы узнали о неопределенной итерации с помощью цикла Python while
. Теперь вы можете:
- Строить основные и сложные
while
циклы - Выполнить цикл с
break
иcontinue
- Использовать
else
сwhile
циклом - Разбираться с бесконечными циклами
Теперь вы должны хорошо понимать, как выполнить фрагмент кода повторно.
ОРИГИНАЛ СТАТЬИ
Цикл while в Python — как сделать, как остановить, бесконечный цикл, вложенные циклы
Содержание:развернуть
Использование циклов предоставляет программисту возможность многократного исполнения определенного участка кода. Это один из основных рабочих инструментов любого разработчика, и практически ни одна из существующих программ не обходится без него.
Циклы в языке Python представлены двумя основными конструкциями: while
и for
. Цикл while
считается универсальным, в то время как for
нужен для обхода последовательности поэлементно. Более подробную информацию о цикле for
вы можете прочитать здесь.
Так или иначе, обе конструкции одинаково применимы и являются важнейшими элементами любого высокоуровневого языка, в том числе и языка Python.
Как было отмечено выше,
Цикл — это управляющая конструкция, которая раз за разом выполняет серию команд (тело цикла) до тех пор, пока условие для выполнения является истинным.
Напишем на псевдокоде классическую схему:
повторять, пока условие
начало цикла
последовательность инструкций
конец цикла
Конструкция начинает свою работу с проверки условия, и, если оно истинно, запускается цикл. На каждой новой итерации (единичный проход по циклу) условие продолжения проверяется вновь. Таким образом, последовательность инструкций будет исполняться до тех пор, пока это условие, наконец, не окажется ложным.
Циклы, как механизм программирования, нужны, главным образом, для упрощения написания кода. Вполне очевидно, что создавать программу, выполняющую определённую операцию для каждой точки 4К дисплея в отсутствии циклов — это вручную повторять описание нужной команды 4096*2160 раз. 🤔 Много? Безусловно.
Применение в этой задаче всего одного цикла позволит сократить длину кода, как минимум, на 6 порядков. А если представить, что ту же самую программу нужно переписать для 8К монитора, то, вместо изменения всего одной инструкции в счетчике цикла, вам придётся дописывать ещё пару десятков миллионов строк кода, что является попросту недопустимым по своей величине и трудозатратам объёмом.
Польза циклов ясна и очевидна. Обладая мощной выразительностью и ёмкой натурой, они, без сомнений, являются одним из фундаментальных конструктов высокоуровневого программирования. Каждому разработчику необходимо знать и понимать принципы их работы.
Синтаксис цикла while
В самом простом случае, цикл while
в python очень похож по своей структуре на условную конструкцию с if
:
import time
a = 1
if a == 1:
print("I'm the condition")
while a == 1:
print("I'm the loop")
time. sleep(1)
И в том и в другом случае, блок кода внутри (инструкция print(‘…’)
) будет исполнен тогда и только тогда, когда условие (a == 1)
будет иметь значение True
. Вот только в конструкции с if
, при успешной проверке, вывод на экран будет выполнен всего один раз, а в случае с while
фраза «I’m the loop» будет печататься бесконечно.
Такое явление называется бесконечным циклом. У них есть свои определенные смысл и польза, но их мы разберём чуть позже, поскольку чаще всего цикл всё-таки должен как-то заканчиваться. И вполне логично, что для его завершения нужно произвести определенные манипуляции с условием.
Переменная a
, в примере выше, называется управляющей (или счетчик). При помощи таких переменных можно контролировать момент выхода из цикла. Для этого их следует сравнить с каким-либо значением.
count = 1 # фиксируем начальное значение
while count <= 10: # и конечное (включительно)
print(count, end=' ')
count += 1
# после 9-й итерации в count будет храниться значение 10
# это удовлетворяет условию count <= 10, поэтому на 10-м витке будет выведено число 10
# (как видно, значение счетчика печатается до его инкрементирования)
# после count станет равным 11, а, значит, следующий прогон цикла не состоится, и он будет прерван
# в итоге получаем:
> 1 2 3 4 5 6 7 8 9 10
В Python есть и более сложные, составные условия. Они могут быть сколь угодно длинными, а в их записи используются логические операторы (not
, and
, or
):
dayoff = False
sunrise = 6
sunset = 18
worktime = 12
# пример составного условия
while not dayoff and sunrise <= worktime <= sunset:
if sunset == worktime:
print("Finally it's over!")
else:
print('You have ', sunset - worktime, ' hours to work')
worktime += 1
>
You have 6 hours to work
You have 5 hours to work
You have 4 hours to work
You have 3 hours to work
You have 2 hours to work
You have 1 hours to work
Finally it's over!
Как можно заметить, управляющая переменная вовсе не обязана являться счётчиком. Она может быть просто логической переменной, чье значение изменяется где-то в самом цикле:
num = 0
control = True
while num < 10:
num += 1
# аналогичная запись
num = 0
control = True
while control:
if num == 10:
control = False
num += 1
Стоит иметь в виду, что использование неинициализированной переменной в качестве управляющей цикла обязательно приведёт к возникновению ошибки:
# unknown до этого нигде не была объявлена
while unknown:
print('+')
>
Traceback (most recent call last):
while unknown:
NameError: name 'unknown' is not defined
Несколько примеров использования цикла while
Идея циклов while
проста — требуется определенное количество раз сделать что-то? Заведи счётчик и уменьшай/увеличивай его в теле цикла.
x = 20
y = 30
while x < y:
print(x, end=' ')
x = x + 3
> 20 23 26 29
Своеобразным счётчиком может быть даже строка:
word = "pythonchik"
while word:
print(word, end=" ")
# на каждой итерации убираем символ с конца
word = word[:-1]
> pythonchik pythonchi pythonch pythonc python pytho pyth pyt py p
break и continue
Оператор break
заставляет интерпретатор прервать выполнение цикла и перейти к следующей за ним инструкции:
counter = 0
while True:
if counter == 10:
break
counter += 1
Цикл прервётся после того, как значение счетчика дойдёт до десяти.
Существует похожий оператор под названием continue
, однако он не прекращает выполнение всей конструкции, а прерывает лишь текущую итерацию, переходя затем в начало цикла:
# классический пример вывода одних лишь чётных значений
z = 10
while z:
z -= 1
if z % 2 != 0:
continue
print(z, end=" ")
> 8 6 4 2 0
Эти операторы бывают весьма удобны, однако плохой практикой считается написание кода, который чересчур ими перегружен.
else
В Python-циклах часть else
выполняется лишь тогда, когда цикл отработал, не будучи прерван break
-ом.
В реальной практике, else
в циклах применяется нечасто. Такая конструкция отлично сработает, когда будет необходимо проверить факт выполнения всех итераций цикла.
👉 Пример из практики: проверка доступности всех выбранных узлов сети
Например, обойти все узлы локальной сети и
def print_prime_list(list_of_numbers: list) -> None:
""" функция выведет список чисел,
если каждое из этих чисел является простым """
number_count = len(list_of_numbers) # количество чисел
i = 0
while i < number_count:
x = list_of_numbers[i] // 2
if x != 0 and list_of_numbers[i] % x == 0:
break
i += 1
else:
print(f'{list_of_numbers} - list is prime!')
print_prime_list([11, 100, 199]) # 100 - не простое число
>
print_prime_list([11, 113, 199])
> [11, 113, 199]
В каком-либо другом языке стоило бы завести булеву переменную, в которой хранится результат проверки, но у Python, как всегда, есть способ получше!
while true или бесконечный цикл
В большинстве случаев, бесконечные циклы появляются из-за логических ошибок программиста (например, когда условие цикла while
при любых вариантах равно True
). Поэтому следует внимательно следить за условием, при котором цикл будет завершаться.
Однако вы некоторых случая бесконечный цикл делают намерено:
- Если нужно производить какие-то действия с интервалом, и выходить из цикла лишь в том случае, когда внутри тела «зашито» условие выхода. Пример: функция, которая возвращает
connection
базы данных. Если связь с базой данных отсутствует, соединение будет пытаться (в цикле) установиться до тех пор, пока не установится. - Если вы пишете полноценный демон, который продолжительное время висит как процесс в системе и периодически производит какие-то действия. В таком случае остановкой цикла будет прерывание работы программы. Пример: скрипт, который раз в 10 минут «пингует» IP адреса и пишет в лог отчет о доступности этих адресов.
💁♂️ Совет: в бесконечных циклах рекомендуется ставить таймаут выполнения после каждой итерации, иначе вы очень сильно нагрузите CPU
:
import time
while True:
print("Бесконечный цикл")
time. Ctrl
+ C
. Иначе цикл продолжался бы бесконечно.
Best practice
Цикл while в одну строку
Для составных конструкций (таких, где нужен блок с отступом), можно этот отступ убрать, но только если в блоке используются простые операторы. Отделяются они всё также двоеточием.
Например, записи:
while x < y:
x +=1
# и
while x < y: x += 1
будут считаться эквивалентными, и при чтении второй из них интерпретатор не будет выдавать ошибку.
Вложенные циклы
Вложенные while
циклы встречаются не так часто, как их братья (или сестры) for
, что, однако не мешает им быть полезными. Простой пример — выведем на экран таблицу умножения:
q = 1
while q <= 9:
w = 1
while w <= 9:
print(q * w, end=" ")
w += 1
q += 1
print("")
>
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
Нет никаких проблем с использованием вложенных циклов while
, однако стоит иметь в виду, что вложения свыше третьего уровня будут уже практически нечитаемыми для человека.
Как выйти с помощью break из двух циклов
В случае вложенных циклов, оператор break
завершает работу только того цикла, внутри которого он был вызван:
i = 100
j = 200
while i < 105:
while j < 205:
if j == 203:
break
print('J', j)
j += 1
print('I', i)
i += 1
>
J 200
J 201
J 202
# здесь видно, что внутренний цикл прерывается, но внешний продолжает работу
I 100
I 101
I 102
I 103
I 104
В Python не существует конструкций, которая прерывала бы сразу несколько циклов. Но есть как минимум 3 способа, которыми можно реализовать данное поведение:
Способ №1
Используем конструкцию for ... else ...
:
def same_values_exists(list_1: list, list_2: list) -> None:
""" функция выводит на экран
первые совпавшие числа из списков """
for i in list_1:
for j in list_2:
print("compare: ", i, j)
if i == j:
print(f"found {i}")
break
else:
continue
break
same_values_exists([0, 10, -2, 23], [-2, 2])
>
compare: 0 -2
compare: 0 2
compare: 10 -2
compare: 10 2
compare: -2 -2
found -2
Если все итерации вложенного цикла сработают, выполнится else
, который скажет внешнему циклу продолжить выполнение. Если во внутреннем цикле сработает break
, сразу выполнится второй break
.
Способ №2 Через создание дополнительного флага:
def same_values_exists(list_1: list, list_2: list) -> None:
""" функция выводит на экран
первые совпавшие числа из списков """
break_the_loop = False
for i in list_1:
for j in list_2:
print("compare: ", i, j)
if i == j:
print(f"found {i}")
break_the_loop = True
break
if break_the_loop:
break
same_values_exists([0, 10, -2, 23], [-2, 2])
>
compare: 0 -2
compare: 0 2
compare: 10 -2
compare: 10 2
compare: -2 -2
found -2
Внешний цикл был прерван вслед за внутренним. Дело сделано!
Способ №3
Если циклы находятся в функции (как в нашем примере), достаточно просто сделать return
:
def same_values_exists(list_1: list, list_2: list) -> None:
""" функция выводит на экран
первые совпавшие числа из списков """
for i in list_1:
for j in list_2:
print("compare: ", i, j)
if i == j:
print(f"found {i}")
return
same_values_exists([0, 10, -2, 23], [-2, 2])
>
compare: 0 -2
compare: 0 2
compare: 10 -2
compare: 10 2
compare: -2 -2
found -2
—
Циклы for, while в Python
Автор Даниил Полянский На чтение 10 мин Просмотров 488 Опубликовано Обновлено
В статье разбираем циклы for, while в Python, использование функций range() и enumerate()
Содержание
- Что такое циклы в Python: зачем они нужны
- Цикл for: синтаксис
- Использование функций range() и enumerate()
- Вложенный цикл
- Цикл while
- Бесконечный цикл while
- Операторы break, continue и pass в python
- Оператор else
- Заключение
Что такое циклы в Python: зачем они нужны
Итак, термин «цикл» часто встречается в обычной жизни.
Сутки, дни недели, времена года, даже года – это своеобразные представители циклов.
Даже существует выражение «зациклиться на чем-то», что означает бесконечное занятие одной и той же деятельностью. Возвращаясь к теме, в python цикл имеет похожее значение.
Если придерживаться более строгой формулировки, то цикл в python – это блок кода, повторяющийся некоторое (а порой и бесконечное) количество раз.
Если при решении задачи появляется необходимость последовательно произвести одну и ту же операцию несколько раз, например, суммировать каждое значение в списке или отдельно проверить каждый символ в строке, то для этого и используются циклы.
Но зачем использовать цикл, если он только повторяет уже существующие команды, ведь проще вручную перебрать все элементы без этих излишеств. Нет, не проще, докажем это на примере, пока не связанном с программированием.
Допустим, вы решили перебрать старые вещи и достали все коробки с чулана. Теперь необходимо построить алгоритм проверки коробок.
Алгоритм без цикла (они называются линейными):
- Открыть коробку №1.
- Проверить ее содержимое.
- Перейти к коробке №2.
- Проверить ее содержимое.
- Перейти к короб. №3.
- Проверить ее содержимое.
Только первые три коробки, а уже столько заморочек. В жизни бы вы их не заметили, а вот компьютеру придется объяснять все дословно, если только не воспользоваться циклическим алгоритмом.
С ним все выглядело бы так:
- Текущая коробка (n) = 1.
- Открыть коробку № n.
- Проверить ее содержимое.
- Если ящики не закончились, то увеличить n на один, а после вернуться к пункту 2.
- Иначе закончить поиск.
Заметьте, с таким алгоритмом пользователь может проверить бесконечное множество коробок, а количество команд так и останется равным пяти.
Разве такой результат можно получить с помощью линейного алгоритма, а не циклического? Конечно, нет. Надеемся, что вы поняли основное преимущество циклов. Однако, в python, помимо основного преимущества существуют и дополнительные плюсы.
- Задачи с коробками отлично подходят, чтобы понять суть переменных и циклов
Например, с помощью цикла for разработчик может автоматически перебрать все элементы строки, не обращаясь по индексу к каждому из них. А через while легко реализуется «ловушка» в алгоритме, из которой пользователь не сможет выбраться, пока не выполнит нужные действия, например, не введет правильный пароль, чтобы продолжить работу. Впрочем, обо всем по порядку.
Цикл for: синтаксис
Как вы уже поняли, в питоне существует несколько типов циклов, один из них – это for. Цикл for часто используется для перебора значений внутри структурной переменной. Это позволяет обращаться сразу к элементу, а не к его индексу или ключу (предполагается, что читатель уже знает о списках и словарях).
Синтаксис конструкции for в python выглядит следующим образом:
for i in variable:
#some code
Разберем каждую команду отдельно.
For – это ключевое слово, которое говорит интерпретатору, что ниже будет цикл. i – это переменная, в которую будут помещаться временные значения для перебора. in – это еще одно ключевое слово, которое говорит интерпретатору, из какой переменной брать значения для i.
Вместо variable разработчик указывает структурную переменную, из которой необходимо брать переменные (то есть in указывает на variable). Знак двоеточия сообщает о начале нового блока. Все операторы внутри блока должны начинаться с одинарного отступа или 4 знаков пробелов.
Важно, нельзя комбинировать пробелы и отступы в одном блоке кода, да и во всем коде.
- Наглядное обозначение синтасиса
Попробуем с помощью полученных знаний решить задачу с коробками. Представьте, что вместо коробок используется список со значениями.
На языке python это будет выглядеть следующим образом:
boxes = ["текстиль", "старые игрушки", "посуда", "радиодетали", "зимние вещи", "фотографии"] # список с вещами <p>print("среди боксов были найдены следующие вещи:") # операция вне цикла, которая выполнится один раз for i in boxes: print(i) # операция в цикле, которая выполнится столько раз, сколько значений в переменной boxes print("Это весь список") # операция, которая выполнится один раз после завершения списка
Результат выполнения программы вы можете увидеть на скриншоте ниже
Результат выполнения программы
Использование функций range() и enumerate()
Однако иногда нет необходимости перебирать списки, а только выполнить код указанное количество раз. В таком случае на помощь приходит функция range, которая генерирует последовательность чисел в указанном диапазоне с заданным шагом.
Рассмотрим пример:
counter = int(input("Ну сколько раз еще нужно сказать \"ну пожалуйста\", чтобы вы согласились:")) for i in range(0, counter): print ("ну пожалуйста!", sep=" ") print("А теперь вы согласитесь?")
Теперь эта программа будет выводить сообщение столько раз, сколько введет пользователь. Это удобно, когда нужно получить только число. Теперь перейдем к функции enumerate.
Она, в отличие от range, принимает в качестве аргумента список, а после возвращает список кортежей, где каждый кортеж состоит из двух значений: индекс элемента и его значение.
Пока непонятно, где на практике может понадобиться такая возможность, но главное, что она есть.
Реализация:
example = ["-", "кило", "мега", "гига", "тера", "пета"] print("приставки к единицам измерения в информатике:") for k, i in enumerate(example): # в k будет храниться индекс, а в i значение print(k, ":", i)Результат программы ожидаем.
Вложенный цикл
Довольно часто возникает необходимость создавать несколько вложенных циклов. Самое забавное, что начинающие разработчики упрямо избегают таких ситуаций, потому что считают такой код непонятным.
На самом деле, это не так, например, те же алгоритмы сортировки реализуются с помощью вложенных циклов, но сейчас не об этом.
Чтобы создать вложенную конструкцию, достаточно еще раз указать ключевое слово for, открыть новый блок с помощью знака двоеточия, а после писать все конструкции с уже с двойным отступом. То есть, два вложенных цикла – два отступа, три – три отступа и так далее.
Пример вложенности:
strings = ["Утро","День","Вечер", "Ночь"] for i in strings: # в i помещается отдельный элемент из списка for z in i: # в z помещается отдельный символ из элемента, полученного в цикле выше print(z, sep = " ") print("\n")На каждый уровень блока – отдельный отступ
Цикл while
Для тех, кто пришел из других языков, конструкция for покажется новой диковиной. В си-подобных языках, например, такой роскоши, как автоматический перебор элементов, нет.
В принципе, конструкции, которые упрощают какие-то процессы, но не добавляют ничего нового, называются «синтаксическим сахаром». А вот while – это уже не «сахар», а незаменимая конструкция, которая, в отличие от for, позволяет делать не только циклы с определенным количеством повторений, но и циклы с условиями и даже бесконечные (python от такого не защищен).
Синтаксис конструкции:
while (condition):
#code
Пока истинно условие (condition), будет выполняться код внутри блока. Может выйти так, что цикл не выполнится ни разу, если условия заведомо ложное.
Блок-схема whileДавайте рассмотрим три примера.
Пример с обычным условием:
numbers = [2,6,7,9,13,18,24,32,52,55,60,61,66,70,71,77,80,100] #список чисел x = 0 # счетчик, по нему можно обратиться к элементу списка while (numbers[x] <= 70): # выполнять, если (или пока) текущий элемент меньше 70 print(numbers[x]) # вывести текущий элемент x+=1 # увеличить индекс, чтобы перейти к следующему элементу
Программа выведет все числа до 70, а вот 71, 77 и т. д. не выведутся, так как они не соответствуют условию внутри while.
Пример с заведомо ложным условием:
while (5 == 2): print("YES")
Пять никогда не равен двум (не в этой вселенной), а потому условие заведомо ложное, блок внутри не выполнится ни разу.
Пример с всегда истинным условием:
while (5 == 5): print("YES")
А вот эта программа, наоборот, зациклится и не закончится, ведь пока условие истинно, цикл не остановится. Будьте осторожны, бесконечные циклы – это частая проблема в коде, которую трудно найти.
Небольшая шпаргалкаБесконечный цикл while
Отдельно остановимся на этой теме. Некоторые считают, что такие зацикливания – это сплошные недостатки. Однако, даже их иногда можно использовать. Например, разработчик пишет программу, запрашивающую пароль.
Так вот, чтобы не пускать пользователя дальше, пока тот не введет пароль, можно использовать как раз такие бесконечные циклы.
Реализация:
correct_password = "qwerty123" user_password = "" while (True): # условие заведомо постоянно истинно user_password = input("введите пароль:") if (user_password == correct_password): break print("Неверный пароль")Вот она — бесконечность
Несмотря на то, что цикл бесконечный, выбраться из него можно, введя правильный пароль. Правильность проверяет вложенное условие, которое может прервать цикл ключевым словом break. О нем читайте ниже.
Результат выполнения программыОператоры break, continue и pass в python
В python существует три ключевых слова, которые могут повлиять на поведение циклов.
Первый из них – это break. Когда вы указываете в блоке кода break, то он автоматически прерывает выполнение текущей итерации и реализует выход из цикла. Пример вы могли увидеть выше.
Continue, в отличие от break, прерывает текущую итерацию, но возвращается обратно в начало цикла и переходит к следующей итерации, а не прерывает его. Это полезно, если есть случаи, которые не надо рассматривать.
Пример программы, которая переписывает введенный текст, но без запятых:
word = "это предложение, чтобы показать работу continue,,," for i in word: if(i == ","): # если запятая, то перейти к следующему элементу continue print(i, end = "")
На выходе пользователь получит только «это предложение чтобы показать работу continue». И, наконец, pass. Это слово не играет практической роли на итоговом этапе разработки, а нужно только при тестировании.
Если создать пустой цикл, то появится ошибка синтаксиса (а точнее отступов). Если создать его, а после добавить слово «pass», то все будет работать. Подытоживая, pass – это своего рода слово-пустышка для заполнения кода.
Небольшая шпаргалкаОператор else
Помните, в условиях мы использовали else, чтобы указать действия, выполняемые в противном случае. Так вот, в питоне похожая роль и у else в for и while.
Else необходимо, если нужно выполнить какие-то действия только в том случае, если цикл был завершен «естественным» образом, а не через break.
Реализация:
rates = [5,5,3,5, 6, 5] for i in rates: if(i > 5 or i < 2): print("В списке есть некорректная оценка") break else: print("Проверен весь список, ошибок нет")
Теперь else будет работать только в том случае, если цикл не будет прерываться break-ом. В этом примере, к слову, прерывание будет, а потому вывод из else не сработает. Попробуйте убрать 6 из списка, чтобы исправить ситуацию.
Заключение
Когда я впервые познакомился с циклами (а было это еще на C++), я решил, что это бесполезная вещь, ведь проще вводить команды отдельно, а не думать над условиями для циклических алгоритмов. Так вот, новичков, возможно, посещают похожие мысли. Со временем это пройдет, когда проекты станут более серьезными, а лаконичность кода выйдет на передний план. А на этом у нас все, благодарим за прочтение.
Python с нуля — часть 5: циклы – цикл while
Python с нуля — часть 5: циклы – цикл whileЦикл while
в Python будет выполнять заданное выражение или блок кода до тех пор, пока заданное условие будет считаться истиной (true).
Синтаксис
Синтаксис цикла while
в Python такой:
while условие: действие(я)
Тут действие(я) могут быть либо одним выражением, или набором выражений – блоком кода. Условие можно быть любым выражением, а условие будет считаться истиной (true), если результат не равен нулю или не пустой. Цикл будет выполняться пока условие будет считаться истиной.
Когда условие будет считаться как ложь (false) – программа передаст выполнение следующему после цикла участку кода.
В Python все выражения, имеющие одинаковые отступы в одной конструкции будет считаться единым блоком кода.
Ключевым моментом цикла while
является то, что он может вообще не быть запущен при выполнении программы. Если выражение проверено и его результат – ложь, то всё тело цикла будет пропущено, и будет выполнено следующее после цикла выражение.
Пример
count = 0 while (count < 9): print 'The count is:', count count = count + 1 print "Good bye!"
Результат выполнения:
The count is: 0 The count is: 1 The count is: 2 The count is: 3 The count is: 4 The count is: 5 The count is: 6 The count is: 7 The count is: 8 Good bye!
Бесконечный цикл while
Цикл становится бесконечным если условие никогда не станет ложью – поэтому вы должны относиться с вниманием к циклам, в которых используется while
. CTraceback (most recent call last):
File «./1.py», line 5, in <module>
num = raw_input(«Enter a number :»)
KeyboardInterrupt
В этом примере будет выполняться бесконечный цикл, пока вы не нажмёте комбинацию Ctrl+C, что бы прервать выполнение программы.
Использование оператора else с циклом while
В Python допустимо использование оператора else
, связанного с циклом:
- если оператор
else
используется с цикломfor
– он будет выполнен, когда список для цикла будет завершен; - при использовании
else
вместе с цикломwhile
– он будет использован, когда условие примет значение ложь (false).
В следующем примере демонстрирует ся использование оператора else
с циклом while
, который выводит сообщение до тех пор, пока счётчик меньше 5, после чего будет выполнение действие оператора else
:
count = 0 while count < 5: print count, " is less than 5" count = count + 1 else: print count, " is not less than 5"
Результат его выполнения:
0 is less than 5 1 is less than 5 2 is less than 5 3 is less than 5 4 is less than 5 5 is not less than 5
Цикл while с одним выражением
По аналогии с оператором if
– если цикл while
содержит единственное действие, то оно может быть помещено в той же строке:
flag = 1 while (flag): print 'Given flag is really true!' print "Good bye!"
24 059 views
More results. ..
Exact matches only
Exact matches only
Search in title
Search in title
Search in content
Search in content
Search in excerpt
Hidden
Hidden
Navigation
aСамое читаемое
- CentOS: установка, настройка Zabbix-agent и добавление нового хоста в мониторинг — 507 139 views
- MySQL/MariaDB: наиболее используемые команды, примеры — 289 161 views
- BASH: описание циклов for, while, until и примеры использования — 152 185 views
- Команда find и её опции в примерах — 139 563 views
- Карта сайта — 126 944 views
Архив месяца
Пн | Вт | Ср | Чт | Пт | Сб | Вс |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 |
Архивы по годам
Архивы по годам Выберите месяц Сентябрь 2022 (1) Июнь 2022 (1) Май 2022 (1) Апрель 2022 (1) Март 2022 (2) Январь 2022 (1) Декабрь 2021 (3) Ноябрь 2021 (8) Октябрь 2021 (4) Сентябрь 2021 (5) Август 2021 (5) Июль 2021 (6) Июнь 2021 (6) Май 2021 (6) Апрель 2021 (11) Март 2021 (8) Февраль 2021 (6) Январь 2021 (1) Декабрь 2020 (1) Ноябрь 2020 (9) Октябрь 2020 (9) Сентябрь 2020 (4) Август 2020 (8) Июль 2020 (4) Июнь 2020 (3) Май 2020 (5) Апрель 2020 (9) Март 2020 (8) Февраль 2020 (9) Январь 2020 (2) Декабрь 2019 (9) Ноябрь 2019 (9) Октябрь 2019 (11) Сентябрь 2019 (11) Август 2019 (10) Июль 2019 (2) Июнь 2019 (4) Май 2019 (9) Апрель 2019 (13) Март 2019 (32) Февраль 2019 (20) Январь 2019 (10) Декабрь 2018 (9) Ноябрь 2018 (12) Октябрь 2018 (15) Сентябрь 2018 (12) Август 2018 (14) Июль 2018 (17) Июнь 2018 (18) Май 2018 (21) Апрель 2018 (6) Март 2018 (18) Февраль 2018 (7) Январь 2018 (13) Декабрь 2017 (14) Ноябрь 2017 (6) Октябрь 2017 (24) Сентябрь 2017 (13) Август 2017 (15) Июль 2017 (11) Июнь 2017 (11) Май 2017 (11) Апрель 2017 (7) Март 2017 (18) Февраль 2017 (13) Январь 2017 (14) Декабрь 2016 (12) Ноябрь 2016 (15) Октябрь 2016 (13) Сентябрь 2016 (21) Август 2016 (19) Июль 2016 (14) Июнь 2016 (8) Май 2016 (24) Апрель 2016 (15) Март 2016 (19) Февраль 2016 (21) Январь 2016 (19) Декабрь 2015 (17) Ноябрь 2015 (17) Октябрь 2015 (14) Сентябрь 2015 (13) Август 2015 (1) Июль 2015 (20) Июнь 2015 (23) Май 2015 (26) Апрель 2015 (28) Март 2015 (30) Февраль 2015 (26) Январь 2015 (24) Декабрь 2014 (31) Ноябрь 2014 (21) Октябрь 2014 (28) Сентябрь 2014 (23) Август 2014 (31) Июль 2014 (23) Июнь 2014 (11) Май 2014 (14) Апрель 2014 (8) Март 2014 (11) Февраль 2014 (11) Январь 2014 (11) Декабрь 2013 (12) Ноябрь 2013 (23) Октябрь 2013 (20) Сентябрь 2013 (30) Август 2013 (20) Июль 2013 (6) Июнь 2013 (9) Май 2013 (5) Апрель 2013 (13) Март 2013 (22) Февраль 2013 (36) Январь 2013 (10) Декабрь 2012 (4) Ноябрь 2012 (8) Октябрь 2012 (13) Сентябрь 2012 (29) Август 2012 (24) Июль 2012 (18) Июнь 2012 (2) Май 2012 (4) Март 2012 (5) Февраль 2012 (5) Январь 2012 (25) Декабрь 2011 (15) Ноябрь 2011 (6) Август 2011 (13)Iconic One Theme | Powered by WordPress
Подробный разбор цикла while в Python
Цикл — это некий набор инструкций. Он выполняется до тех пор, пока его условие истинно. Давайте разберемся, как работает цикл while
в Python.
Что такое цикл?
Циклы — фундаментальное понятие в программировании. Если вы новичок, то обязаны в них разобраться. Циклы могут помочь выполнять набор инструкций до тех пор, пока заданное условие истинно.
В Python есть два основных вида циклов:
- Цикл for.
- Цикл while.
Они очень похожи друг на друга. Но если вы хотите писать по-настоящему быстрый код, вам нужно научиться грамотно выбирать нужный цикл.
Цикл while
Суть работы цикла while
очень проста. Работает он так: ваши инструкции выполняются, пока условие истинно.
Цикл while
проверяет условие перед каждой итерацией цикла. Если возвращается True
, то выполняется блок кода внутри цикла.
Прежде чем мы возьмемся за написание кода, взгляните на блок-схему. Работает цикл следующим образом:
А теперь напишем небольшую программу. Это простой цикл, выводящий в консоль числа от 1 до 10.
x = 1 while x <= 10: print(x) x = x+1
Как вы можете заметить, тело цикла выполняется, пока x
меньше или равно 10. Если вы присвоите x
значение 20, то цикл не запустится вообще.
Вывод будет следующим:
1 2 3 4 5 6 7 8 9 10
Цикл do-while
Есть две вариации цикла while
. Первая — непосредственно сам while
, вторая — do-while
. Разница заключается в том, что do-while запустится хотя бы один раз.
Цикл while
может не запуститься вообще, если условие не будет истинным изначально. Do-while
— напротив. Тут сначала выполняется тело цикла, и только потом происходит проверка условия.
Цикл do-while
реализован в большинстве языков программирования, но в Python такого оператора нет. Тем не менее, его можно с легкостью имитировать — например, с помощью функций.
Давайте напишем код, имитирующий цикл do-while
. Все нужные инструкции мы поместим внутри функции.
x = 20 def run_commands(x): print(x) run_commands(x) x += 1 while x <= 10: run_commands(x) x += 1
Эта программа запускает run_commands()
еще до цикла while
. Но сам цикл while
не запустится: x
равен 20.
Оператор else
Если вы хотите выполнить блок кода, когда проверка условия возвращает False
, — добавьте оператор else
.
Добавим в наш код else
. Внутри этого блока напишем код, который будет выводить в консоль Готово
. Выполнится этот блок только после того, как в консоль выведутся числа от 1 до 10.
x = 1 while x <= 10: print(x) x = x + 1 else: print("Готово")
Эта программа выведет в консоль числа от 1 до 10. Как только x
станет равно 11, результатом проверки условия будет False
. После этого выполнится блок кода else
.
Однострочное объявление while
Если внутри цикла while
у вас только одна строка — можно воспользоваться однострочным вариантом. Делается это так:
x = 1 while x: print(x)
Будьте осторожны — этот цикл бесконечный.
Бесконечные циклы
Если вы не будете осторожны, то можете случайно написать бесконечный цикл. Проверка условия бесконечного цикла всегда будет возвращать True
. Пример бесконечного цикла:
x = 1 while x >= 1: print(x)
Этот цикл — бесконечный. Внутри цикла нет команды, которая изменяет значение x
. Поэтому условие x >= 1
всегда истинно. Именно из-за этого цикл будет запускаться бесконечное количество раз.
Всегда будьте внимательны, когда создаете цикл. Небольшая ошибка — и у вас бесконечный цикл, что в конечном итоге приведет к сбою в работе программы.
Управление циклом
С циклом разобрались. Наконец мы можем перейти к операторам его управления.
Когда вы начнете работать в реальных проектах, вы будете сталкиваться с разными ситуациями. Например, когда нужно добавить условие, выполнение которого завершит цикл или пропустит итерацию.
Break
Этот оператор позволяет завершить цикл, если проверка условия возвращает True
.
x = 1 while x <= 10: if x == 5: break print(x) x += 1
Вывод:
1 2 3 4
Выполнение цикла прекращается, когда x становится равно 5 — даже если x
больше или равно 1.
Continue
Допустим, вам нужно пропустить итерацию цикла, если выполняется какое-то условие. Но цикл вы не хотите завершать до тех пор, пока проверка его условия не вернет False
.
В этом случае вам нужно использовать ключевое слово continue
:
x = 1 while x <= 10: if x == 5: x += 1 continue print(x) x += 1
Вывод:
1 2 3 4 6 7 8 9 10
Как видите, цикл выводит в консоль все числа от 1 до 10 кроме 5. Когда x
становится равен 5, оставшаяся часть команд не выполняется, а начинается следующая итерация цикла.
Английский для программистов
Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас
Скачать
×
Python для циклов
❮ Предыдущая Далее ❯
Python For Loops
Цикл for используется для перебора последовательности (то есть списка, кортежа, словарь, набор или строка).
Это меньше похоже на ключевое слово for в других языках программирования и работает больше как метод итератора, который можно найти в других объектно-ориентированных языках программирования.
С помощью цикла for мы можем выполнить набор операторов, по одному разу для каждого элемента списка, кортежа, набора и т. д.
Пример
Вывести каждый фрукт в списке фруктов:
фрукты = [«яблоко», «банан», «вишня»]
для
х во фруктах:
print(x)
Попробуйте сами »
Цикл for не требует предварительной установки индексирующей переменной.
Цикл по строке
Четные строки являются повторяемыми объектами, они содержат последовательность символов:
Пример
Цикл по буквам в слове «банан»:
вместо x в «банане»:
print(x)
Попробуйте сами »
Оператор break
С помощью оператора break мы можем остановить выполнить цикл до того, как будут пройдены все элементы:
Пример
Выйти из цикла, когда x
будет «банан»:
фрукты = [«яблоко», «банан», «вишня»]
вместо x в фруктах:
печать(х)
если х ==
«banana»:
break
Попробуйте сами »
Пример
Выход из цикла, когда x
это «банан»,
но на этот раз разрыв наступает перед печатью:
фрукты = [«яблоко», «банан», «вишня»]
for x in fruit:
if x ==
«banana»:
break
print(x)
Попробуйте сами »
Оператор continue
С помощью оператора continue мы можем остановить текущая итерация цикла и продолжить со следующей:
Пример
Не печатать банан:
фрукты = [«яблоко», «банан», «вишня»]
для x во фруктах:
, если x ==
«банан»:
продолжить
print(x)
Попробуйте сами »
Функция range()
Чтобы перебрать набор кода заданное количество раз, мы можем использовать функцию range(),
Функция range() возвращает последовательность чисел, начиная с 0 по умолчанию и увеличиваясь на 1 (по умолчанию), и заканчивая указанным числом.
Пример
Использование функции range():
для x в диапазоне(6):
print(x)
Попробуйте сами »
Обратите внимание, что range(6) — это не значения от 0 до 6, а значения от 0 до 5.
Функция range() по умолчанию принимает значение 0 в качестве начального значения можно указать начальное значение, добавив параметр: диапазон (2, 6), который означает значения от 2 до 6 (но не включая 6):
Пример
Использование начального параметра:
для x в диапазоне (2, 6):
print(x)
Попробуйте сами »
По умолчанию функция range() увеличивает последовательность на 1, однако можно указать значение приращения, добавив третий параметр: диапазон (2, 30, 3 ):
Пример
Увеличение последовательности на 3 (по умолчанию 1):
для x в диапазоне (2, 30, 3):
print(x)
Попробуйте сами »
Else в цикле For
Ключевое слово else
в
Цикл for
определяет блок кода, который будет
выполняется после завершения цикла:
Пример
Вывести все числа от 0 до 5 и вывести сообщение после завершения цикла:
для x в диапазоне (6):
напечатать (х)
иначе:
print(«Наконец-то готово!»)
Попробуйте сами »
Примечание: Блок else
НЕ будет выполнен, если цикл остановлен оператором break
.
Пример
Разорвите цикл, когда x
равно 3, и посмотрите, что произойдет с иначе
блок:
для x в диапазоне (6):
если x == 3: разрыв
напечатать (х)
иначе:
print(«Наконец-то готово!»)
Попробуйте сами »
Вложенные циклы
Вложенный цикл — это цикл внутри цикла.
«Внутренний цикл» будет выполняться один раз для каждой итерации «внешнего цикла». loop»:
Пример
Выведите каждое прилагательное для каждого фрукта:
прил = [«красный», «большой», «вкусный»]
фрукты = [«яблоко», «банан», «вишня»]
for x in adj:
for y in fruit:
print(x, y )
Попробуйте сами »
Выписка о пропуске
для
петли не могут быть пустыми, но если вы для
по какой-то причине есть цикл для
без содержимого, поместите в оператор pass
, чтобы избежать ошибки.
Пример
для x в [0, 1, 2]:
пройдет
Попробуйте сами »
Проверьте себя с помощью упражнений
Упражнение:
Прокрутите элементы в списке фруктов
.
фрукты = ["яблоко",
"банан", "вишня"] х фрукты печать (х)
Начать упражнение
❮ Предыдущий Далее ❯
Python While Loop — GeeksforGeeks
Python While Loop используется для многократного выполнения блока операторов, пока не будет выполнено заданное условие. А когда условие становится ложным, выполняется строка сразу после цикла в программе.
Синтаксис:
выражение while: оператор(ы)Блок-схема цикла While:
Пока цикл подпадает под категорию неопределенной итерации . Неопределенная итерация означает, что количество выполнений цикла заранее явно не указано.
Операторы представляют собой все операторы с отступом на одинаковое количество пробелов после программной конструкции, которые считаются частью единого блока кода. Python использует отступы в качестве метода группировки операторов. Когда выполняется цикл while, expr сначала оценивается в логическом контексте, и если оно истинно, выполняется тело цикла. Затем снова проверяется выражение, если оно по-прежнему истинно, то тело выполняется снова, и это продолжается до тех пор, пока выражение не станет ложным.
Example 1: Python While LoopPython3
|
Выход
Привет Компьютерщик привет выродок Hello Geek
В приведенном выше примере условие для while будет иметь значение True, если переменная счетчика (count) меньше 3.
Пример 2: цикл Python со списком
Python3
|
Output
4 3 2 1
В приведенном выше примере мы запустили цикл while по списку, который будет выполняться до тех пор, пока в списке не появится элемент.
Пример 3: Один оператор while
Как и в случае с блоком if, если блок while состоит из одного оператора, мы можем объявить весь цикл в одной строке. Если в блоке, из которого состоит тело цикла, несколько операторов, их можно разделить точкой с запятой (;).
Python3
|
Вывод: Привет
2 привет выродок привет выродок привет выродок Привет КомпьютерщикПример 4: операторы управления циклом
Операторы управления циклом изменяют выполнение по сравнению с его нормальной последовательностью. Когда выполнение покидает область, все автоматические объекты, созданные в этой области, уничтожаются. Python поддерживает следующие операторы управления.
Оператор ContinueОператор Continue Python возвращает управление в начало цикла.
Пример: цикл Python с оператором continue
Python3
|
Текущее письмо: 0 3
Текущая буква : k
Текущая буква : f
Текущее письмо: о
Текущая буква : р
Текущая буква : g
Текущая буква : k Оператор Break Оператор Python Break выводит управление из цикла. Выход: Example: Python while loop with a break statement
Python3
i
=
0
a
=
'geeksforgeeks'
while
i <
len
(а):
IF
A [I]
=
=
'E'
или
A [I]
=
=
'S
=
' S
=
'S
=
' S '
=
' S '
=
' S1
=
'S1
=
.
+
=
1
Break
ПРИНАЧЕНИЯ
(
ПРИНАНИЯ
(
(
(
'
'
.0021
I
+
=
1
СПАСИТЕ: G
9. Pass также используется для пустых операторов управления, функций и классов.
Пример: цикл Python с оператором pass
Python3
|
Выходные данные:
Значение i: 13
Цикл while с else
Как обсуждалось выше, цикл while выполняет блок до тех пор, пока не будет выполнено условие. Когда условие становится ложным, оператор сразу после цикла выполняется. Предложение else выполняется только тогда, когда ваше условие while становится ложным. Если вы выйдете из цикла или возникнет исключение, оно не будет выполнено.
Примечание: Блок else сразу после for/while выполняется, только если цикл НЕ завершается оператором break.
Python3
|
Вывод:
1 2 3 4 Без остановки 1Sentinel Controlled Statement
Здесь мы не используем никаких переменных-счетчиков, потому что не знаем, сколько раз будет выполняться цикл. Здесь пользователь решает, сколько раз он хочет выполнить цикл. Для этого мы используем сигнальное значение. Сторожевое значение — это значение, которое используется для завершения цикла всякий раз, когда пользователь входит в него, как правило, сигнальное значение равно -1.
Пример: Python во время петли с пользовательским входом
Python3
|
Output:
Explanation:
- First, it asks пользователю ввести число. если пользователь вводит -1, то цикл не будет выполняться
- Пользователь вводит 6, тело цикла выполняется и снова запрашивается ввод
- Здесь пользователь может вводить много раз, пока не введет -1, чтобы остановить цикл
- Пользователь может решить, сколько раз он хочет вводить ввод
Циклы «пока» Python (неопределенная итерация) — Real Python
Смотреть сейчас Это руководство содержит соответствующий видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Освоение циклов While
Итерация означает выполнение одного и того же блока кода снова и снова, потенциально много раз. Программная структура, реализующая итерацию, называется петля .
В программировании есть два типа итерации, неопределенная и определенная:
При неопределенной итерации количество выполнений цикла заранее явно не указывается. Наоборот, назначенный блок выполняется многократно, пока выполняется какое-то условие.
С определенной итерацией количество раз, которое назначенный блок будет выполняться, указывается явно в момент запуска цикла.
В этом руководстве вы:
- узнаете о цикле
while
, управляющей структуре Python, используемой для бесконечной итерации - Узнайте, как преждевременно выйти из цикла или итерации цикла
- Исследуйте бесконечные циклы
Когда вы закончите, вы должны хорошо понимать, как использовать бесконечную итерацию в Python.
Бесплатный бонус: Нажмите здесь, чтобы получить нашу бесплатную памятку по Python, которая покажет вам основы Python 3, такие как работа с типами данных, словарями, списками и функциями Python.
Примите участие в викторине: Проверьте свои знания с помощью нашей интерактивной викторины «Петли «пока» Python». По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройди тест »
while
Loop Давайте посмотрим, как оператор Python while
используется для построения циклов. Мы начнем с простого и будем украшать по мере продвижения.
Формат элементарного цикла в то время как
показан ниже:
, а <выражение>: <утверждение(я)>
<оператор(ы)>
представляет блок, который должен быть повторно выполнен, часто называемый телом цикла. Это обозначается отступом, как и в операторе if
.
Помните: Все управляющие структуры в Python используют отступы для определения блоков. См. обсуждение операторов группировки в предыдущем учебнике для ознакомления.
Управляющее выражение, <выражение>
, обычно включает одну или несколько переменных, которые инициализируются перед запуском цикла, а затем изменяются где-то в теле цикла.
Когда встречается цикл while
,
сначала оценивается в логическом контексте. Если это правда, выполняется тело цикла. Затем снова проверяется
, и если все еще верно, тело выполняется снова. Это продолжается до тех пор, пока
не станет ложным, после чего выполнение программы переходит к первому оператору за телом цикла.
Рассмотрим этот цикл:
>>>
1>>> n = 5 2>>> при n > 0: 3... п -= 1 4... напечатать(н) 5... 64 73 82 91 100
Вот что происходит в этом примере:
n
изначально равно5
. Выражение в заголовке инструкцииwhile
в строке 2 равноn > 0
, что верно, поэтому выполняется тело цикла. Внутри тела цикла в строке 3n
уменьшается на 9.0047 1 до4
, а затем распечатать.Когда тело цикла завершено, выполнение программы возвращается к началу цикла в строке 2, и выражение вычисляется снова. Это по-прежнему верно, поэтому тело выполняется снова, и печатается
3
.Это продолжается до тех пор, пока
n
не станет0
. В этот момент, когда выражение проверяется, оно оказывается ложным, и цикл завершается. Выполнение возобновится с первого оператора, следующего за телом цикла, но в данном случае его нет.
Обратите внимание, что управляющее выражение цикла while
проверяется первым, прежде чем что-либо еще произойдет. Если оно изначально ложно, то тело цикла вообще никогда не будет выполнено:
>>>
>>> n = 0 >>> пока n > 0: ... п -= 1 ... печать (н) ...
В приведенном выше примере, когда встречается петля, n
равно 0
. Управляющее выражение n > 0
уже ложно, поэтому тело цикла никогда не выполняется.
Вот еще один цикл while
, включающий список, а не числовое сравнение:
>>>
>>> a = ['foo', 'bar', 'baz'] >>> пока: . .. печать (a.pop (-1)) ... баз бар фу
Когда список оценивается в логическом контексте, он является истинным, если в нем есть элементы, и ложным, если он пуст. В этом примере и
являются истинными, если в них есть элементы. Как только все элементы будут удалены с помощью .pop()
и список пуст, и
ложны, и цикл завершается.
Удалить рекламу
Python
перерыв
и продолжение
Заявления В каждом примере, который вы видели до сих пор, все тело цикла while
выполняется на каждой итерации. Python предоставляет два ключевых слова, которые преждевременно завершают итерацию цикла:
Оператор Python
break
немедленно полностью завершает цикл. Выполнение программы переходит к первому оператору, следующему за телом цикла.Оператор Python
continue
немедленно завершает текущую итерацию цикла. Выполнение переходит к началу цикла, и управляющее выражение переоценивается, чтобы определить, будет ли цикл выполняться снова или завершится.
Различие между break
и continue
показано на следующей диаграмме:
Вот файл сценария с именем break.py
, демонстрирующий оператор break
:
1н = 5 2при n > 0: 3 п -= 1 4, если n == 2: 5 перерыв 6 печатать(н) 7print('Цикл завершен.')
Запуск break.py
из интерпретатора командной строки приводит к следующему выводу:
C:\Users\john\Documents>python break.py 4 3 Цикл закончился.
Когда n
становится 2
, выполняется оператор break
. Цикл завершается полностью, и выполнение программы переходит к print()
оператор в строке 7.
Примечание: Если вы программируете на C, C++, Java или JavaScript, вам может быть интересно, где находится цикл do-while в Python. Что ж, плохая новость заключается в том, что в Python нет конструкции do-while. Но хорошая новость заключается в том, что вы можете использовать цикл while
с оператором break
для его эмуляции.
Следующий сценарий, continue.py
, идентичен, за исключением оператора continue
вместо оператора 9.0047 перерыв :
1н = 5 2при n > 0: 3 п -= 1 4, если n == 2: 5 продолжить 6 печатать(н) 7print('Цикл завершен.')
Результат continue.py
выглядит следующим образом:
C:\Users\john\Documents>python continue.py 4 3 1 0 Цикл закончился.
На этот раз, когда n
равно 2
, оператор continue
приводит к завершению этой итерации. Таким образом, 2
не печатается. Выполнение возвращается к началу цикла, условие переоценивается, и оно остается верным. Цикл возобновляется, заканчиваясь, когда n
становится 0
, как и раньше.
еще
Пункт Python допускает необязательное предложение else
в конце цикла while
. Это уникальная особенность Python, которой нет в большинстве других языков программирования. Синтаксис показан ниже:
, а <выражение>: <утверждение(я)> еще: <дополнительные_утверждения(я)>
, указанный в else
будет выполнено, когда цикл while
завершится.
Примерно сейчас вы можете подумать: «Чем это полезно?» Вы можете сделать то же самое, поместив эти операторы сразу после цикла while
, без else
:
, а <выражение>: <утверждение(я)> <дополнительные_утверждения(я)>
Какая разница?
В последнем случае без пункта else
,
будет выполняться после завершения цикла , в то время как
, несмотря ни на что.
Когда
помещаются в предложение else
, они будут выполняться только в том случае, если цикл завершится «по исчерпанию», то есть, если цикл повторяется до тех пор, пока управляющее условие не станет ложным. Если выход из цикла выполняется оператором break
, предложение else
выполняться не будет.
Рассмотрим следующий пример:
>>>
>>> n = 5 >>> пока n > 0: ... п -= 1 ... печать (н) ... еще: ... print('Цикл выполнен.') ... 4 3 2 1 0 Цикл выполнен.
В этом случае цикл повторялся до тех пор, пока условие не было исчерпано: n
стало 0
, поэтому n > 0
стало ложным. Поскольку цикл, так сказать, прожил свою естественную жизнь, было выполнено предложение else
. Теперь обратите внимание на разницу здесь:
>>>
>>> n = 5 >>> пока n > 0: ... п -= 1 ... печать (н) ... если n == 2: ... ломать ... еще: ... print('Цикл выполнен.') ... 4 3 2
Этот цикл завершается преждевременно с помощью break
, поэтому предложение else
не выполняется.
Может показаться, что значение слова else
не совсем соответствует циклу while
, а также оператору if
. Гвидо ван Россум, создатель Python, на самом деле сказал, что если бы ему пришлось делать это снова, он оставил бы , в то время как
зацикливает предложение else
вне языка.
Одна из следующих интерпретаций может помочь сделать его более интуитивным:
Думайте о заголовке цикла (
, пока n > 0
) как об оператореif
(, если n > 0
), который выполняется снова и снова, с предложениемelse
, которое наконец выполняется, когда условие становится ЛОЖЬ.Подумайте о
иначе
, как если бы это былоnobreak
, в том смысле, что следующий за ним блок выполняется, если не былоbreak
.
Если вы не находите ни одну из этих интерпретаций полезной, смело игнорируйте их.
Когда может быть полезно предложение else
в цикле while
? Одной из распространенных ситуаций является поиск в списке определенного элемента. Вы можете использовать break
для выхода из цикла, если элемент найден, а предложение else
может содержать код, предназначенный для выполнения, если элемент не найден:
>>>
>>> a = ['foo', 'bar', 'baz', 'qux'] >>> s = 'корж' >>> я = 0 >>> пока я < len(a): ... если a[i] == s: ... # Обработка найденного элемента ... ломать ... я += 1 ... еще: ... # Обработка элемента не найден ... print(s, 'не найдено в списке') ... corge не найден в списке.
Примечание: Показанный выше код полезен для иллюстрации концепции, но на самом деле вы вряд ли будете искать в списке таким образом.
Во-первых, списки обычно обрабатываются с определенной итерацией, а не циклом while
. Определенная итерация рассматривается в следующем руководстве этой серии.
Во-вторых, Python предоставляет встроенные способы поиска элемента в списке. Вы можете использовать оператор в
:
>>>
>>> если s в a: . .. print(s, 'найдено в списке') ... еще: ... print(s, 'не найдено в списке') ... corge не найден в списке.
9Метод 0047 list.index() также будет работать. Этот метод вызывает исключение ValueError
, если элемент не найден в списке, поэтому для его использования необходимо понимать обработку исключений. В Python вы используете оператор try
для обработки исключения. Пример приведен ниже:
>>>
>>> попробуйте: ... печать (a.index ('корж')) ... кроме ValueError: ... print(s, 'не найдено в списке') ... corge не найден в списке.
Далее в этой серии статей вы узнаете об обработке исключений.
Предложение else
с циклом , в то время как
немного странное, встречается нечасто. Но не уклоняйтесь от него, если обнаружите ситуацию, в которой вы чувствуете, что это добавляет ясности вашему коду!
Удалить рекламу
Бесконечные циклы
Предположим, вы пишете цикл while
, который теоретически никогда не заканчивается. Звучит странно, правда?
Рассмотрим этот пример:
>>>
>>> пока верно: ... печать('фу') ... фу фу фу . . . фу фу фу КлавиатураПрерывание Traceback (последний последний вызов): Файл "", строка 2, в распечатать('фу')
Этот код был прерван Ctrl + C , что генерирует прерывание от клавиатуры. Иначе это продолжалось бы бесконечно. Многие выходные строки foo
были удалены и заменены вертикальным многоточием в показанном выводе.
Ясно, Истинно
никогда не будет ложным, иначе нас всех ждут очень большие неприятности. Таким образом, в то время как True:
инициирует бесконечный цикл, который теоретически будет работать вечно.
Возможно, это не похоже на то, что вы хотели бы сделать, но этот шаблон на самом деле довольно распространен. Например, вы можете написать код для службы, которая запускается и работает вечно, принимая запросы на обслуживание. «Навсегда» в данном контексте означает, пока вы его не отключите, или до тепловой смерти Вселенной, в зависимости от того, что наступит раньше.
Проще говоря, помните, что циклы можно разорвать с помощью оператора break
. Завершить цикл может быть проще, основываясь на условиях, распознаваемых в теле цикла, а не на условии, оцениваемом в начале цикла.
Вот еще один вариант цикла, показанного выше, который последовательно удаляет элементы из списка, используя .pop()
, пока он не станет пустым:
>>>
>>> a = ['foo', 'bar', 'baz'] >>> пока верно: ... если не: ... ломать ... печать (a.pop (-1)) ... баз бар фу
Когда a
становится пустым, не
становится истинным, и оператор break
выходит из цикла.
Вы также можете указать несколько операторов break
в цикле:
пока верно: if: # Одно условие для завершения цикла ломать . .. if : # Другое условие завершения ломать ... if : # Еще одно ломать
В таких случаях, когда есть несколько причин для завершения цикла, часто лучше разбивает
из нескольких разных мест, а не пытается указать все условия завершения в заголовке цикла.
Бесконечные циклы могут быть очень полезными. Просто помните, что вы должны убедиться, что цикл в какой-то момент разорвется, чтобы он не стал бесконечным.
Вложенные
в то время как
Циклы Как правило, управляющие структуры Python могут быть вложены друг в друга. Например, if
/ elif
/ else
могут быть вложены условные операторы:
, если возраст < 18 лет: если пол == 'М': распечатать('сын') еще: печать('дочь') Элиф возраст >= 18 и возраст < 65: если пол == 'М': печать('отец') еще: распечатать('мама') еще: если пол == 'М': печать('дедушка') еще: печать('бабушка')
Аналогично, цикл while
может содержаться внутри другого цикла while
, как показано здесь:
>>>
>>> a = ['foo', 'bar'] >>> пока len(a): . .. печать (a.pop (0)) ... б = ['баз', 'кукс'] ... в то время как лен(б): ... печать ('>', b.pop (0)) ... фу > баз > кекс бар > баз > кекс
Оператор break
или continue
, обнаруженный во вложенных циклах, применяется к ближайшему охватывающему циклу:
, а: утверждение утверждение в то время как : утверждение утверждение break # Применяется к циклу while : break # Применяется к циклу while :
Кроме того, циклов while
могут быть вложены внутрь операторов if
/ elif
/ else
и наоборот:
, если <выражение>: утверждение в то время как <выражение>: утверждение утверждение еще: в то время как <выражение>: утверждение утверждение утверждение
, а <выражение>: если <выражение>: утверждение Элиф <выражение>: утверждение еще: утверждение если <выражение>: утверждение
На самом деле, все управляющие структуры Python могут быть смешаны друг с другом в любой степени, в которой вы нуждаетесь. Так и должно быть. Представьте, как было бы неприятно, если бы появились неожиданные ограничения вроде «A 9Цикл 0047, в то время как не может содержаться в операторе , если
» или «Циклы , в то время как
могут быть вложены друг в друга не более чем в четыре раза». Вам будет очень трудно запомнить их все.
Кажущиеся произвольными числовые или логические ограничения считаются признаком плохой разработки языка программы. К счастью, вы не найдете их в Python.
Удалить рекламу
Однострочный
пока
Циклы То же, что и , если
, цикл while
может быть указан в одной строке. Если в блоке, который составляет тело цикла, несколько операторов, их можно разделить точкой с запятой (;
):
>>>
>>> n = 5 >>> пока n > 0: n -= 1; печать (н) 4 3 2 1 0
Это работает только с простыми операторами. Вы не можете объединить два составных оператора в одну строку. Таким образом, вы можете указать цикл , в то время как
в одной строке, как указано выше, и написать , если оператор
в одной строке:
>>>
>>> если True: print('foo') фу
Но так делать нельзя:
>>>
>>> при n > 0: n -= 1; если True: печать ('foo') SyntaxError: неверный синтаксис
Помните, что PEP 8 не одобряет использование нескольких операторов в одной строке. Так что вам, вероятно, не следует делать ничего из этого слишком часто.
Заключение
В этом уроке вы узнали о неопределенная итерация с использованием цикла Python while
. Теперь вы можете:
- Построить базовую и сложную
при этом
петель - Прерывание выполнения цикла с
break
иcontinue
- Используйте предложение
else
с цикломwhile
- Работа с бесконечными циклами
Теперь вы должны хорошо понимать, как выполнять фрагмент кода повторно.
Примите участие в викторине: Проверьте свои знания с помощью нашей интерактивной викторины «Python» while «Loops». По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройдите тест »
Следующее руководство в этой серии охватывает определенную итерацию с для
циклов — рекуррентное выполнение, где количество повторений указано явно.
Смотреть сейчас Это руководство содержит связанный с ним видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Мастеринг циклов While
Циклы While | Документация Grace
Опасности циклов while
Безопасный цикл
Цикл while будет выполняться до тех пор, пока выполняется условие
после while
правда. Иногда это бесценно, но сопряжено с опасностью:
иногда ваш цикл while никогда не остановится! Это называется «бесконечный цикл».
Если условие остается истинным, цикл while будет продолжать выполнять блок — до тех пор, пока конец вселенной, если понадобится. Обычно это не то, что вы хотите!
Есть несколько способов избежать этой проблемы.
Не используйте while без необходимости! Если возможно, используйте цикл повторения или цикл for.
Просмотрите тело цикла, чтобы убедиться, что вы меняете что-то, что в конечном итоге вызвать изменение условия
true
наfalse
Если вы не уверены, выведите условие в конце тела цикла. В веб-IDE Grace, если вы считаете, что могли написать бесконечный цикл вы можете остановить его, обновив страницу IDE в веб-браузере.
Давайте рассмотрим этот совет более внимательно.
Выбор между
repeat
, for
и while
Repeat-loops и for-loops лучше, если вы знаете или можете
легко вычислить, максимальное количество раз, которое вы можете выполнить тело цикла. Вы можете выйти из цикла повторения или цикла for в начале , используя оператор return
, который вернет из
метод, содержащий его.
Пример с предыдущей страницы, который
выполняет тело цикла для x
= 0, 3, 6, 9, … , 27 не нужно использовать
пока вообще. Мы могли бы записать это так:
var x := 0 повторить 10 раз { напечатать "{х}" x := x + 3 // считать по три }
Эта версия , очевидно, прекращает работу после 10 итераций. Он по-прежнему нуждается в
переменная x
должна быть объявлена перед циклом и увеличена в теле цикла.
Вот версия, которая использует for(_)do(_)
и, таким образом, использует параметр ( n
) вместо
Переменная. Теперь нет необходимости объявлять x
вне цикла; мы можем рассчитать
это основано на значении n
.
для (0..9) сделать { п -> def x = n * 3 // считать по три напечатать "{х}" }
Так как здесь используется for(_)do(_)
, он также очевидно завершает — на этот раз,
после использования каждого из
10 значений в диапазоне 0. .9
.
Более того, поскольку переменные n
и x
видны только в
тело цикла и не может быть случайно изменено, цикл можно понять
в изоляции. Это отличается от цикла while, где x
должно быть
переменная и должна быть инициализирована вне цикла.
Пример использования while
Вот задача, в которой while кажется более полезной: поиск первого четного числа в списке чисел:
Обратите внимание, как мы используем логическую переменную notFound
для условия; notFound
инициализируется значением true
, но ему присваивается значение false
, как только мы
обнаружить четное число. Переменная, используемая таким образом, часто называется «флагом»;
подумайте о рефери, поднимающем флаг, сигнализируя о нарушении правил.
Но что произойдет, если в заданном списке чисел нет четного числа?
Измените 6
на нечетное число и посмотрите.
Вы должны получить такую ошибку:
BoundsError в строке 647 collectionsPrelude: индекс 7 за пределами 1. .6 поднято в Exception.raise(_) в строке 647 collectionsPrelude вызывается из object.at(_) в строке 6 основного ...
Это сообщение об ошибке сообщает вам, что в запросе at(_)
в строке 6 вы были
запрашивая элемент 7 списка, который имеет только 6 элементов. Вы видите, почему?
Да! Единственный способ выхода из цикла while — присвоить false
не найдено
. Мы делаем это присвоение (в строке 7), как только находим четное число.
Но если не является четным числом , мы никогда не делаем это присвоение, notFound
остается true
, а цикл while продолжает зацикливаться.
В конце концов, присваивание ix := ix + 1
в строке 9 приведет к тому, что ix
достигнет
значение больше, чем самый высокий допустимый индекс до nums
, и в следующий раз
цикл, Грейс поднимает BoundsError
.
Чтобы защититься от этого, мы должны изменить программу, чтобы завершить цикл под двумя условиями:
- Когда мы находим четное число в
nums
- Когда
ix
превышаетnums. size
Или, наоборот, продолжаем зацикливать , пока не нашли
четное, а при этом ix
не превышает размер nums
.
Этого можно добиться, изменив условие while
на notFound && (ix ≤ nums.size)
.
Внесите это изменение и снова запустите программу. Что случается?
Да, вы получаете BoundsError снова
, но на этот раз в строке 13.
Попробуйте сами понять почему, прежде чем читать дальше.
Условие (ix ≤ nums.size)
действительно завершит цикл while, как только ix
принимает значение 7. Но что тогда происходит? Грейс выполняет код, который
следует за циклом while, который снова запрашивает num.at(7)
.
Это преподаст нам важный урок. Когда цикл while завершается, мы знаем ,
так же верно, как смерть и налоги, что в то время как
условие ложно
! Почему?
Потому что, если бы это не было false
, мы бы все равно ходили по кругу!
В этом примере мы знаем , что либо notFound
ложно, либо что ix ≤ nums. size
ложно
. Мы можем использовать это, чтобы решить, что делать:
Но подождите минутку! Нашим первым правилом было
- . Не используйте while без необходимости! Если возможно, используйте цикл for.
В этом примере — это — предварительная граница количества раз, которое мы могли бы
выполнить цикл, потому что известен размер nums
. Таким образом, мы можем использовать для (_) сделать (_)
.
вместо while(_)do(_)
, например:
def nums = список [3, 7, 5, 1, 9, 1] переменная не найдена := истина вар firstEven for (числа) do { n → если (не найдено), то { если (n.isEven), то { не найдено := ложь первыйЭвен := п } } } если (не найдено), то { выведите "нет четных чисел" } еще { напечатайте "первое четное число равно {firstEven}" }
Нам еще нужен флаг notFound
. Почему? Что произойдет, если их будет два или три
четные числа в списке?
Наличие флага notFound
и переменной firstEven
делают это
код сложнее, чем необходимо. Еще одним недостатком является то, что
перебирает каждых элементов nums
, даже если четное число найдено в самом начале. Мы можем это исправить
завернув цикл в метод и используя , верните
для завершения цикла
и метод
как только мы нашли то, что искали:
Это лучшее решение этой проблемы. Его легко модифицировать, например, чтобы вернуть найденный номер, а не печатать его. Метод также может изменить, чтобы принять дополнительный параметр, который представляет собой действие, которое необходимо предпринять, если есть нечетное число — но это урок на другой день.
Использование метода также дает вам возможность выбрать имя, раскрывающее намерение за метод, который поможет вам и другим, кто читает этот код, понять, что это предназначено сделать.
Когда нам
нужен цикл while?Цикл while часто является лучшим решением, когда:
- Вы обрабатываете ввод. Вы знаете, что вход конечен, но нет априори ограничен своими размерами.
- Вы знаете, что что-то ограничено, но вычисление границы затруднено или невозможно.
- Данные, которые вы обрабатываете, рандомизированы или псевдослучайны. Статистика говорит вам, что что-то в конце концов произойдет, но вы не можете знать, сколько времени это займет, если вам не повезет.
Типичным для первой ситуации может быть запрос ввода от Пользователь. Например:
в то время как {io.ask "Хочешь сыграть снова". asLower.startsWith "y"} { игратьOneRound } print "Спасибо за игру. До свидания."
Мы знаем, что в конце концов пользователь захочет остановиться, но мы понятия не имеем, как много раз они будут хотеть играть. Следовательно, цикл while — правильный инструмент.
Примером второй ситуации может быть заполнение строки текста. Ты хочешь чтобы поместить как можно больше слов в текущую строку. Так вроде
пока { следующее слово := слова.следующее ((xPosition + nextWord.width + space.width) ≤ rightMargin)) } делать { currentLine. addLast (следующее слово) xPosition := xPosition + nextWord.width + space.width }
Третья ситуация иллюстрируется выбором набора случайных чисел заданный размер.
столбец определения = набор [] в то время как { column.size < limit } сделать { кандидат в защиту = random.integerIn от 1 до 100 column.add (кандидат) }
Когда цикл завершается, мы знаем, что column.size == limit
, потому что column.size
увеличивается не более чем на единицу на каждой итерации. Этот код будет работать
хорошо, если предел
равен 5. Но когда предел приближается к 100, это займет больше времени и
дольше, чтобы найти псевдослучайное целое число в интервале 1..100, которое не
уже в колонке. Если предел
больше 100, он никогда не прекратится!
Эту проблему лучше решить с помощью цикла for.
Начните со списка
, содержащего числа от 1 до 100. Теперь
выбрать элемент из списка случайным образом, удалить его,
а затем добавьте этот элемент в столбец. Повторите этот процесс лимитов
раз — что
можно выполнить, используя repeat(_)times(_)
или for(_)do(_)
.
Если предел
больше 100, этот подход приведет к ошибке BoundsError
.
когда список, из которого вы выбираете элемент, становится пустым.
Циклы for и while в Python
Что такое циклы и когда вы их используете?
Циклы являются важной конструкцией во всех языках программирования. В циклической структуре программа сначала проверяет условие. Если это условие истинно, выполняется некоторый фрагмент кода. Этот код будет продолжать работать, пока условие не станет недействительным.
Например, посмотрите на следующий блок псевдокода:
ЕСЛИ желудок_пустой есть еду() КОНЕЦ //проверить, пустой ли желудок снова. ЕСЛИ желудок_пустой есть еду() КОНЕЦ //проверить, пустой ли желудок, //....
Здесь мы проверяем, является ли переменная желудка_пустой
истинной
. Если это условие выполнено, программа выполнит метод eat_food
. Кроме того, обратите внимание, что мы вводим один и тот же код несколько раз, а это значит, что это нарушает правило программирования DRY.
Чтобы смягчить эту проблему, мы можем использовать такую структуру цикла:
ПОКА желудка_пусто // этот код будет продолжать работать, если значение желудка_пусто истинно есть еду() КОНЕЦ
В этом коде мы используем оператор while
. Здесь цикл сначала анализирует, является ли логическое значение farm_empty
true
. Если это условие выполнено, программа продолжает выполнять функцию eat_food
, пока условие не станет ложным. Мы узнаем о , а
— далее в этой статье.
Подводя итог, разработчики используют циклы для многократного запуска фрагмента кода до тех пор, пока не будет выполнено определенное условие. В результате это экономит время и повышает читабельность кода.
Типы петель
В Python существует два типа циклических структур:
-
для
: Итерация заданное количество раз. Это также известно как определенная итерация . -
в то время как
: Продолжайте повторять, пока условие не станетложь
. Это называется неопределенной итерацией .
В этой статье вы познакомитесь со следующими понятиями:
-
на
петель- Синтаксис
- Цикл с числами
- Цикл со списками
- Понимание списка
- Синтаксис
- Использование со списками
- Использование с номерами
-
пока
петель- Синтаксис
- Цикл с номерами
- Цикл со списками
- Операторы управления циклом
-
перерыв
выписка -
продолжить
заявление -
пропуск
выписка -
еще
пункт
-
на
петель Цикл по
— это тип цикла, который выполняется заданное количество раз. Он также имеет возможность перебирать элементы любой последовательности, например списка или строки.
Синтаксис
для i в <коллекции>: <тело цикла>
Здесь коллекция
представляет собой список объектов. Переменная цикла i
принимает значение следующего элемента коллекции
каждый раз в цикле. Код в теле цикла
продолжает работать до тех пор, пока i
не достигнет конца коллекции.
Более 200 000 разработчиков используют LogRocket для улучшения цифрового взаимодействия
Подробнее →
Цикл с числами
Чтобы продемонстрировать для
циклов, давайте воспользуемся циклом числового диапазона:
for i in range(10): # набор чисел от 0 до 9 печать (я)
В этом фрагменте кода мы использовали функцию range
для создания набора чисел от 0 до 9. Позже мы использовали функцию print
для вывода значения нашей переменной цикла, i
. В результате будет выведен список чисел от 0 до 9..
Метод range(
возвращает итерируемый объект, который возвращает целые числа, начинающиеся с 0, до
, но не включая его.
Мы даже можем использовать условные операторы в наших циклах, например:
для i в диапазоне (10): # числа от 0 до 9 if i % 2 == 0: # делится на 2? (четное число) print(i) # затем распечатайте.
Этот блок кода выводит все четные числа от 0 до 9.
Зацикливание со списками
Мы даже можем использовать цикл for
для перебора списков:
name = ["Билл Гейтс", "Стив Джобс", "Марк Цукерберг"] # создаем наш список для имени в именах: # загружаем наш список имен и перебираем их печать (имя)
В приведенном выше фрагменте мы создали список с именем имен
. Позже мы использовали команду for
для перебора массива имен
, а затем вышли из этого списка.
Фрагмент ниже использует оператор if
для возврата всех имен, содержащих букву «B»:
name = ["Билл Гейтс", "Билли Айлиш", "Марк Цукерберг"] # создаем наш список для имени в именах: # загружаем наш список имен и перебираем их если "B" в имени: # включает ли имя "B"? печать (имя)
Понимание списка
В некоторых случаях может потребоваться создать новый список на основе данных существующего списка.
Например, посмотрите на следующий код:
имени = ["Билл Гейтс", "Билли Айлиш", "Марк Цукерберг", "Хусейн"] имена с B = [] для имени в именах: если "Б" в имени: namesWithB.append(name) # добавить этот элемент в этот массив. печать (имена с B)
В этом коде мы использовали команду for
для перебора массива имен
, а затем проверили, содержит ли какой-либо элемент букву B
. Если это правда, программа добавляет этот соответствующий элемент к имен со списком
.
Используя возможности понимания списков, мы можем значительно сократить этот блок кода.
Синтаксис
newlist = [<выражение> для <переменной цикла> в <списке> (если условие)]
Здесь выражение
может быть фрагментом кода, который возвращает значение, например, метод. Элементы списка
будут добавлены к массиву нового списка
, если переменная цикла
соответствует состояние
.
Использование со списками
Давайте перепишем наш код, который мы написали ранее, используя понимание списка:
имени = ["Билл Гейтс", "Билли Айлиш", "Марк Цукерберг", "Хусейн"] namesWithB = [имя для имени в именах, если в имени есть "B"] печать (имена с B)
В этом коде мы перебрали массив имен
. По нашему условию все элементы, содержащие букву B
, будут добавлены в список nameWithB
.
Использование с номерами
Мы можем использовать метод диапазона
в понимании списка следующим образом:
числа = [i для i в диапазоне (10)] печать (числа)
Обратите внимание, что в данном случае у нас нет условного оператора. Это означает, что условия необязательны.
Этот фрагмент кода будет использовать условие для получения списка четных чисел от 0 до 9:
пока
петель С помощью цикла while
мы можем выполнять блок кода до тех пор, пока условие
равно true
.
Синтаксис
в то время как <условие>: <тело цикла>
В цикле while
сначала проверяется условие
. Если это true
, выполняется код в теле цикла
. Этот процесс будет повторяться до тех пор, пока условие
не станет ложным
.
Цикл с номерами
Этот фрагмент кода выводит целые числа от 0
до 9
.
н = 0 пока n < 10: # пока n меньше 10, print(n) # распечатать значение n п += 1 #
Вот что происходит в этом примере:
- Начальное значение
n
равно0
. Сначала программа проверяет, больше лиn
10
. Поскольку этоtrue
, тело цикла выполняет - Внутри цикла мы сначала выводим значение
и
. Позже мы увеличиваем его на1
. - Когда тело цикла завершено, выполнение программы снова оценивает условие. Поскольку это все еще верно, тело выполняется снова.
- Это продолжается до тех пор, пока
n
не превысит10
. В этот момент, когда выражение проверяется, оно равноfalse
и цикл останавливается.
Цикл со списками
Мы можем использовать блок while
для перебора списков следующим образом:
числа = [0, 5, 10, 6, 3] length = len(numbers) # получить длину массива. п = 0 в то время как n < длина: # условие цикла печать (числа [n]) п += 1
Вот разбивка этой программы:
- Функция
len
возвращает количество элементов, присутствующих в массивечисел
- Наш оператор
while
сначала проверяет, меньше лиn
переменной длиныномеров
список. В итоге мы увеличиваем переменнуюn
- Когда
n
превышает длину
Имеется три оператора управления циклом:
-
break
: Завершает цикл, если выполняется определенное условие -
continue
: Пропускает одну итерацию цикла, если выполняется указанное условие, и продолжает следующую итерацию. Разница междуcontinue
иbreak
заключается в том, что ключевое словоbreak
«выпрыгнет» из цикла, аcontinue
«перепрыгнет» через один цикл цикла -
pass
: Когда вы не хотите выполнять какую-либо команду или код.
Все это можно использовать как в , так и в
и для
циклов.
1.
перерыв
Оператор break
полезен, когда вы хотите выйти из цикла, если какое-то условие равно верно
.
Вот ключевое слово break
в действии:
имени = ["Билл Гейтс", "Билли Айлиш", "Марк Цукерберг", "Хусейн"] для имени в именах: если имя == "Марк Цукерберг": print("Здесь выход из цикла.") break # завершить цикл, если условие истинно. печать (имя) print("Вне цикла")
Несколько выводов из этого кода:
- Программа сначала перебирает
имен
массивов - Во время каждого цикла Python проверяет, соответствует ли текущее значение
имя
этоМарк Цукерберг
- Если вышеуказанное условие выполнено, программа сообщит пользователю, что она остановила цикл
- Однако, если условие
ложно
, программа напечатает значениеимя
2.
продолжить
Оператор continue
указывает Python пропустить текущую итерацию и перейти к следующей.
Вот пример:
имени = ["Билл Гейтс", "Билли Айлиш", "Марк Цукерберг", "Хусейн"] для имени в именах: если имя == "Марк Цукерберг": print("Пропуская эту итерацию. ") continue # Пропустить итерацию, если это правда. печать (имя) print("Вне цикла")
Вот разбивка этого скрипта:
- Пройтись по массиву
имен
- Если приложение встречает элемент со значением
Марк Цукерберг
, используйте операторcontinue
для перехода через эту итерацию - В противном случае выведите значение нашего счетчика циклов,
имя
3.
проход
Используйте оператор pass
, если вы не хотите, чтобы выполнялась какая-либо команда. Другими словами, pass
позволяет выполнить «нулевую» операцию. Это может иметь решающее значение в тех местах, где ваш код будет использоваться, но еще не написан.
Вот простой пример ключевого слова pass
:
имени = ["Билл Гейтс", "Билли Айлиш", "Марк Цукерберг", "Хусейн"] для имени в именах: если имя == "Марк Цукерберг": print("Просто мимо. ..") pass # Продолжить эту итерацию печать (имя) print("Вне цикла")
Это будет вывод:
4.
еще
пункт Python также позволяет нам добавлять операторов else
к нашим циклам. Код внутри блока else
выполняется, когда цикл завершается.
Вот синтаксис:
# для циклов for для i в <коллекции>: <тело цикла> еще: <кодовый блок> # запустится, когда цикл остановится. # для циклов while в то время как <условие>: <тело цикла> еще: <кодовый блок> # будет запущен, когда цикл остановится
Здесь можно подумать: «Почему бы не поставить код code
блок
сразу после цикла? Разве это не приведет к тому же самому?»
Есть небольшая разница. Без else
, кодовый блок
будет работать после завершения цикла, несмотря ни на что.
Однако с оператором else
блок кода
не будет выполняться, если цикл завершается с помощью ключевого слова break
.
Вот пример, чтобы правильно понять его назначение:
имени = ["Билл Гейтс", "Билли Айлиш", "Марк Цукерберг", "Хусейн"] print("Иначе здесь не запустится.") для имени в именах: если имя == "Марк Цукерберг": print("Цикл остановлен из-за разрыва") break # Остановить этот цикл печать (имя) else: # это не сработает, потому что был использован 'break'. print("Цикл завершен") print(" \nЗдесь будет выполняться оператор Else:") для имени в именах: печать (имя) else: # будет работать из-за отсутствия оператора break print("второй цикл завершен")
Это будет вывод:
Заключение
В этой статье вы узнали, как использовать цикл for
и while
в программировании на Python. Кроме того, вы также узнали об основах понимания списка и операторах изменения цикла. Это важные концепции, которые помогут вам улучшить свои навыки Python.
Большое спасибо за прочтение!
LogRocket: полная видимость ваших веб-приложений и мобильных приложений
LogRocket — это решение для мониторинга внешних приложений, которое позволяет воспроизводить проблемы, как если бы они возникли в вашем собственном браузере. Вместо того, чтобы гадать, почему возникают ошибки, или запрашивать у пользователей скриншоты и дампы журналов, LogRocket позволяет вам воспроизвести сеанс, чтобы быстро понять, что пошло не так. Он отлично работает с любым приложением, независимо от фреймворка, и имеет плагины для регистрации дополнительного контекста из Redux, Vuex и @ngrx/store.
Помимо регистрации действий и состояния Redux, LogRocket записывает журналы консоли, ошибки JavaScript, трассировки стека, сетевые запросы/ответы с заголовками и телами, метаданные браузера и пользовательские журналы. Он также использует DOM для записи HTML и CSS на странице, воссоздавая идеальные до пикселя видео даже для самых сложных одностраничных и мобильных приложений.
Попробуйте бесплатно.
4. Дополнительные инструменты потока управления — документация по Python 3.10.7
Помимо только что введенного оператора while
, Python использует обычный
операторы управления потоком, известные из других языков, с некоторыми особенностями.
4.1.
if
Операторы Пожалуй, наиболее известным типом операторов является оператор if
. За
пример:
>>> x = int(input("Пожалуйста, введите целое число: ")) Пожалуйста, введите целое число: 42 >>> если х < 0: ... х = 0 ... print('Отрицательное значение изменено на ноль') ... Элиф х == 0: ... печать('Ноль') ... элиф х == 1: ... печать('Одиночный') ... еще: ... печать('Еще') ... Более
Может быть ноль или более частей elif
, а часть else
по желанию. Ключевое слово « elif
» является сокращением от «else if» и полезно.
во избежание чрезмерного отступа. если
… элиф
… elif
… последовательность заменяет переключатель
или case
операторов найдено на других языках.
Если вы сравниваете одно и то же значение с несколькими константами или проверяете определенные типы или
атрибуты, вы также можете найти соответствует оператору
. Для большего
подробности см. в Заявлениях о матче.
4.2.
для
Заявлений Оператор for
в Python немного отличается от того, что вы можете использовать.
в C или Pascal. Вместо того, чтобы всегда повторять арифметическую прогрессию
чисел (как в Паскале) или предоставление пользователю возможности определять как
шаг итерации и условие остановки (как C), оператор Python for
перебирает элементы любой последовательности (списка или строки) в том порядке, в котором
они появляются в последовательности. Например (без каламбура):
>>> # Измерить несколько строк: ...words = ['кот', 'окно', 'дефенестрировать'] >>> для w прописью: ... напечатать (ш, лен (ш)) ... кошка 3 окно 6 открыть 12
Код, который изменяет коллекцию во время повторения этой же коллекции, может быть сложным, чтобы получить право. Вместо этого обычно проще зациклить над копией коллекции или для создания новой коллекции:
# Создать образец коллекции users = {'Ганс': 'активный', 'Элеонора': 'неактивный', '景太郎': 'активный'} # Стратегия: перебирать копию для пользователя, статус в users. copy().items(): если статус == 'неактивный': удалить пользователей [пользователь] # Стратегия: создать новую коллекцию активные_пользователи = {} для пользователя, статус в users.items(): если статус == 'активный': active_users[пользователь] = статус
4.3. Диапазон
()
Функция Если вам нужно перебрать последовательность чисел, встроенная функция range()
пригодится. Генерирует арифметические прогрессии:
>>> для i в диапазоне (5): ... печать (я) ... 0 1 2 3 4
Данная конечная точка никогда не является частью сгенерированной последовательности; диапазон(10)
генерирует
10 значений, допустимые индексы для элементов последовательности длины 10. Это
можно позволить диапазону начинаться с другого числа или указать другое
приращение (даже отрицательное; иногда это называют «шагом»):
>>> список (диапазон (5, 10)) [5, 6, 7, 8, 9] >>> список (диапазон (0, 10, 3)) [0, 3, 6, 9] >>> список(диапазон(-10,-100,-30)) [-10, -40, -70]
Для перебора индексов последовательности вы можете комбинировать range()
и len()
следующим образом:
>>> a = ['Мария', 'была', 'а', 'маленькая', 'агнец'] >>> для i в диапазоне (len(a)): . .. печать (я, а [я]) ... 0 Мария 1 было 2 часа 3 маленьких 4 ягненка
Однако в большинстве таких случаев удобно использовать перечислить()
см. Техники зацикливания.
Странная вещь происходит, если вы просто печатаете диапазон:
>>> диапазон(10) диапазон(0, 10)
Во многих отношениях объект, возвращаемый range()
, ведет себя так, как если бы это был список,
но на самом деле это не так. Это объект, который возвращает последовательные элементы
желаемую последовательность, когда вы повторяете ее, но на самом деле это не делает
список, тем самым экономя место.
Мы говорим, что такой объект является итерируемым, то есть подходящим в качестве цели для
функции и конструкции, которые ожидают чего-то, от чего они могут
получать последовательные предметы, пока запас не будет исчерпан. Мы видели это
9Оператор 0047 for является такой конструкцией, а пример функции
который принимает итерацию, равен sum()
:
>>> сумма(диапазон(4)) # 0 + 1 + 2 + 3 6
Позже мы увидим больше функций, которые возвращают итерации и принимают итерации как
аргументы. В главе «Структуры данных» мы более подробно обсудим список()
.
4.4.
break
и continue
Операторы и else
Пункты в циклах Оператор break
, как и в C, вырывается из самой внутренней оболочки. вместо
или при цикле
.
могут иметь предложение else
; он выполняется, когда цикл
завершается через исчерпание итерации (с вместо
) или когда
условие становится ложным (с в то время как
), но не тогда, когда цикл
завершается оператором break
. Примером этому служит
следующий цикл, который ищет простые числа:
>>> для n в диапазоне (2, 10): ... для x в диапазоне (2, n): ... если n % x == 0: ... print(n, 'равно', x, '*', n//x) ... ломать ... еще: ... # цикл сорвался, не найдя множителя ... print(n, 'является простым числом') ... 2 это простое число 3 это простое число 4 равно 2 * 2 5 это простое число 6 равно 2 * 3 7 это простое число 8 равно 2 * 4 9 равно 3 * 3
(Да, это правильный код. Посмотрите внимательно: иначе пункт
принадлежит
цикл for
, не оператор if
.)
При использовании с циклом предложение else
имеет больше общего с предложением else
предложение оператора try
, чем с предложением if
утверждений: выполняется предложение try
оператора else
когда не возникает никаких исключений, и предложение цикла else
выполняется, когда нет break
имеет место. Подробнее о оператор try
и исключения, см.
Обработка исключений.
Оператор continue
, также заимствованный из C, продолжается следующим
итерация цикла:
>>> для числа в диапазоне (2, 10): ... если число% 2 == 0: ... print("Найдено четное число", число) ... Продолжать ... print("Найдено нечетное число", число) ... Нашел четное число 2 Нашел нечетное число 3 Нашел четное число 4 Нашел нечетное число 5 Нашел четное число 6 Нашел нечетное число 7 Нашел четное число 8 Нашел нечетное число 9
4.
5. проход
Заявления Оператор pass
ничего не делает. Его можно использовать, когда оператор
требуется синтаксически, но программа не требует никаких действий. Например:
>>> пока Истина: ... pass # Занят-ожидание прерывания клавиатуры (Ctrl+C) ...
Обычно используется для создания минимальных классов:
>>> класс MyEmptyClass: ... проходить ...
Еще одно место pass
может быть использовано в качестве заполнителя для функции или
условное тело, когда вы работаете над новым кодом, позволяя вам продолжать думать
на более абстрактном уровне. pass
молча игнорируется:
>>> по умолчанию initlog(*args): ... pass # Не забудьте реализовать это! ...
4.6.
совпадение
операторов Оператор match
принимает выражение и сравнивает его значение с последующим
шаблоны, представленные в виде одного или нескольких блоков case. это на первый взгляд
похож на оператор switch в C, Java или JavaScript (и многие
других языках), но это больше похоже на сопоставление с образцом в
языки, такие как Rust или Haskell. Только первый шаблон, который соответствует
выполняется, а также может извлекать компоненты (элементы последовательности
или атрибуты объекта) из значения в переменные.
Простейшая форма сравнивает предметное значение с одним или несколькими литералами:
по умолчанию http_error(статус): статус матча: случай 400: вернуть "Неверный запрос" дело 404: вернуть "Не найдено" дело 418: вернуть "я чайник" кейс _: вернуть "Что-то не так с интернетом"
Обратите внимание на последний блок: «имя переменной» _
действует как подстановочный знак и
никогда не перестает совпадать. Если ни один случай не совпадает, ни одна из ветвей не выполняется.
Вы можете объединить несколько литералов в один шаблон, используя |
("или"):
кейс 401 | 403 | 404: вернуть "Не разрешено"
Шаблоны могут выглядеть как задания распаковки и использоваться для привязки переменные:
# точка представляет собой кортеж (x, y) пункт совпадения: случай (0, 0): печать("Происхождение") случай (0, у): печать (е "Y = {y}") случай (х, 0): распечатать (ф"Х={х}") случай (х, у): печать (f"X={x}, Y={y}") кейс _: поднять ValueError("Нет точки")
Внимательно изучите это! Первый шаблон имеет два литерала и может
можно рассматривать как расширение буквального шаблона, показанного выше. Но
следующие два шаблона объединяют литерал и переменную, а
переменная связывает значение из субъекта ( точка
). Четвертый
шаблон захватывает два значения, что делает его концептуально похожим на
задание распаковки (x, y) = точка
.
Если вы используете классы для структурирования данных вы можете использовать имя класса, за которым следует список аргументов, напоминающий конструктор, но с возможностью захвата атрибутов в переменные:
класс Точка: х: интервал у: интервал определение где_есть (точка): пункт совпадения: случай Point(x=0, y=0): печать("Происхождение") случай Point(x=0, y=y): печать (е "Y = {y}") случай Point(x=x, y=0): распечатать (ф"Х={х}") случай Точка(): печатать("Где-то еще") кейс _: print("Ни за что")
Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые предоставляют
порядок их атрибутов (например, классы данных). Вы также можете определить конкретный
положение атрибутов в паттернах, установив __match_args__
специальный
атрибут в ваших классах. Если он установлен на («x», «y»), все следующие шаблоны
эквивалентно (и все привязывают атрибут y
к переменной var
):
Точка(1, переменная) Точка(1, у=вар) Точка(х=1, у=вар) Точка (у = вар, х = 1)
Рекомендуемый способ чтения паттернов — смотреть на них как на расширенную форму того, что вы
поставил бы слева от присваивания, чтобы понять, какие переменные будут установлены в
какие.
Только автономные имена (например, var
выше) назначаются оператором соответствия.
Имена с точками (например, foo.bar
), имена атрибутов ( x=
и y=
выше) или имена классов
(обозначаются знаком «(…)» рядом с ними, например, Point
выше) никогда не назначаются.
Шаблоны могут быть произвольно вложены друг в друга. Например, если у нас есть короткий список точек, мы могли бы сопоставить его так:
очков матча: кейс []: print("Нет очков") случай [Точка (0, 0)]: print("Происхождение") case [Точка (x, y)]: print(f"Одна точка {x}, {y}") случай [Точка (0, y1), Точка (0, y2)]: print(f"Два по оси Y в точках {y1}, {y2}") кейс _: печатать("Что-то еще")
Мы можем добавить к шаблону предложение if
, известное как «защита». Если
guard ложно, соответствует
, чтобы попробовать следующий блок case. Примечание
захват этого значения происходит до оценки защиты:
точка совпадения: case Point(x, y), если x == y: print(f"Y=X в {x}") случай Точка (х, у): print(f"Не по диагонали")
Несколько других ключевых особенностей этого утверждения:
Подобно назначениям распаковки, шаблоны кортежей и списков имеют в точности одинаковое значение и фактически соответствуют произвольным последовательностям. Важно исключение состоит в том, что они не соответствуют итераторам или строкам.
Шаблоны последовательности поддерживают расширенную распаковку:
[x, y, *rest]
и(x, y, *остальное)
работают аналогично распаковке заданий. имя после*
также может быть_
, поэтому(x, y, *_)
соответствует последовательности не менее чем из двух элементов без привязки остальных элементов.Шаблоны сопоставления:
{"полоса пропускания": b, "задержка": l}
фиксирует"пропускная способность"
и"задержка"
значений из словаря. В отличие от последовательности шаблоны, лишние ключи игнорируются. Распаковка вроде** остальные
также поддерживается. (Но**_
было бы лишним, поэтому это недопустимо.)Подшаблоны могут быть захвачены с использованием ключевого слова
Случайas
:(точка (x1, y1), точка (x2, y2) как p2): ...
захватит второй элемент ввода как
p2
(пока ввод последовательность из двух точек)Большинство литералов сравниваются на равенство, однако синглтоны
True
,Ложь
иНет
сравниваются по идентичности.Шаблоны могут использовать именованные константы. Это должны быть имена с точками чтобы предотвратить их интерпретацию как переменную захвата:
из импорта enum Enum Цвет класса (перечисление): КРАСНЫЙ = «красный» ЗЕЛЕНЫЙ = «зеленый» СИНИЙ = «синий» color = Color(input("Введите по вашему выбору "красный", "синий" или "зеленый": ")) соответствует цвету: чехол Цвет. КРАСНЫЙ: print("Я вижу красное!") цвет корпуса.ЗЕЛЕНЫЙ: print("Трава зеленая") чехол Цвет.СИНИЙ: print("Меня тошнит :(")
Более подробное объяснение и дополнительные примеры вы можете найти в PEP 636 , который написан в формате учебника.
4.7. Определение функций
Мы можем создать функцию, которая записывает ряд Фибоначчи в произвольное граница:
>>> def fib(n): # записать ряд Фибоначчи до n ... """Выведите ряд Фибоначчи до n.""" ... а, б = 0, 1 ... в то время как a < n: ... печать (а, конец = '') ... а, б = б, а+б ... Распечатать() ... >>> # Теперь вызовите функцию, которую мы только что определили: ... выдумка (2000) 0 1 1 2 3 5 8 13 21 34 55 89144 233 377 610 987 1597
Ключевое слово def
вводит функцию определение . Это должно быть
за которым следует имя функции и список формальных параметров в скобках.
Операторы, формирующие тело функции, начинаются со следующей строки. должны быть с отступом.
Первый оператор тела функции необязательно может быть строковым литералом; этот строковый литерал является строкой документации функции или docstring . (Подробнее о строках документации можно найти в разделе Строки документации.) Существуют инструменты, которые используют строки документации для автоматического создания онлайн или печатных материалов. документацию или позволить пользователю интерактивно просматривать код; это хорошо потренируйтесь включать строки документации в код, который вы пишете, так что сделайте это привычкой.
выполнение функции вводит новую таблицу символов, используемую для локального
переменные функции. Точнее, все присвоения переменных в
функция сохраняет значение в локальной таблице символов; тогда как ссылки на переменные
сначала посмотрите в локальную таблицу символов, затем в локальные таблицы символов
включающие функции, затем в глобальную таблицу символов и, наконец, в таблицу
встроенных имен. Таким образом, глобальные переменные и переменные объемлющих функций
нельзя напрямую присвоить значение внутри функции (если только для глобального
переменные, названные в глобальный оператор
или, для переменных включения
функции, названные в операторе nonlocal
), хотя они могут быть
упоминается.
Фактические параметры (аргументы) вызова функции введены в локальный таблица символов вызываемой функции при ее вызове; таким образом, аргументы передается с использованием вызова по значению (где значение всегда является ссылкой объекта , не стоимость объекта). 1 Когда функция вызывает другую функцию, или вызывает себя рекурсивно, новый для этого вызова создается локальная таблица символов.
Определение функции связывает имя функции с объектом функции в Текущая таблица символов. Интерпретатор распознает объект, на который указывает это имя как определяемая пользователем функция. Другие имена также могут указывать на то же самое. функциональный объект, а также может использоваться для доступа к функции:
>>> выдумка <функция выдумки по адресу 10042ed0> >>> f = выдумка >>> f(100) 0 1 1 2 3 5 8 13 21 34 55 89
Приходя из других языков, вы можете возразить, что фиб
не функция, а
процедура, так как она не возвращает значение. На самом деле, даже работает без
Оператор return
действительно возвращает значение, хотя и довольно скучное. Этот
значение называется None
(это встроенное имя). Запись значения Нет
обычно подавляется интерпретатором, если это единственное записанное значение.
Вы можете увидеть это, если действительно хотите использовать print()
:
>>> выдумка(0) >>> печать (выдумка (0)) Никто
Несложно написать функцию, которая возвращает список номеров Ряд Фибоначчи вместо печати:
>>> def fib2(n): # вернуть ряд Фибоначчи до n ... """Вернуть список, содержащий последовательность Фибоначчи до n. """ ... результат = [] ... а, б = 0, 1 ... в то время как a < n: ... result.append(a) # см. ниже ... а, б = б, а+б ... вернуть результат ... >>> f100 = fib2(100) # вызываем >>> f100 # пишем результат [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
Этот пример, как обычно, демонстрирует некоторые новые возможности Python:
Оператор
return
возвращает значение из функции.возвращает
без аргумента выражения возвращаетNone
. Падает конец функции также возвращаетNone
.Оператор
result.append(a)
вызывает метод объекта спискарезультат
. Метод — это функция, которая «принадлежит» объекту и называетсяobj.methodname
, гдеobj
— некоторый объект (это может быть выражение), аимя_метода
— это имя метода, определяемого типом объекта. Разные типы определяют разные методы. Методы разных типов могут иметь одно и то же имя, не вызывая двусмысленности. (Можно определить самостоятельно типы объектов и методы, используя классы , см. Классы) Методappend()
, показанный в примере, определен для объектов списка; Это добавляет новый элемент в конец списка. В этом примере это эквивалентнорезультат = результат + [a]
, но более эффективный.
4.8. Подробнее об определении функций
Также можно определять функции с переменным числом аргументов. Есть три формы, которые можно комбинировать.
4.8.1. Значения аргумента по умолчанию
Наиболее полезная форма — указать значение по умолчанию для одного или нескольких аргументов. Это создает функцию, которую можно вызвать с меньшим количеством аргументов, чем она есть. определено, чтобы позволить. Например:
def ask_ok (приглашение, повторных попыток = 4, напоминание = 'Пожалуйста, попробуйте еще раз!'): пока верно: ок = ввод (подсказка) если все в порядке ('y', 'ye', 'yes'): вернуть Истина если все в порядке ('n', 'нет', 'нет', 'нет'): вернуть ложь повторы = повторы - 1 если повторных попыток < 0: поднять ValueError('неверный ответ пользователя') распечатать (напоминание)
Эту функцию можно вызвать несколькими способами:
с указанием только обязательного аргумента:
ask_ok('Вы действительно хотите выйти?')
с одним из необязательных аргументов:
ask_ok('Можно перезаписать файл?', 2)
или даже со всеми аргументами:
ask_ok('Хорошо перезаписать файл?', 2, 'Давай, только да или нет!')
В этом примере также вводится ключевое слово в
. Это проверяет, является ли или
не последовательность содержит определенное значение.
Значения по умолчанию оцениваются в точке определения функции в , определяющий область применения , так что
я = 5 защита f (аргумент = я): печать (аргумент) я = 6 е()
напечатает 5
.
Важное предупреждение: Значение по умолчанию оценивается только один раз. Это делает разница, когда по умолчанию используется изменяемый объект, такой как список, словарь или экземпляры большинства классов. Например, следующая функция накапливает аргументы, переданные ему при последующих вызовах:
по определению f(a, L=[]): L. добавить (а) вернуть л печать (ф (1)) печать (ф (2)) печать (ф (3))
Это напечатает
[1] [1, 2] [1, 2, 3]
Если вы не хотите, чтобы значение по умолчанию использовалось для последующих вызовов, вы можете вместо этого напишите такую функцию:
по определению f(a, L=Нет): если L равно None: Л = [] L. добавить (а) вернуть л
4.8.2. Аргументы ключевых слов
Функции также можно вызывать с помощью аргументов ключевого слова.
вида kwarg=значение
. Например, следующая функция:
def parrot (напряжение, состояние = 'жесткий', действие = 'voom', тип = 'норвежский синий'): print("-- Этот попугай не стал бы", action, end=' ') print("если вы поместите", напряжение, "вольты через него.") print("-- Красивое оперение, тип") print("-- Это", состояние, "!")
принимает один обязательный аргумент ( напряжение
) и три необязательных аргумента
( состояние
, действие
и тип
). Эта функция может быть вызвана в любом
одним из следующих способов:
parrot(1000) # 1 позиционный аргумент parrot(voltage=1000) # 1 ключевой аргумент parrot(voltage=1000000, action='VOOOOOM') # 2 ключевых аргумента parrot(action='VOOOOOM', voltage=1000000) # 2 ключевых аргумента parrot('миллион', 'лишенный жизни', 'прыжок') # 3 позиционных аргумента parrot('тысяча', state='раздвигает ромашки') # 1 позиция, 1 ключевое слово
, но все следующие вызовы будут недействительны:
parrot() # отсутствует обязательный аргумент parrot(voltage=5. 0, 'dead') # аргумент без ключевого слова после аргумента ключевого слова parrot(110, voltage=220) # повторяющееся значение для одного и того же аргумента parrot(actor='John Cleese') # неизвестный ключевой аргумент
В вызове функции аргументы ключевого слова должны следовать за позиционными аргументами.
Все переданные аргументы ключевого слова должны соответствовать одному из аргументов
принимается функцией (например, актер
не является действительным аргументом в пользу функция попугая
), и их порядок не важен. Это также включает
необязательные аргументы (например, попугай (напряжение = 1000)
также допустимы).
Ни один аргумент не может принимать значение более одного раза.
Вот пример, который не работает из-за этого ограничения:
>>> функция определения (а): ... проходить ... >>> функция(0, а=0) Traceback (последний последний вызов): Файл "", строка 1, в TypeError: функция() получила несколько значений для аргумента 'a'
При наличии окончательного формального параметра формы **имя
он получает
словарь (см. Типы сопоставления — dict), содержащий все аргументы ключевого слова, кроме
те, которые соответствуют формальному параметру. Это может сочетаться с формальным
параметр вида *имя
(описано в следующем подразделе), который
получает кортеж, содержащий позиционный
аргументы вне списка формальных параметров. ( *имя
должно встречаться
до **имя
.) Например, если мы определим такую функцию:
def cheeseshop(вид, *аргументы, **ключевые слова): print("-- У вас есть", kind, "?") print("-- Извините, у нас все кончилось", kind) для arg в аргументах: печать (аргумент) печать("-" * 40) для кВт в ключевых словах: печать (квт, ":", ключевые слова [квт])
Можно было бы назвать так:
cheeseshop("Лимбургер", "Очень жидко, сэр.", «Он действительно очень, ОЧЕНЬ жидкий, сэр». владелец магазина = "Майкл Пэйлин", клиент = "Джон Клиз", sketch="Эскиз сырной лавки")
и, конечно же, будет напечатано:
.-- У вас есть Лимбургер ? -- Извините, мы все из Лимбургера Он очень жидкий, сэр. Он действительно очень, ОЧЕНЬ жидкий, сэр. ---------------------------------------- владелец магазина: Майкл Пэйлин клиент: Джон Клиз эскиз : Эскиз сырного магазина
Обратите внимание, что порядок, в котором печатаются аргументы ключевого слова, гарантирован. чтобы соответствовать порядку, в котором они были предоставлены в вызове функции.
4.8.3. Специальные параметры
По умолчанию аргументы могут быть переданы в функцию Python либо по позиции или явно по ключевому слову. Для удобочитаемости и производительности имеет смысл ограничить способ передачи аргументов, чтобы разработчику нужно было только смотреть в определении функции, чтобы определить, передаются ли элементы по положению, по положение или ключевое слово, или по ключевому слову.
Определение функции может выглядеть так:
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): ----------- ---------- ---------- | | | | Позиционное или ключевое слово | | - Только ключевое слово -- Только позиционное
, где /
и *
являются необязательными. Если они используются, эти символы указывают на тип
параметр тем, как аргументы могут быть переданы в функцию:
только позиционные, позиционные или ключевые слова и только ключевые слова. Параметры ключевого слова
также называются именованными параметрами.
4.8.3.1. Позиционные или ключевые аргументы
Если /
и *
отсутствуют в определении функции, аргументы могут
передаваться в функцию по позиции или по ключевому слову.
4.8.3.2. Только позиционные параметры
Если посмотреть на это немного подробнее, то можно отметить определенные параметры
как позиционно-только . Если позиционно-только , порядок параметров имеет значение, и
параметры не могут быть переданы по ключевому слову. Только позиционные параметры
ставится перед /
(косая черта). /
используется для логического
отделить позиционные параметры от остальных параметров.
Если нет /
в определении функции нет позиционных-только
параметры.
Параметры, следующие за /
, могут быть позиционными или ключевыми словами или только ключевыми словами .
4.8.3.3. Аргументы, содержащие только ключевые слова
Чтобы пометить параметры как только ключевое слово , указав, что параметры должны быть переданы
по аргументу ключевого слова, поместите *
в список аргументов непосредственно перед первым Параметр , содержащий только ключевое слово.
4.8.3.4. Примеры функций
Рассмотрим следующие примеры определений функций, обращая особое внимание на
маркеры /
и *
:
>>> по умолчанию стандартный_аргумент (аргумент): ... печать (аргумент) ... >>> def pos_only_arg(arg, /): ... печать (аргумент) ... >>> def kwd_only_arg(*, arg): ... печать (аргумент) ... >>> def Combined_example(pos_only, /, standard, *, kwd_only): ... print(pos_only, standard, kwd_only)
Первое определение функции, standard_arg
, самая знакомая форма,
не накладывает ограничений на соглашение о вызовах, и аргументы могут быть
передано по позиции или ключевому слову:
>>> стандартный_аргумент (2) 2 >>> стандартный_аргумент (аргумент = 2) 2
Вторая функция pos_only_arg
ограничена использованием только позиционных
параметры, так как в определении функции есть /
:
>>> pos_only_arg(1) 1 >>> pos_only_arg(arg=1) Traceback (последний последний вызов): Файл "", строка 1, в TypeError: pos_only_arg() получил некоторые позиционные аргументы, переданные как аргументы ключевого слова: 'arg'
Третья функция kwd_only_args
допускает только аргументы ключевых слов, как указано
на *
в определении функции:
>>> kwd_only_arg(3) Traceback (последний последний вызов): Файл "", строка 1, в TypeError: kwd_only_arg() принимает 0 позиционных аргументов, но был задан 1 >>> kwd_only_arg(arg=3) 3
И последний использует все три соглашения о вызовах в одной и той же функции определение:
>>> комбинированный_пример (1, 2, 3) Traceback (последний последний вызов): Файл "", строка 1, в TypeError: Combine_example() принимает 2 позиционных аргумента, но было задано 3 >>> комбинированный_пример(1, 2, kwd_only=3) 1 2 3 >>> комбинированный_пример(1, стандартный=2, kwd_only=3) 1 2 3 >>> комбинированный_пример (pos_only=1, стандарт=2, kwd_only=3) Traceback (последний последний вызов): Файл " ", строка 1, в TypeError: в Combined_example() некоторые позиционные аргументы передаются как аргументы ключевого слова: 'pos_only'
Наконец, рассмотрим это определение функции, которое имеет потенциальную коллизию между позиционным аргументом name
и **kwds
, у которого name
в качестве ключа:
определение foo(имя, **kwds): вернуть «имя» в kwds
Нет возможного вызова, который заставит его вернуть True
в качестве ключевого слова 'имя'
всегда будет привязан к первому параметру. Например:
>>> foo(1, **{'имя': 2}) Traceback (последний последний вызов): Файл "", строка 1, в TypeError: foo() получил несколько значений для аргумента «имя» >>>
Но с использованием /
(только позиционные аргументы) это возможно, поскольку он позволяет имя
в качестве позиционного аргумента и «имя»
в качестве ключа в аргументах ключевого слова:
def foo(имя, /, **kwds): вернуть «имя» в kwds >>> foo(1, **{'имя': 2}) Истинный
Другими словами, имена позиционных параметров могут использоваться в **kwds
без двусмысленности.
4.8.3.5. Резюме
Вариант использования определяет, какие параметры использовать в определении функции:
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
В качестве руководства:
Используйте только позиционные, если вы хотите, чтобы имена параметров не доступны пользователю. Это полезно, когда имена параметров не имеют реального значение, если вы хотите обеспечить порядок аргументов, когда функция или если вам нужно взять некоторые позиционные параметры и произвольные ключевые слова.
Используйте только ключевые слова, когда имена имеют смысл и определение функции более понятным, указав имена или вы хотите предотвратить пользователи полагаются на позицию передаваемого аргумента.
Для API используйте только позиционирование, чтобы предотвратить критические изменения API если имя параметра будет изменено в будущем.
4.8.4. Списки произвольных аргументов
Наконец, наименее часто используемый параметр — указать, что функция может быть вызывается с произвольным количеством аргументов. Эти аргументы будут упакованы вверх в кортеже (см. Кортежи и последовательности). Перед переменным числом аргументов может встречаться ноль или более нормальных аргументов.
def write_multiple_items(файл, разделитель, *аргументы): file.write(разделитель.join(аргументы))
Обычно эти вариативные аргументы будут последними в списке формальных
параметры, потому что они собирают все оставшиеся входные аргументы, которые
передается в функцию. Любые формальные параметры, которые встречаются после *args
являются аргументами «только для ключевого слова», что означает, что они могут использоваться только как
ключевые слова, а не позиционные аргументы.
>>> def concat(*args, sep="/"): ... вернуть sep.join(аргументы) ... >>> concat("земля", "марс", "венера") 'земля/марс/венера' >>> concat("Земля", "Марс", "Венера", sep=".") 'земля.марс.венера'
4.8.5. Распаковка списков аргументов
Обратная ситуация возникает, когда аргументы уже находятся в списке или кортеже
но должны быть распакованы для вызова функции, требующей отдельного позиционного
аргументы. Например, встроенная функция range()
ожидает отдельного начинают и останавливают аргументов. Если их нет отдельно, напишите
вызов функции с оператором *
для распаковки аргументов из списка
или кортеж:
>>> list(range(3, 6)) # обычный вызов с отдельными аргументами [3, 4, 5] >>> аргументы = [3, 6] >>> list(range(*args)) # вызов с аргументами, распакованными из списка [3, 4, 5]
Таким же образом словари могут предоставлять аргументы ключевых слов с **
-оператор:
>>> def parrot(voltage, state='a hard', action='voom'): . .. print("-- Этот попугай не стал бы", action, end=' ') ... print("если положить", напряжение, "вольт через него.", end=' ') ... print("Е", состояние, "!") ... >>> d = {"voltage": "четыре миллиона", "state": "погиб", "action": "VOOM"} >>> попугай(**d) -- Этот попугай не БУДЕТ, если через него пропустить четыре миллиона вольт. E's bleedin 'умер!
4.8.6. Лямбда-выражения
Небольшие анонимные функции можно создавать с помощью ключевого слова lambda
.
Эта функция возвращает сумму двух своих аргументов: lambda a, b: a+b
.
Лямбда-функции можно использовать везде, где требуются функциональные объекты. Они есть
синтаксически ограничивается одним выражением. Семантически они просто
синтаксический сахар для нормального определения функции. Как вложенная функция
определений, лямбда-функции могут ссылаться на переменные из содержащего
объем:
>>> определение make_incrementor(n): ... вернуть лямбда x: x + n ... >>> f = make_incrementor(42) >>> ф(0) 42 >>> ф(1) 43
В приведенном выше примере используется лямбда-выражение для возврата функции. Другое использование это передать небольшую функцию в качестве аргумента:
>>> пары = [(1, 'один'), (2, 'два'), (3, 'три'), (4, 'четыре')] >>> pairs.sort (ключ = лямбда-пара: пара [1]) >>> пары [(4, 'четыре'), (1, 'один'), (3, 'три'), (2, 'два')]
4.8.7. Строки документации
Вот некоторые соглашения о содержании и форматировании документации струны.
Первая строка всегда должна быть кратким, кратким описанием объекта. цель. Для краткости не следует явно указывать имя или тип объекта. так как они доступны другими способами (за исключением случаев, когда имя является глагол, описывающий работу функции). Эта строка должна начинаться с большой буквы букву и заканчивать точкой.
Если в строке документации больше строк, вторая строка должна быть пустой, визуально отделяющий сводку от остального описания. следующие строки должны быть одним или несколькими абзацами, описывающими вызов объекта условности, его побочные эффекты и т. д.
Синтаксический анализатор Python не удаляет отступы из многострочных строковых литералов в Python, поэтому инструменты, обрабатывающие документацию, должны удалять отступы, если желанный. Это делается с использованием следующего соглашения. Первая непустая строка после первая строка строки определяет величину отступа для вся строка документации. (Мы не можем использовать первую строку, так как она обычно рядом с открывающими кавычками строки, поэтому ее отступ не очевидно в строковом литерале.) Пробелы, «эквивалентные» этому отступу, затем с самого начала удаляются все строки строки. Линии, которые отступ меньше не должен встречаться, но если они встречаются, все их начальные пробелы следует раздеться. Эквивалентность пробелов должна быть проверена после расширения табов (до 8 пробелов, обычно).
Вот пример многострочной строки документации:
>>> определение my_function(): ..."""Ничего не делайте, но документируйте это. ... ... Нет, правда, ничего не делает. ... """ ... проходить ... >>> print(my_function.__doc__) Ничего не делайте, но документируйте это. Нет, правда, ничего не делает.
4.8.8. Аннотации функций
Аннотации функций являются полностью необязательными метаданными. информация о типах, используемых пользовательскими функциями (см. ПЭП 3107 и PEP 484 для получения дополнительной информации).
Аннотации хранятся в __аннотациях__
атрибут функции как словарь и не влияет ни на какую другую часть
функция. Аннотации параметров определяются двоеточием после имени параметра, за которым следует
выражением, вычисляющим значение аннотации. Возвращаемые аннотации
определяется литералом ->
, за которым следует выражение между параметром
список и двоеточие, обозначающее конец 9Заявление 0047 по умолчанию .
следующий пример имеет обязательный аргумент, необязательный аргумент и возвращаемое значение
аннотированное значение:
>>> def f(ветчина: ул, яйца: ул = 'яйца') -> ул: ... print("Аннотации:", f.__annotations__) ... print("Аргументы:", ветчина, яйца) ... вернуть ветчину + ' и ' + яйца ... >>> f('спам') Аннотации: {'ветчина':, 'return': <класс 'str'>, 'яйца': } Аргументы: спам-яйца спам и яйца
4.
9. Интермеццо: стиль кодированияТеперь, когда вы собираетесь писать более длинные и сложные фрагменты Python, самое время поговорить о стиле кодирования . На большинстве языков можно писать (или более лаконичный, отформатированный ) в разных стилях; некоторые более читабельны, чем другие. Всегда полезно сделать так, чтобы другие могли легко читать ваш код. хороший стиль кодирования очень помогает в этом.
Для Python PEP 8 стал руководством по стилю, которого придерживается большинство проектов; он способствует очень читабельному и приятному для глаз стилю кодирования. Каждый питон разработчик должен прочитать его в какой-то момент; вот самые важные моменты извлечено для вас:
Используйте отступы в 4 пробела и без табуляции.
4 пробела — хороший компромисс между небольшими отступами (позволяет увеличить глубина вложенности) и большие отступы (легче читать). Вкладки представляют путаницы, и их лучше не использовать.
Переносите строки так, чтобы их длина не превышала 79 символов.
Это помогает пользователям с небольшими дисплеями и позволяет иметь несколько файлы кода рядом на больших дисплеях.
Используйте пустые строки для разделения функций и классов, а также больших блоков код внутри функций.
По возможности размещайте комментарии на отдельной строке.
Использовать строки документации.
Используйте пробелы вокруг операторов и после запятых, но не непосредственно внутри конструкции скобок:
a = f(1, 2) + g(3, 4)
.Назовите свои классы и функции последовательно; соглашение заключается в использовании
UpperCamelCase
для классов иlowercase_with_underscores
для функций и методы. Всегда используйтеself
как имя для первого аргумента метода (дополнительную информацию о классах и методах см. в разделе Первый взгляд на классы).