【问题标题】: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()
执行顺序为:
-
raw_input("IMP -- ") 返回用户输入(让我们调用input)
- 原始输入的结果转到
identity_print(input) - 打印input 并返回它
-
函数的其余部分是input=='quit' or echo_FP()。 A or B 的工作方式是:
if A:
return A
else:
return B
所以,如果input=='quit'(即A),则返回True并在此处结束,否则将再次执行整个lambda(echo_FP())。