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


Функциональные циклы в Python - часть 2


Но мы могли бы продолжить дальнейшее исключение утверждений в этой функции (как, например, замену блока 'if/else' в вышеописанном шаблоне на короткозамкнутое выражение). К тому же, обычная проверка на месте <cond> (наподобие 'while myvar==7') вряд ли окажется полезной, поскольку тело цикла (в представленном виде) не может изменить какие-либо переменные (хотя глобальные переменные могут быть изменены в while_block()). Один из способов применить более полезное условие - заставить while_block() возвращать более осмысленное значение и сравнивать его с условием завершения. Стоит взглянуть на реальный пример исключения утверждений:

    #---------- Функциональный цикл 'echo' в Python ------------#

    # Императивная версия "echo()"

    def echo_IMP():

           while 1:

               x = raw_input("IMP -- ")

               if x == 'quit':

                  break

               else

                  print x

    echo_IMP()

    # Служебная функция, реализующая "тождество с побочным эффектом"

    def monadic_print(x):

           print x

           return x

    # FP версия "echo()"

    echo_FP = lambda: monadic_print(raw_input("FP -- "))=='quit' or echo_FP()

    echo_FP()

Мы достигли того, что выразили небольшую программу, включающую ввод/вывод, циклы и условия в виде чистого выражения с рекурсией (фактически - в виде функционального объекта, который при необходимости может быть передан куда угодно). Мы все еще используем служебную функцию monadic_print(), но эта функция совершенно общая и может использоваться в любых функциональных выражениях , которые мы создадим позже (это однократные затраты).    Заметьте, что любое выражение, содержащее monadic_print(x) вычисляется так же, как если бы оно содержало просто x.В FP (в частности, в Haskell) есть понятие "монады" для функции, которая "не делает ничего, и вызывает побочный эффект при выполнении".




Начало  Назад  Вперед



Книжный магазин