Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 99
Текст из файла (страница 99)
Раз уж мызанялись изучением необычных инструкций, заодно рассмотрим здесь частьelse, потому что она некоторым образом связана с инструкцией break, и заоднопустую инструкцию-заполнитель pass (которая не имеет прямого отношенияк циклам, а относится к категории простых инструкций, состоящих из одногослова).
В языке Python:breakПроизводит переход за пределы объемлющего цикла (всей инструкции цикла).continueПроизводит переход в начало цикла (в строку заголовка).passНичего не делает: это пустая инструкция, используемая как заполнитель.Блок elseВыполняется, только если цикл завершился обычным образом (без использования инструкции break).Общий формат циклаС учетом инструкций break и continue цикл while в общем виде выглядит, какпоказано ниже:while <test1>:<statements1>if <test2>: break# Выйти из цикла, пропустив часть elseif <test3>: continue # Перейти в начало цикла, к выражению test1else:<statements2># Выполняется, если не была использована# инструкция ‘break’Инструкции break и continue могут появляться в любом месте внутри тела цикла while (или for), но как правило, они используются в условных инструкцияхif, чтобы выполнить необходимое действие в ответ на некоторое условие.395break, continue, pass и elseОбратимся к нескольким простым примерам, чтобы увидеть, как эти инструкции используются на практике.passИнструкция pass не выполняет никаких действий и используется в случаях,когда синтаксис языка требует наличия инструкции, но никаких полезныхдействий в этой точке программы выполнить нельзя.
Она часто используетсяв качестве пустого тела составной инструкции. Например, создать бесконечный цикл, который ничего не делает, можно следующим образом:while 1: pass# Нажмите Ctrl-C, чтобы прервать цикл!Поскольку тело цикла – это всего лишь пустая инструкция, интерпретатор«застрянет» в этом цикле. Грубо говоря, pass в мире инструкций – это то же,что None в мире объектов, – явное ничто. Обратите внимание, что тело этогоцикла while находится в той же строке, что и заголовок, после двоеточия. Каки в случае с инструкцией if, такой прием можно использовать только в случае,когда тело цикла образует несоставная инструкция.Этот пример вечно делает «ничто».
Вероятно, это самая бесполезная программа (если только вы не хотите погреться у своего ноутбука в холодный зимнийдень!), которая когда-либо была написана на языке Python, и, тем не менее,я не смог придумать лучший пример применения инструкции pass.Далее мы увидим, где эта инструкция может использоваться с большим смыслом, например, для того, чтобы игнорировать исключение в инструкции try,или для определения пустых классов, реализующих объекты, которые ведутсебя подобно структурам и записям в других языках. Иногда инструкция passиспользуется как заполнитель, вместо того, «что будет написано позднее»,и в качестве временного фиктивного тела функций:def func1():pass# Реализация функции будет добавлена позжеdef func2():passЗадание пустого тела функции вызовет синтаксическую ошибку, поэтому в подобных ситуациях можно использовать инструкцию pass.Примечание, касающееся различий между версиями: В версииPython 3.0 (но не в 2.6) вместо любого выражения допускаетсяиспользовать многоточие ...
(буквально, три точки, следующиедруг за другом). Многоточие само по себе не выполняет никакихдействий, поэтому его можно использовать как альтернативуинструкции pass, в частности вместо программного кода, который будет написан позднее, – своего рода примечание «TBD» (ToBe Done – подлежит реализации) на языке Python:def func1():...def func2():...func1()# Альтернатива инструкции pass# При вызове не выполняет никаких действий396Глава 13.
Циклы while и forМноготочие может также присутствовать в одной строке с заголовком инструкции и использоваться для инициализациипеременных, когда не требуется указывать значение какого-тоопределенного типа:def func1(): ...def func2(): ...# Может также присутствовать в той же строке>>> X = ...>>> XEllipsis# Альтернатива объекту NoneТакая форма записи впервые появилась в версии Python 3.0(и может использоваться гораздо шире своего основного предназначения – в расширенных операциях извлечения среза).Возможно, со временем в подобных ситуациях многоточие получит более широкое распространение, чем инструкция passи объект None.continueИнструкция continue вызывает немедленный переход в начало цикла.
Она иногда позволяет избежать использования вложенных инструкций. В следующемпримере инструкция continue используется для пропуска нечетных чисел. Этотфрагмент выводит четные числа меньше 10 и больше или равные 0. Вспомним,что число 0 означает ложь, а оператор % вычисляет остаток от деления, поэтомуданный цикл выводит числа в обратном порядке, пропуская значения, не кратные 2 (он выводит 8 6 4 2 0):x = 10while x:x = x-1if x % 2 != 0: continueprint(x, end=’ ‘)# Или, x -= 1# Нечетное? – пропустить выводТак как инструкция continue выполняет переход в начало цикла, нам не потребовалось вкладывать инструкцию print в инструкцию if – она будет задействована, только если инструкция continue не будет выполнена.
Если она напоминает вам инструкцию «goto», имеющуюся в других языках, то это справедливо. В языке Python нет инструкции «goto», но так как инструкция continueпозволяет выполнять переходы внутри программы, большинство замечаний,касающихся удобочитаемости и простоты сопровождения, которые вы моглислышать в отношении инструкции «goto», применимы и к инструкции continue. Не злоупотребляйте использованием этой инструкции, особенно когда вытолько начинаете работать с языком Python. Например, последний пример выглядел бы понятнее, если бы инструкция print была вложена в инструкцию if:x = 10while x:x = x-1if x % 2 == 0:# Четное? - вывестиprint(x, end=’ ‘)break, continue, pass и else397breakИнструкция break вызывает немедленный выход из цикла.
Так как программный код, следующий в цикле за этой инструкцией, не выполняется, если этаинструкция запущена, то ее также можно использовать, чтобы избежать вложения. Например, ниже приводится простой интерактивный цикл (вариантболее крупного примера, рассматривавшегося в главе 10), где производитсяввод данных с помощью функции input (raw_input в Python 2.6) и производитсявыход из цикла, если в ответ на запрос имени будет введена строка «stop»:>>> while 1:...name = input(‘Enter name:’)...if name == ‘stop’: break...age = input(‘Enter age: ‘)...print(‘Hello’, name, ‘=>’, int(age) ** 2)...Enter name:melEnter age: 40Hello mel => 1600Enter name:bobEnter age: 30Hello bob => 900Enter name:stopОбратите внимание, как в этом примере выполняется преобразование строкиage в целое число с помощью функции int, перед тем как возвести его во вторуюстепень.
Как вы помните, это совершенно необходимо, потому что функция input возвращает ввод пользователя в виде строки. В главе 35 вы увидите, чтофункция input также возбуждает исключение при получении символа концафайла (например, когда пользователь нажимает комбинацию клавиш Ctrl-Zили Ctrl-D).
Если это может иметь влияние, оберните вызов функции input инструкцией try.elseПри объединении с частью else инструкция break часто позволяет избавитьсяот необходимости сохранять флаг состояния поиска, как это делается в других языках программирования. Например, следующий фрагмент определяет,является ли положительное целое число y простым числом, выполняя поискделителей больше 1:x = y // 2# Для значений y > 1while x > 1:if y % x == 0:# Остатокprint(y, ‘has factor’, x)break# Перешагнуть блок elsex -= 1else:# Нормальное завершение циклаprint(y, ‘is prime’)Вместо того чтобы устанавливать флаг, который будет проверен по окончаниицикла, достаточно вставить инструкцию break в месте, где будет найден делитель.
При такой реализации управление будет передано блоку else, толькоесли инструкция break не была выполнена, то есть когда с уверенностью можносказать, что число является простым.398Глава 13. Циклы while и forБлок else цикла выполняется также в том случае, когда тело цикла ни разу невыполнялось, поскольку в этой ситуации инструкция break также не выполняется. В циклах while это происходит, когда первая же проверка условия в заголовке дает ложное значение. Вследствие этого в предыдущем примере будетполучено сообщение «is prime» (простое число), если изначально x меньше илиравно 1 (то есть, когда y равно 2).Этот пример определяет простые числа, но недостаточно точно.Числа, меньшие 2, не считаются простыми в соответствии сострогим математическим определением.