python中的非纯函数是什么?

时间:2014-03-29 15:47:44

标签: python

作为定义,我了解到了,

  

非纯函数有一些输入(它们的参数)并返回一些输出(应用它们的结果) [...] 以及 [...] 还可以生成副作用,可以对解释器或计算机的状态进行一些更改

(从Building Abstractions with Functions (pdf)转述)。

例如:print(2)函数不返回任何内容(None),因为副作用打印函数(不是python解释器)本身会打印该值。

我的问题:

在上面的定义中,我不明白“改变翻译或计算机状态”的含义,这是什么意思?

2 个答案:

答案 0 :(得分:14)

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

更改全局是非纯的,例如:

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()不纯,它根据时钟状态返回一个值,该时钟不是函数的输入。

答案 1 :(得分:2)

如果满足两个重要的额外属性,我们将其称为纯函数:

  1. 仅受输入影响的行为。 -如果功能代码依赖于未作为参数传递(使其局部化)的主命名空间中的变量,则通常通常会失败。
  2. 对程序其余部分的影响只能通过其输出(返回值)来实现。