在 Python 中,为什么不能用 lambda 编写累加器生成器?

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 将来会支持这样的事情吗?

Bre*_*arn 2

他实际上在后续帖子中描述了一个原因。他的简短讨论涵盖了我下面提到的两个原因,尽管他的看法有点不同。

正如他在帖子前面谈到的,他关心的部分内容是陈述和表达之间的差异。在 Python 中+=是一条语句,而 lambda 不能包含语句,只能包含表达式。

然而,还有另一个问题。他希望他的函数接受“数字”作为输入,但他区分了“加”和“增量”(就像许多编程语言一样)。然而,我自己的立场是,数字没有这样的区别,只有变量(或“对象”或类似的东西)。不存在“递增”数字 5 之类的事情。从这个意义上说,您仍然无法编写一个 Python lambda 来递增包含数字类型内置变量的变量,但如果它接受可变对象而不是接受可变对象,则可以做到这一点。一个原始数字。您可以编写自己的 MutableNumber 类,以这种方式工作,并使其与现有的数字类型完全互操作。因此从这个意义上说,Python 不支持的原因与其类型的设计有关(即数字是不可变的),而不是他在帖子中讨论的功能问题。

当然,这是否真的是该语言的问题是另一个问题。