写点什么

测开之函数进阶· 第 2 篇《纯函数》

用户头像
清菡
关注
发布于: 2020 年 12 月 22 日
测开之函数进阶· 第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 = 100def 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=100return a返回一个 a,传入参数idef func(i):


这个时候调用这个函数,传进去的参数跟它的返回值有关吗?


这个函数和它的返回值没有关系。传进去的func(10),不管传什么,不会影响返回值return a


a = 100def func(i):    print('99999')    print(i)    return a
func(10)
复制代码


纯函数是传进去的参数是什么,返回的结果只跟你的参数有关。


纯函数:不管在什么时候调用(不管在哪里调用),传入的参数相同,返回的结果就一定是一样的。


例如:


这个函数,调用的时候传个 10 进去,它返回的时候应该是多少呢?


它返回的结果是 110。


a = 100def func(i):    i = i + a    return i
res = func(10)print(res)
复制代码



在下面对 a 进行修改,对 a 再赋个值:


a = a+1111


那么这个时候,a 的值肯定发生变化了。这个时候在这里再调用函数,再传入 10,func(10)



a = 100def func(i): i = i + a return i
res = func(10)print(res)
a = a+1111res2 = 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 中的内置函数


内置函数: https://docs.python.org/zh-cn/3.7/library/functions.html


Python 中的内置函数包含的不仅仅是内置函数还有很多的内置类型。


虽然内置类型是个类,不是函数。Python 官方也把内置类型归纳在内置函数里面,把它称为内置函数。


str()底层是个类,但是 Python 官方是把它归纳在内置函数里面的。


不管什么时候调用内置函数,内置函数返回的结果只跟传入的参数相关,任何时候传进去的参数是一样的,那么内置函数返回的结果都是一样的。


内置函数是没有副作用的,全部是属于纯函数的一种,都是属于纯函数。


str()不是个函数,其实是个类。虽然算个内置函数,但是不能称为纯函数。


公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 111+原创文章,欢迎关注、交流,禁止第三方擅自转载。


发布于: 2020 年 12 月 22 日阅读数: 18
用户头像

清菡

关注

公众号《清菡软件测试》作者,热爱技术。 2019.10.29 加入

热爱技术,喜欢英语。

评论

发布
暂无评论
测开之函数进阶· 第2篇《纯函数》