Введение в язык Питон
773123a3

Исключение команд управления потоком


Первое, о чем стоит вспомнить в нашем упражнении - то, что Python "замыкает накоротко" вычисление логических выражений. Оказывается, это предоставляет эквивалент блока 'if'/'elif'/'else' в виде выражения. Итак:

    #------ "Короткозамкнутые" условные вызовы в Python -----#

    # Обычные управляющие конструкции

    if <cond1>: func1()

    elif <cond2>: func2()

    else: func3()

    # Эквивалентное "накоротко замкнутое" выражение

    (<cond1> and func1()) or (<cond2> and func2()) or (func3())

    # Пример "накоротко замкнутого" выражения

    >>> x = 3

    >>> def pr(s): return s

    >>> (x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))

    'other'

    >>> x = 2



    >>> (x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))

    'two'

Казалось бы, наша версия условных вызовов с помощью выражений - не более, чем салонный фокус; однако все становится гораздо интересней, если учесть, что оператор lambda может содержать только выражения! Раз, как мы только что показали, выражения могут содержать условные блоки, используя короткое замыкание, выражение lambda позволяет в общей форме представить условные возвращаемые значения. Базируясь на предыдущем примере:

    #--------- Lambda с короткозамкнутыми условными выражениями в Python -------#

    >>> pr = lambda s:s

    >>> namenum = lambda x: (x==1 and pr("one")) \

    ... or (x==2 and pr("two")) \

    ... or (pr("other"))

    >>> namenum(1)

    'one'

    >>> namenum(2)

    'two'

    >>> namenum(3)

    'other'



Содержание раздела