关键词:函数式编程,python底层理解,可靠性,效率。

print 是一个python的函数,print的 作用 是在终端中打印,print的返回值为None。

这里我们可以换个理解的方式:

print 是一个python的函数,print的返回值是None,print的 副作用 是在终端中打印。

上面两句的区别仅仅是语序的不同以及一个词的差异。但是这两句背后的思想大相径庭。

第一句强调的是作用,是一个函数能够做什么事情,我们在记忆的时候往往是忽略返回值None的。第二句强调的是函数本身的意义,即输入输出,在理解记忆的时候需要完善print的函数定义,其他print的功能都是副作用,也就是在运行函数的过程中,不属于函数输出范畴的影响。

python 中的每一个函数,每一个变量都可以使用这样的思想进行解释。

接下来我们看这样一段代码:

1
2
a = 100
b = a

正常的解释是:

我们给变量 a 赋值 100,然后将 变量 a 的值 赋给变量 b。

函数试思想是:

我们给变量 a 赋值 100,然后我们 调用 a 得到返回值 100,最后将 100 赋值给变量 b。

将 a 不仅仅是当成一个拥有值的变量。我们认为 a 是一个拥有类似于函数功能的对象,拥有自己的输入和输出,然后和其他的代码首尾相连组成数据的管道

副作用的概念除了 print 的终端打印,根据副作用的定义:函数除去期望输出的其他的影响,还有一种可以使用副作用去理解的情景:浅层拷贝。

在浅层拷贝的时候,CPU只会寻址第一层的列表,内部列表则不会寻址,所以拷贝后的列表和原列表共用一组内部列表的数据。当我们想要修改其中一个列表的内部列表的时候,另一个列表会跟着变化。这里另一个列表的变化不是我们修改列表这个函数的期望输出,所以是一种副作用。

函数编程的思想最大的意义在于提升程序的鲁棒性。通过构造输入输出管道的设计思路和识别并管理副作用的技术,我们可以减少编程过程中代码出现错误/bug 的可能性,提高编程效率的同时提高代码的可靠性。