Python中的非纯函数是什么?

10 投票
2 回答
12119 浏览
提问于 2025-04-18 00:27

根据我的理解,

非纯函数有一些输入(就是它的参数),并且会返回一些输出(就是执行后的结果)[...],另外[...]它们还可能产生副作用,也就是会改变解释器或计算机的状态

(改写自用函数构建抽象 (PDF).)

举个例子:print(2)这个函数本身不返回任何东西(返回的是None),但作为副作用,它会把值打印出来(这不是Python解释器的工作,而是print函数的工作)。

在上面的定义中,我不太明白“改变解释器或计算机的状态”是什么意思。这个是什么意思呢?

2 个回答

5

我们把一个函数称为“纯函数”,如果它满足两个重要的特点:

  1. 它的行为只受输入的影响。
    • 通常来说,如果这个函数的代码依赖于一个没有作为参数传入的主命名空间中的变量(也就是局部变量),那么它就会出错。
  2. 它对程序其他部分的影响只能通过它的输出(返回值)来实现。
19

任何影响局部变量以外状态的函数都被称为非纯函数。

比如说,改变全局变量就是非纯的,举个例子:

some_list = []

def foo(bar):
    some_list.append(bar)

foo('baz')

这里的函数 foo 改变了 some_list 的状态,所以它是非纯的。一个纯的版本应该是:

def foo(bar, lst):
    return lst + [bar]

some_list = []
now_list = foo('baz', some_list)

在这个版本中,foo 只通过输入参数来影响状态,并产生一个输出值。原来的 some_list 对象没有被修改,而是返回了一个新的对象。

纯函数还必须确保输出只依赖于输入;如果一个函数的输出是基于外部状态的,那它也不是纯函数。比如 time.time() 就不是纯函数,因为它返回的值是基于时钟的状态,而时钟并不是这个函数的输入。

撰写回答