zoukankan      html  css  js  c++  java
  • 测开之函数进阶· 第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 中的内置函数

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

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

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

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

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

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

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


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

  • 相关阅读:
    堆排序
    理解KMP算法
    C++性能提升
    论文阅读 | Pre-trained Models for Natural Language Processing: A Survey
    模型融合
    论文阅读 | COMPRESSING BERT: STUDYING THE EFFECTS OF WEIGHT PRUNING ON TRANSFER LEARNING
    论文阅读 | Compressing Large-Scale Transformer-Based Models: A Case Study on BERT
    沉淀再出发:关于netty的一些理解和使用
    沉淀再出发:mongodb的使用
    沉淀再出发:ElasticSearch的中文分词器ik
  • 原文地址:https://www.cnblogs.com/qinghan123/p/14173849.html
Copyright © 2011-2022 走看看