• 函数式编程—高阶函数


    一、函数式编程概念简介

    1. 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元
    2. 就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言
    3. 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的
    4. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
    5. 函数式编程最重要的概念就是:组合;一个函数只做一件事, 保证内部不被修改,且干净,无副作用,遵循开闭原则,然后将多个函数组合一起,便是简单的函数式编程范式

    二、高阶函数

    1. 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
    2. map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
    3. reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算(结果作为第二次调用的第一个参数)
    4. filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
    5. sorted()函数可以对list进行排序,同时也是一个高阶函数,可以接收一个key函数来实现自定义的排序:key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序

    三、返回函数(调用函数会返回一个函数)

    1. 返回函数:调用函数返回的不是结果,而是一个函数
    2. 调用返回函数时才会给出真正的结果(注意:返回函数每次调用都会返回一个新的函数,即使传入相同的参数)
    3. 调用‘返回函数’会返回一个函数,此函数的相关参数和变量都保存在该函数中,这种称为“闭包(相关参数和变量都保存在返回的函数中,这种称为“闭包)
      如果一定要引用循环变量,方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变

    示例参考:

    #返回的函数并没有立刻执行,而是直到调用了f()才执行
    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()
    
    结果:全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9
    
    #f(i)立刻被执行
    def count():
        def f(j):
            def g():
                return j*j
            return g
        fs = []
        for i in range(1, 4):
            fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
        return fs
    结果:149

    #计数器
    def createCounter():
    def num():
    n = 1
    while True:
    yield n
    n = n+1
    g = num()  #此处num()是一个generator
    def counter():
    return next(g)
    return counter

    优化测试:
    def createCounter():
    def num():
    n = 1
    while True:
    yield n
    n = n+1
    def counter():
    return next(num())
    return counter
    此处运行的结果始终为1,不会递增
    原因:使用g=num(),g是一个变量,是值传递,函数是内存地址传递!!!

    四、匿名函数

    1. 关键字lambda表示匿名函数,冒号前面的x表示函数参数
    2. 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果
    3. 匿名函数有个好处:函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数
  • 相关阅读:
    mssql分页原理及效率分析
    [ActiveX]使用VS2010创建MFC ActiveX工程项目
    Study notes for Discrete Probability Distribution
    oracle存储过程异常捕获
    (Python学习9)Python虚拟机中的一般表达式
    用Arduino做一个可视化网络威胁级别指示器!
    iOS上线项目源码分享
    android实习程序6——拨号通话
    评价等级使用的五星选择,包含半星的选择
    AJAX实现无刷新验证用户名
  • 原文地址:https://www.cnblogs.com/jayce9102/p/12188328.html
Copyright © 2020-2023  润新知