测开之函数进阶· 第2篇《纯函数》
坚持原创输出,点击蓝字关注我吧
作者:清菡
博客:oschina、云+社区、知乎等各大平台都有。
由于微信公众号推送改为了信息流的形式,防止走丢,请给加个星标 ⭐,你就可以第一时间接收到本公众号的推送!
目录
- 一、纯函数的概念
- 1.纯函数
- 2.非纯函数
- 3.纯函数:相同的输入保证相同的输出
- 4.纯函数和非纯函数对比
- 二、纯函数的 3 个原则
- 三、函数的副作用
- 四、Python 中的内置函数
重点需要记住纯函数的概念和函数的副作用,面试会问,哈哈。
一、纯函数的概念
一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数。
纯函数不是特定的语法,不是特定的功能,它只是一个概念。就是一个函数使用的时候的一种规则。
1.纯函数
虽然这是个递归函数,它也是纯函数的一种:
def fun(n):
if n == -1:# 递归临界点:当达到递归临界点的时候,就不再调用自身函数的条件
return 1
else:
return n * fun(n-1) # 4 *3*2*1
fun(4)
2.非纯函数
函数里面进行一系列计算,它返回的结果是根据传入的数据相关。不再依赖于任何的其它数据,比如定义个a = 100
,那么在:
if n == 0:# 递归临界点:当达到递归临界点的时候,就不再调用自身函数的条件
return 1
else:
return n * fun(n-1) # 4 *3*2*1
这段代码,也就是纯函数里面用到了外面的变量:
a = 100
def fun(n):
print(a)
if n == 0:# 递归临界点:当达到递归临界点的时候,就不再调用自身函数的条件
return 1
else:
return n * fun(n-1) # 4 *3*2*1
fun(4)
那这种函数就不再叫做纯函数了。print(a)
因为它对外部变量有引用。
3.纯函数:相同的输入保证相同的输出
纯函数不会引用外部的变量,它调用的结果只对你传入进去的参数fun(4)
有关。
例如:
定义a=100
,return a
返回一个 a,传入参数i
,def func(i):
。
这个时候调用这个函数,传进去的参数跟它的返回值有关吗?
这个函数和它的返回值没有关系。传进去的func(10)
,不管传什么,不会影响返回值return a
。
a = 100
def func(i):
print('99999')
print(i)
return a
func(10)
纯函数是传进去的参数是什么,返回的结果只跟你的参数有关。
纯函数:不管在什么时候调用(不管在哪里调用),传入的参数相同,返回的结果就一定是一样的。
例如:
这个函数,调用的时候传个 10 进去,它返回的时候应该是多少呢?
它返回的结果是 110。
a = 100
def func(i):
i = i + a
return i
res = func(10)
print(res)
在下面对 a 进行修改,对 a 再赋个值:
a = a+1111
那么这个时候,a 的值肯定发生变化了。这个时候在这里再调用函数,再传入 10,func(10)
。
a = 100
def func(i):
i = i + a
return i
res = func(10)
print(res)
a = a+1111
res2 = func(10)
print(res2)
同样调用的是同一个函数,传入的参数都是相同的func(10)
,但是拿到的返回值却不是相同的。
像这种函数,它会受外部环境变量的影响,那么这种函数不能称为纯函数。
4.纯函数和非纯函数对比
# 函数func1返回的结果为两个参数相加的结果
def func1(a,b):
return a + b
var1=100
#函数func2返回的结果为参数a和外部变量var1相加的结果
def func2(a):
return var1+a
#在上面两个案例中func1返回的结果只受传入的参数的影响,而func2不仅
# 受传入参数的影响还会受外部变量var1的影响,像func1这样的返回值只跟
#传入参数有关的函数,我们把它叫做纯函数。
二、纯函数的 3 个原则
原则一:变量都只在函数作用域内获取,作为的函数的参数传入。
原则二:不会产生副作用,不会改变被传入的数据或者其它数据(全局变量)。
原则三:相同的输入保证相同的输出。
解释原则一:
纯函数的变量只在函数的作用域内获得,也就是说纯函数里面要么使用的是函数内部定义的,要么使用的是传进来的参数,不会再使用其它任何的变量了。
解释原则二:
纯函数是不会产生副作用的。
解释原则三:
任何时候调用,只要你传入的参数是相同的,它给你返回的结果都是一样的。
三、函数的副作用
函数的副作用就是当函数被调用的时候,既完成了(函数既定的计算任务)函数相关的功能,在完成函数相关功能的时候,你这个函数访问了外部变量,尤其是对外部的数据进行了写操作。
比如在函数内部用到了外面的列表,在这里面还往列表里面加了个元素。这个时候修改了全局变量,造成外部环境发生了改变。这种就叫做函数的副作用。
四、Python 中的内置函数
内置函数: //docs.python.org/zh-cn/3.7/library/functions.html
Python 中的内置函数包含的不仅仅是内置函数还有很多的内置类型。
虽然内置类型是个类,不是函数。Python 官方也把内置类型归纳在内置函数里面,把它称为内置函数。
str()
底层是个类,但是 Python 官方是把它归纳在内置函数里面的。
不管什么时候调用内置函数,内置函数返回的结果只跟传入的参数相关,任何时候传进去的参数是一样的,那么内置函数返回的结果都是一样的。
内置函数是没有副作用的,全部是属于纯函数的一种,都是属于纯函数。
str()
不是个函数,其实是个类。虽然算个内置函数,但是不能称为纯函数。
公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 111+原创文章,欢迎关注、交流,禁止第三方擅自转载。