Jia*_*ian 5 python functional-programming
Paul Graham描述了以下问题:
我们想编写一个生成累加器的函数——一个函数接受一个数字 n,并返回一个接受另一个数字 i 并返回 n 递增 i 的函数。
他说虽然这样的函数可以在 Lisp/Ruby/Perl 中实现,就像这样简单
(defun foo (n)
(lambda (i) (incf n i)))
Run Code Online (Sandbox Code Playgroud)
, 在 Python 中它会被写成
class foo:
def __init__(self, n):
self.n = n
def __call__(self, i):
self.n += i
return self.n
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,Python 究竟是什么(除了缺乏对多行 lambda 的支持)阻止您以上面第一个代码示例的简洁风格实现累加器生成器?正如 Paul Graham 推测的那样,Python 将来会支持这样的事情吗?
他实际上在后续帖子中描述了一个原因。他的简短讨论涵盖了我下面提到的两个原因,尽管他的看法有点不同。
正如他在帖子前面谈到的,他关心的部分内容是陈述和表达之间的差异。在 Python 中+=是一条语句,而 lambda 不能包含语句,只能包含表达式。
然而,还有另一个问题。他希望他的函数接受“数字”作为输入,但他区分了“加”和“增量”(就像许多编程语言一样)。然而,我自己的立场是,数字没有这样的区别,只有变量(或“对象”或类似的东西)。不存在“递增”数字 5 之类的事情。从这个意义上说,您仍然无法编写一个 Python lambda 来递增包含数字类型内置变量的变量,但如果它接受可变对象而不是接受可变对象,则可以做到这一点。一个原始数字。您可以编写自己的 MutableNumber 类,以这种方式工作,并使其与现有的数字类型完全互操作。因此从这个意义上说,Python 不支持的原因与其类型的设计有关(即数字是不可变的),而不是他在帖子中讨论的功能问题。
当然,这是否真的是该语言的问题是另一个问题。