Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 98
Текст из файла (страница 98)
В простейшем случае эту особенность можно использовать для назначения значения по умолчанию – следующая инструкция присвоит переменнойX значение переменной A, если оно истинно (или непустое), и default –в противном случае:X = A or defaultТакже важно осознать, как выполняются вычисления по сокращеннойсхеме, потому что справа от логического оператора может находитьсяфункция, выполняющая важную работу или оказывающая побочноевлияние, вызов которой не произойдет из-за действия правила вычисления по сокращенной схеме:if f1() or f2(): ...В данном случае, если функция f1 вернет истинное (или непустое) значение, интерпретатор никогда не вызовет функцию f2. Чтобы гарантировать вызов обеих функций, можно вызвать их до применения оператора or:tmp1, tmp2 = f1(), f2()if tmp1 or tmp2: ...390Глава 12.
Условная инструкция if и синтаксические правилаВы уже видели другой вариант использования такого поведения: благодаря особенностям работы логических операторов выражение ((A and B)or C) может использоваться для достаточно близкой (смотрите обсуждение этой инструкции выше) имитации инструкции if/else.Другие случаи логических значений мы уже видели в предыдущих главах. Как мы видели в главе 9, вследствие того, что все объекты могутрасцениваться как истинные или ложные значения, в языке Python легко и просто выполнить проверку объекта напрямую (if X:) вместо того,чтобы сравнивать его с пустым значением (if X != ‘’:).
В случае строк этидве проверки равнозначны. Мы также узнали в главе 5, что логическиезначения True и False являются обычными целыми числами 1 и 0 и могутиспользоваться для инициализации переменных (X = False), в условныхвыражениях циклов (while True:) и для отображения результатов в интерактивном сеансе.Кроме того, в шестой части, при обсуждении темы перегрузки операторов мы увидим, что в определениях новых типов объектов с помощьюклассов имеется возможность определять их логическую природу с помощью методов __bool__ и __len__ (метод __bool__ в версии 2.6 носит имя__nonzero__).
Если первый метод отсутствует в определении класса, дляпроверки истинности объекта используется второй метод – если возвращаемая длина равна нулю, объект считается ложным, так как пустыеобъекты всегда считаются ложными.В заключениеВ этой главе мы познакомились с инструкцией if языка Python. Так как этобыла первая составная инструкция на нашем пути, мы попутно рассмотрелиобщие синтаксические правила языка Python��������������������������������������������������������������������и поближе познакомились с операциями проверки истинности.
Кроме того, мы также узнали, как в языкеPython реализуется множественное ветвление, и изучили форму выраженийif/else, которая впервые появилась в версии Python 2.5.В следующей главе мы продолжим изучение процедурных инструкций и рассмотрим циклы while и for. Там будет рассказано об альтернативных способахпрограммирования циклов в языке Python, каждый из которых имеет своипреимущества. Но перед этим вас ждут обычные контрольные вопросы главы.Закрепление пройденногоКонтрольные вопросы1. Как в языке Python можно оформить множественное ветвление?2. Как в языке Python можно оформить инструкцию if/else в виде выражения?3. Как можно разместить одну инструкцию в нескольких строках?4.
Что означают слова True и False?Закрепление пройденного391Ответы1. Самый простой, хотя и не самый краткий способ организации множественного ветвления заключается в использовании инструкции if с несколькими частями elif. Нередко того же результата можно добиться с помощьюоперации индексирования в словаре, особенно если учесть, что словаримогут содержать функции, созданные с помощью инструкций def или выражений lambda.2. В версии Python 2.5 выражение Y if X else Z возвращает Y, если X имеет истинное значение, или Z – в противном случае. Это выражение эквивалентноинструкции if из четырех строк.
Комбинация операторов and/or ((X and Y)or Z) может действовать точно так же, но она менее понятна и требует, чтобычасть Y имела истинное значение.3. Обернув инструкцию синтаксически уместной парой скобок ((), [], или {}),можно расположить ее на нескольких строках – инструкция будет считаться законченной, когда интерпретатор обнаружит правую закрывающуюскобку.
Строки инструкции, со второй и далее, могут иметь любые отступы.4. True и False – это всего лишь версии целых чисел 1 и 0 соответственно. В языке Python они обозначают истинные и ложные значения. Они могут использоваться в операциях проверки истинности и для инициализации переменных, а также выводиться как результаты выражений в интерактивномсеансе.Глава13.Циклы while и forВ этой главе мы встретимся с двумя основными конструкциями организациициклов в языке Python – инструкциями, которые выполняют одну и ту же последовательность действий снова и снова.
Первая из них, инструкция while,обеспечивает способ организации универсальных циклов; вторая, инструкцияfor, предназначена для обхода элементов в последовательностях и выполненияблока программного кода для каждого из них.Ранее мы уже встречались с этими инструкциями, но в этой главе мы получимболее полное представление о них. Кроме того, мы попутно рассмотрим некоторые менее известные инструкции, используемые в циклах, такие как breakи continue, и встроенные функции, такие как range, zip и map, которые используются вместе с циклами.В языке Python существуют и другие способы организации циклов, но инструкции while и for, которые описываются здесь, являются основными синтаксическими элементами, предоставляющими возможность программирования повторяющихся действий.
Тема итераций будет продолжена в следующейглаве, где мы исследуем родственные концепции протокола итераций в языкеPython (используется инструкцией for). В последующих главах мы займемсяисследованием еще более экзотических инструментов организации циклов,таких как генераторы, функции filter и reduce. Но пока начнем с самого простого.Циклы whileИнструкция while является самой универсальной конструкцией организацииитераций в языке Python. Проще говоря, она продолжает выполнять блок инструкций (обычно с отступами) до тех пор, пока условное выражение продолжает возвращать истину.
Она называется «циклом», потому что управлениециклически возвращается к началу инструкции, пока условное выражениене вернет ложное значение. Как только в результате проверки будет полученоложное значение, управление будет передано первой инструкции, расположенной сразу же за вложенным блоком тела цикла while. В результате тело циклапродолжает выполняться снова и снова, пока условное выражение возвращает393Циклы whileистинное выражение, а если условное выражение сразу вернет ложное значение, тело цикла никогда не будет выполнено.Общий форматВ своей наиболее сложной форме инструкция while состоит из строки заголовкас условным выражением, тела цикла, содержащего одну или более инструкций с отступами, и необязательной части else, которая выполняется, когдауправление передается за пределы цикла без использования инструкции break.Интерпретатор продолжает вычислять условное выражение в строке заголовкаи выполнять вложенные инструкции в теле цикла, пока условное выражениене вернет ложное значение:while <test>:<statements1>else:<statements2>#####Условное выражение testТело циклаНеобязательная часть elseВыполняется, если выход из цикла производится неинструкцией breakПримерыДля иллюстрации рассмотрим несколько простых циклов while в действии.Первый, который содержит инструкцию print, вложенную в цикл while, простовыводит сообщение до бесконечности.
Не забывайте, что True – это всего лишьособая версия целого числа 1, и оно обозначает истинное значение, поэтомурезультатом этого условного выражения всегда будет истина, и интерпретаторбесконечно будет выполнять тело цикла, пока вы не прервете его выполнение.Такие циклы обычно называются бесконечными:>>> while True:...print(‘Type Ctrl-C to stop me!’)Следующий фрагмент продолжает вырезать из строки первый символ, покаона не опустеет и в результате не превратится в ложное значение.
Это обычная практика – проверка истинности объектов осуществляется непосредственно вместо использования более растянутого эквивалента (while x != ‘’:). Далеев этой главе мы рассмотрим другие способы обхода элементов строки с помощью цикла for.>>> x = ‘spam’>>> while x:# Пока x не пустая строка...print(x, end=’ ‘)...x = x[1:] # Вырезать первый символ из x...spam pam am mОбратите внимание на именованный аргумент end=’ ‘, который обеспечиваетвывод значений в одну строку через пробел. Если вы забыли, чем это объясняется, обращайтесь к главе 11. Следующий фрагмент перебирает значения отa до b, не включая значение b.
Ниже мы рассмотрим более простой способ выполнения этих же действий с помощью цикла for и встроенной функции range:>>> a=0; b=10>>> while a < b:# Один из способов организации циклов перечисления...print(a, end=’ ‘)...a += 1# Или, a = a + 1394Глава 13. Циклы while и for...0 1 2 3 4 5 6 7 8 9Наконец, обратите внимание, что в языке Python отсутствует цикл «do until»,имеющийся в других языках программирования. Однако его можно имитировать, добавив в конец тела цикла условную инструкцию и инструкцию break:while True:...тело цикла...if exitTest(): breakЧтобы окончательно понять, как эта структура работает, нам необходимо перейти к следующему разделу и поближе познакомиться с инструкцией break.break, continue, pass и elseТеперь, когда мы познакомились с несколькими циклами в действии, настало время обратить внимание на две простые инструкции, которые могут использоваться только внутри циклов – инструкции break и continue.