测开之函数进阶· 第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=100return a返回一个 a,传入参数idef 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+原创文章,欢迎关注、交流,禁止第三方擅自转载。