Главная страница
Навигация по странице:

  • [ ] and { } [ ]>>> 3 and [ ]

  • Трехместное выражение if/else

  • A = t if spam else f

  • Придется держать в уме: логические значения

  • Закрепление пройденного Контрольные вопросы

  • Математический анализ. 3е издание


    Скачать 4.86 Mb.
    Название3е издание
    АнкорМатематический анализ
    Дата04.02.2022
    Размер4.86 Mb.
    Формат файлаpdf
    Имя файлаpython_01.pdf
    ТипДокументы
    #351981
    страница40 из 98
    1   ...   36   37   38   39   40   41   42   43   ...   98
    2 and 3, 3 and 2 # Вернет левый операнд, если он имеет ложное значение
    (3, 2) # Иначе вернет правый операнд (истинный или ложный)
    >>> [ ] and { }
    [ ]
    >>> 3 and [ ]
    [ ]
    Здесь в первой строке оба операнда имеют истинные значения, поэто
    му интерпретатор вычислит оба операнда и вернет объект справа. Во второй проверке левый операнд имеет ложное значение ([]), поэтому интерпретатор останавливает вычисления и возвращает его в качестве результата проверки. В последней проверке левый операнд имеет ис
    тинное значение (3), поэтому интерпретатор вычисляет и возвращает объект справа (который имеет ложное значение []).
    Конечный результат будет тот же, что и в языке C и во многих других языках, – вы получаете значение, которое логически интерпретирует
    ся как истина или ложь при использовании в инструкции if или while.
    Однако в языке Python логические операторы возвращают либо ле
    вый, либо правый объект, а не простое целочисленное значение.
    Такое поведение операторов and и or может показаться странным на первый взгляд, поэтому загляните во врезку «Придется держать в уме:
    логические значения», где вы найдете примеры, как иногда эта осо
    бенность может использоваться программистами на языке Python.
    Трехместное выражение if/else
    Одна из основных ролей логических операторов в языке Python заклю
    чается в образовании выражений, которые выполняются так же, как условная инструкция if. Рассмотрим следующую инструкцию, кото
    рая записывает в A значение Y или Z в зависимости от истинности зна
    чения X:
    if X:
    A = Y
    else:
    A = Z
    Иногда, как в данном примере, элементы инструкции настолько про
    сты, что кажется излишеством тратить на них четыре строки. В неко
    торых случаях у нас может появиться желание вложить такую конст

    326
    Глава 12. Условная инструкция if рукцию внутрь другой инструкции вместо того, чтобы выполнять при
    сваивание переменной. По этим причинам (и, откровенно говоря, пото
    му что в языке C имеется похожая возможность
    1
    ) в версии Python 2.5
    появилась новая конструкция, позволяющая записать те же действия в виде единственного выражения:
    A = Y if X else Z
    Данное выражение дает тот же результат, что и предыдущая инструк
    ция if, но выглядит она проще. Как и в предыдущей инструкции, ин
    терпретатор выполняет выражение Y, только если проверка if X дает истинное значение, а выражение Z выполняется, только если проверка if X
    дает ложное значение. То есть вычисления здесь также выполня
    ются по сокращенной схеме. Ниже приводятся несколько примеров выражения в действии:
    >>> A = 't' if 'spam' else 'f' # Непустая строка – это истина
    >>> A
    't'
    >>> A = 't' if '' else 'f'
    >>> A
    'f'
    До версии Python 2.5 (да и после) тот же эффект можно было получить за счет комбинирования операторов and и or благодаря тому, что они возвращают объект слева или справа:
    A = ((X and Y) or Z)
    Этот прием работает, но он скрывает в себе ловушку – он предполага
    ет, что Y будет иметь истинное значение. В этом случае эффект будет тот же самый: оператор and выполнится первым и вернет Y, если X име
    ет истинное значение. В противном случае оператор or просто вернет Z.
    Другими словами, мы получаем: «if X then Y else Z».
    Эта комбинация операторов and/or требует некоторого времени, чтобы осознать ее при первом знакомстве, но, начиная с версии 2.5, надоб
    ность в таком приеме отпала, так как существует более наглядная кон
    струкция Y if X else Z, которую можно использовать в качестве выра
    жения. Если же составляющие достаточно сложны, лучше использо
    вать полноценную инструкцию if.
    В качестве дополнительного примечания: в языке Python следующее выражение дает похожий эффект – благодаря тому, что функция bool
    1
    В действительности, порядок следования операндов в выражении X if Y
    else Z
    в языке Python несколько отличается от выражения Y ? X : Z в язы
    ке C. Такой порядок был выбран в соответствии с анализом наиболее рас
    пространенных шаблонов программирования в языке Python, а также от
    части, чтобы помочь бывшим программистам на языке C избавиться от привычки злоупотреблять этим выражением. Не забывайте, что в языке
    Python исповедуется принцип – чем проще, тем лучше.

    Проверка истинности
    327
    преобразует X в соответствующее целое число 1 или 0, которое затем используется для выбора требуемого значения из списка:
    A = [Z, Y][bool(X)]
    Придется держать в уме: логические значения
    В языке Python часто используется прием выбора одного объек
    та из множества, основанный на необычном поведении логиче
    ских операторов. Следующая инструкция:
    X = A or B or C or None присвоит переменной X первый непустой (имеющий истинное значение) объект из множества объектов A, B и C или None, если все эти объекты окажутся пустыми. Этот прием стал возможен благодаря тому, что оператор or возвращает один из двух объек
    тов и, как оказывается, это весьма распространенная парадигма программирования на языке Python: чтобы выбрать непустой объект из фиксированного множества, достаточно просто объ
    единить их в выражение с помощью оператора or.
    Также важно осознать, как выполняются вычисления по сокра
    щенной схеме, потому что справа от логического оператора мо
    жет находиться функция, выполняющая важную работу или оказывающая побочное влияние, вызов которой не произойдет изза действия правила вычисления по сокращенной схеме:
    if f1() or f2(): ...
    В данном случае, если функция f1 вернет истинное (или непус
    тое) значение, интерпретатор никогда не вызовет функцию f2.
    Чтобы гарантировать вызов обеих функций, можно вызвать их до применения оператора or:
    tmp1, tmp2 = f1(), f2()
    if tmp1 or tmp2: ...
    Вы уже видели другой вариант использования такого поведе
    ния: благодаря особенностям работы логических операторов вы
    ражение ((A and B) or C) может использоваться для имитации инструкции if/else.
    Кроме того, обратите внимание: вследствие того, что все объекты могут расцениваться как истинные или ложные значения, в язы
    ке Python легко и просто выполнить проверку объекта напрямую
    (if X:) вместо того, чтобы сравнивать его с пустым значением
    (if X != '':). В случае строк эти две проверки равнозначны.

    328
    Глава 12. Условная инструкция if
    Например:
    >>> ['f', 't'][bool('')]
    'f'
    >>> ['f', 't'][bool('spam')]
    't'
    Однако это далеко не то же самое, потому что в данном случае интер
    претатор не использует сокращенную схему вычисления – он всегда будет вычислять оба значения Z и Y независимо от значения X. Изза всех этих сложностей лучше использовать более простое и более по
    нятное выражение if/else, появившееся в версии Python 2.5. Кроме того, этим выражением не следует злоупотреблять и следует использо
    вать его, только если части выражения достаточно просты, в против
    ном случае лучше использовать обычную инструкцию if, что облегчит модификацию программного кода в будущем. Ваши коллеги будут благодарны вам за это.
    Однако вы попрежнему можете встретить конструкцию на основе комбинации and/or в программном коде, написанном до появления версии Python 2.5 (и в программном коде, написанном программиста
    ми, использовавшими язык C, и не сумевшими избавиться от про
    шлых привычек).
    В заключение
    В этой главе мы познакомились с инструкцией if языка Python. Так как это была первая составная инструкция на нашем пути, мы попут
    но рассмотрели общие синтаксические правила языка Python и побли
    же познакомились с операциями проверки истинности. Кроме того,
    мы также узнали, как в языке Python реализуется множественное ветвление, и изучили форму выражений if/else, которая впервые по
    явилась в версии Python 2.5.
    В следующей главе мы продолжим изучение процедурных инструк
    ций и рассмотрим циклы while и for. Там будет рассказано об альтер
    нативных способах программирования циклов в языке Python, каж
    дый из которых имеет свои преимущества. Но перед этим вас ждут обычные контрольные вопросы главы.
    Закрепление пройденного
    Контрольные вопросы
    1. Как в языке Python можно оформить множественное ветвление?
    2. Как в языке Python можно оформить инструкцию if/else в виде вы
    ражения?
    3. Как можно разместить одну инструкцию в нескольких строках?

    Закрепление пройденного
    329
    4. Что означают слова True и False?
    Ответы
    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, предназначена для обхода эле
    ментов в последовательностях и выполнения блока программного кода для каждого из них.
    В языке Python существуют и другие способы организации циклов, но две инструкции, которые описываются здесь, являются основными синтаксическими элементами, предоставляющими возможность про
    граммирования повторяющихся действий. Кроме того, мы попутно рассмотрим необычные инструкции (такие как break и continue), пото
    му что они используются внутри циклов. Дополнительно в этой главе мы исследуем родственные концепции протокола итераций в языке
    Python и рассмотрим некоторые подробности о генераторах списков –
    близких родственниках цикла for.
    Циклы while
    Инструкция while является самой универсальной конструкцией орга
    низации итераций в языке Python. Проще говоря, она продолжает вы
    полнять блок инструкций (обычно с отступами) до тех пор, пока услов
    ное выражение продолжает возвращать истину. Она называется «цик
    лом», потому что управление циклически возвращается к началу ин
    струкции, пока условное выражение не вернет ложное значение. Как только в результате проверки будет получено ложное значение, управ
    ление будет передано первой инструкции, расположенной сразу же за вложенным блоком тела цикла while. В результате тело цикла продол
    жает выполняться снова и снова, пока условное выражение возвраща

    Циклы while
    331
    ет истинное выражение, а если условное выражение сразу вернет лож
    ное значение, тело цикла никогда не будет выполнено.
    Как я только что заметил, инструкция while – это одна из двух инст
    рукций циклов в языке Python, кроме нее существует еще инструкция for
    . Помимо этих инструкций в языке Python существует несколько способов неявной организации циклов (итераций): функции map, reduce и filter; оператор in проверки на вхождение; генераторы списков и многие другие. Некоторые из них мы рассмотрим в главе 17, потому что они имеют отношение к функциям.
    Общий формат
    В своей наиболее сложной форме инструкция while состоит из строки заголовка с условным выражением, тела цикла, содержащего одну или более инструкций с отступами, и необязательной части else, кото
    рая выполняется, когда управление передается за пределы цикла без использования инструкции break. Интерпретатор продолжает вычис
    лять условное выражение в строке заголовка и выполнять вложенные инструкции в теле цикла, пока условное выражение не вернет ложное значение:
    while : # Условное выражение test
    # Тело цикла
    else: # Необязательная часть else
    # Выполняется, если выход из цикла производится
    # не инструкцией break
    Примеры
    Для иллюстрации рассмотрим несколько простых циклов while в дейст
    вии. Первый, который содержит инструкцию print, вложенную в цикл while
    , просто выводит сообщение до бесконечности. Не забывайте, что
    True
    – это всего лишь особая версия целого числа 1, и оно обозначает истинное значение, поэтому результатом этого условного выражения всегда будет истина и интерпретатор бесконечно будет выполнять тело цикла, пока вы не прервете его выполнение. Такие циклы обычно на
    зываются бесконечными:
    >>> while True:
    ... print 'Type Ctrl C to stop me!'
    Следующий фрагмент продолжает вырезать из строки первый символ,
    пока она не опустеет и в результате не превратится в ложное значение.
    Это обычная практика – проверка истинности объектов осуществляется непосредственно вместо использования более растянутого эквивалента
    (while x != '':). Далее в этой главе мы рассмотрим другие способы обхо
    да элементов строки с помощью цикла for. Обратите внимание на за
    вершающий символ запятой в инструкции print – как рассказывалось в главе 11, такой прием обеспечивает вывод значений в одну строку:

    332
    Глава 13. Циклы while и for
    >>> x = 'spam'
    >>> while x: # Пока x не пустая строка
    ... print x,
    ... x = x[1:] # Вырезать первый символ из x
    spam pam am m
    Следующий фрагмент перебирает значения от a до b, не включая зна
    чение b. Ниже мы рассмотрим более простой способ выполнения этих же действий с помощью цикла for и встроенной функции range:
    >>> a=0; b=10
    >>> while a < b: # Один из способов организации циклов перечисления
    ... print a, # 0r, a = a + 1
    ... a += 1
    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. Раз уж мы занялись изучением необычных инструкций, за
    одно рассмотрим здесь часть else, потому что она некоторым образом связана с инструкцией break, и заодно пустую инструкциюзаполни
    тель pass.
    break
    Производит переход за пределы объемлющего цикла (всей инструк
    ции цикла).
    continue
    Производит переход в начало цикла (в строку заголовка).
    pass
    Ничего не делает: это пустая инструкция, используемая как запол
    нитель.
    break, continue, pass и else
    333
    Блок else
    Выполняется, только если цикл завершился обычным образом (без использования инструкции break).
    Общий формат цикла
    С учетом инструкций break и continue цикл while в общем виде выгля
    дит, как показано ниже:
    while :

    if : break # Выйти из цикла, пропустив часть else
    if : continue # Перейти в начало цикла, к выражению test1
    else:
    # Выполняется, если не была использована
    # инструкция 'break'
    Инструкции break и continue могут появляться в любом месте внутри тела цикла while (или for), но как правило, они используются в услов
    ных инструкциях if, чтобы выполнить необходимое действие в ответ на некоторое условие.
    Примеры
    Обратимся к нескольким простым примерам, чтобы увидеть, как эти инструкции используются на практике.
    pass
    Инструкция pass не выполняет никаких действий и используется в слу
    чаях, когда синтаксис языка требует наличия инструкции, но ника
    ких полезных действий в этой точке программы выполнить нельзя.
    Она часто используется в качестве пустого тела составной инструкции.
    Например, если потребуется создать бесконечный цикл, который ни
    чего не делает, сделать это можно будет следующим образом:
    while 1: pass # Нажмите CtrlC, чтобы прервать цикл!
    Поскольку тело цикла – это всего лишь пустая инструкция, интерпре
    татор «застрянет» в этом цикле. Грубо говоря, pass в мире инструкций –
    это то же, что None в мире объектов – явное ничто. Обратите внимание,
    что тело этого цикла while находится в той же строке, что и заголовок,
    после двоеточия. Как и в случае с инструкцией if, такой прием можно использовать только в случае, когда тело цикла образует несоставная инструкция.
    Этот пример вечно делает «ничто». Вероятно это самая бесполезная программа (если только вы не хотите погреться у своего ноутбука в хо
    лодный зимний день!), которая когдалибо была написана на языке
    Python, и, тем не менее, я не смог придумать лучший пример примене
    ния инструкции pass. Далее мы увидим, где эта инструкция может ис
    пользоваться с большим смыслом, например, для определения пустых

    334
    Глава 13. Циклы while и for классов, реализующих объекты, которые ведут себя подобно структу
    рам и записям в других языках. Иногда инструкция pass используется как заполнитель, вместо того, «что будет написано позднее», и в каче
    стве временного фиктивного тела функций:
    def func1():
    pass # Настоящий программный код будет добавлен позже
    def func2():
    pass
    1   ...   36   37   38   39   40   41   42   43   ...   98


    написать администратору сайта