- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在阅读 Peter Norvig 的 Python IAQ 时,我遇到了这个代码片段:
def _if(test):
return lambda alternative: \
lambda result: \
[delay(result), delay(alternative)][not not test]()
def delay(f):
if callable(f): return f
else: return lambda: f
fact = lambda n: _if (n <= 1) (1) (lambda: n * fact(n-1))
fact(100)
我在网上搜索了一下,这个代码出现在几个论坛上,但是评论它的人似乎都明白它是如何工作的。
我对函数式编程概念还很陌生。我知道如果测试评估为 True
,将选择 delay(alternative)
。但实际上,如果 test 为真,则返回结果。这对我来说似乎违反直觉。
最佳答案
让我们看看:
_if(True)
被调用,并立即返回带有 alternative
参数的 lambdaalternative
设置为 1
并返回 result
lambdaresult
lambda 被调用,result
设置为 lambda: n * fact(n-1)
not not True
计算结果为 1(此示例来自 python 2.4 时代!),它索引第二个列表项,即 delay(alternative)
alternative
之前设置为 1
delay(1)
被调用,返回 lambda: 1
lambda: 1
被调用,它返回 1
。TL/DR:1
是备选方案
。
命名函数版本:
def _if(test):
def then_closure(expr_if_true):
def else_closure(expr_if_false):
if test:
delayed = delay(expr_if_true)
else:
delayed = delay(expr_if_false)
return delayed()
return else_closure
return then_closure
关于python - 如何理解 Peter Norvig 的这段 Python 函数式代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14371010/
Peter Norvig 的著名作品 spellchecker (Java 8 版本 here )能够纠正单个单词,如果训练数据中出现与该单词接近的内容。但是我该如何调整它来处理整个短语。例如,如果我
在彼得诺维格的 PAIP ,第 18.12 节,第。 643(不幸的是不是谷歌图书预览的一部分),他包括二维数组,如: (/ (aref '#2A((.1 .4 .7)
在 Peter Norvig 的人工智能编程范式的练习 1.2 中,要求读者 Write a function to exponentiate, or raise a number to an int
Peter Norvig 的 PAIP 书籍包含此 code作为排列问题的解决方案(为简洁起见,删除了某些部分) (defun permutations (bag) ;; If the input
我看到了 Michael Sparks 对 Peter Norvig's Spell Checker 的非常有趣的剖析在伦敦举行的 SO DevDays 上,这让我想知道是否有人尝试用另一种语言(例如
在阅读 Peter Norvig 的 Python IAQ 时,我遇到了这个代码片段: def _if(test): return lambda alternative: \
我想了解 Peter Norvig 的拼写校正器是如何工作的。 关于他的 jupyter-notebook 标题 here他解释说,如何在没有空格分隔单词的情况下分割字符序列。它工作正常,当顺序中的所
我是一名优秀的程序员,十分优秀!