
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.1.1 纯函数
让我们快速复习一下Python函数的语法:

函数的定义从关键字def开始,后面是函数的名称和括号内的输入参数。冒号(:)标记函数头的结束。函数的主体代码需要缩进一级。
在函数式编程范式中,函数与其数学定义相似:输入到输出的映射。一个函数是纯函数,当且仅当:
❍输入相同时,输出始终相同;
❍没有副作用。
当该函数修改函数体以外的数据,或者修改函数的输入时,就会产生副作用。纯函数永远不会修改其输入参数。例如,以下函数是纯函数:

给定相同的输入点p和q,输出的向量总是相同,并且在函数体之外的任何东西都没有被修改。相比之下,以下代码是make_vector的“不纯”版本:

这个代码使用last_point的共享状态,该状态在每次调用make_vector时都会改变。这种改变是该函数的一个副作用。函数返回的向量依赖于last_point的共享状态,因此对相同的输入点,该函数不会返回相同的向量。