作为定义,我了解到了,
非纯函数有一些输入(它们的参数)并返回一些输出(应用它们的结果) [...] 以及 [...] 还可以生成副作用,可以对解释器或计算机的状态进行一些更改。
(从Building Abstractions with Functions (pdf)转述)。
例如:print(2)
函数不返回任何内容(None
),因为副作用打印函数(不是python解释器)本身会打印该值。
我的问题:
在上面的定义中,我不明白“改变翻译或计算机状态”的含义,这是什么意思?
答案 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)
如果满足两个重要的额外属性,我们将其称为纯函数: