【问题标题】:python: recursive lambda expressionpython:递归 lambda 表达式
【发布时间】:2016-03-19 13:49:56
【问题描述】:

我正在关注 David Mertz 的《函数式 Python 编程》一书,我遇到了以下一段代码。

def echo_IMP():
    while 1:
        x = raw_input("IMP -- ")
        if x == 'quit':
            break
        else:
            print(x)

以上代码的功能版本如下:

def identity_print(x):
    print(x)
    return x


echo_FP = lambda: identity_print(raw_input("IMP -- "))=='quit' or echo_FP()
echo_FP()

这个identity_print() 怎么又被调用了?

这个or 表达式实际上在做什么?

【问题讨论】:

    标签: python recursion functional-programming


    【解决方案1】:

    在这里,我们定义了一个没有实际输入的 lambda 函数,但该语句实际上是对 identity_print() 的函数调用......其输入由用户输入。这就是为什么我们这样称呼它 echo_FP() 没有输入。

    根据“或”运算符的功能,它将搜索第一个正确匹配项。所以在这种情况下,如果用户输入除 'quit' 以外的任何内容,则第一个匹配失败(identity_print(raw_input("IMP -- "))=='quit 将导致 False)所以它继续执行echo_FP()。所以直到用户继续输入除 'quit' 以外的任何内容,它会继续调用 echo_FP()。当您输入“退出”时,它将返回 true 并退出。

    【讨论】:

      【解决方案2】:

      您正在创建一个包含一些条件的函数。换句话说,您是在说“调用 identity_print,如果结果是 'quit':条件已验证,否则:再次调用我”

      echo_FP 函数:

      echo_FP = lambda: identity_print(raw_input("IMP -- "))=='quit' or echo_FP()
      

      有这种行为:

      def echo_FP():
      
          var = identity_print(input("IMP -- "))
      
          if var == 'quit':
              pass
          else:
              echo_FP()
      

      当identity_print 不返回quit 时递归发生,因为函数执行or 条件,这是对echo_FP 的调用

      【讨论】:

        【解决方案3】:
        echo_FP = lambda: identity_print(raw_input("IMP -- "))=='quit' or echo_FP()
        

        执行顺序为:

        1. raw_input("IMP -- ") 返回用户输入(让我们调用input)
        2. 原始输入的结果转到identity_print(input) - 打印input 并返回它
        3. 函数的其余部分是input=='quit' or echo_FP()。 A or B 的工作方式是: if A: return A else: return B

          所以,如果input=='quit'(即A),则返回True并在此处结束,否则将再次执行整个lambda(echo_FP())。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-24
          • 1970-01-01
          • 1970-01-01
          • 2010-09-08
          • 2021-10-17
          相关资源
          最近更新 更多