• python高阶函数心得笔记,python高阶函数知识


    递归函数

    <1>什么是递归函数

    通过前面的学习知道一个函数可以调用其他函数。

    如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。

    <2>递归函数的作用

    举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n

    解决办法1:使用循环来完成

    def cal(num):
        result,i = 1,1
        while i <= num:
            result *= i
            i+= 1
        return result
     
    
    print(cal(3))

    看阶乘的规律

    1! = 1
    2! = 2 × 1 = 2 × 1!
    3! = 3 × 2 × 1 = 3 × 2!
    4! = 4 × 3 × 2 × 1 = 4 × 3!
    ...
    n! = n × (n-1)!

    解决办法2:使用递归来实现

    def factorial(num):
        result = 1
        if num == 1:
            return 1
        result = num * factorial(num -1)
        return result
    print(cal(3))

    原理

    匿名函数

    用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。

    lambda函数的语法只包含一个语句,如下:

    lambda 参数列表: 运算表达式

    如下实例:

    sum = lambda arg1, arg2: arg1 + arg2
    # 调用sum函数
    print("Value of total : %d" % sum( 10, 20 ))
    print("Value of total : %d" % sum( 20, 20 ))

    以上实例输出结果:

    Value of total :  30
    Value of total :  40

    Lambda函数能接收任何数量的参数但只能返回一个表达式的值

    匿名函数可以执行任意表达式(甚至print函数),但是一般认为表达式应该有一个计算结果供返回使用。

    python在编写一些执行脚本的时候可以使用lambda,这样可以接受定义函数的过程,比如写一个简单的脚本管理服务器。

    应用场合

    函数作为参数传递

    >>> def fun(a, b, opt):...     print("a = " % a)...     print("b = " % b)...     print("result =" % opt(a, b))
    ...>>> add = lambda x,y:x+y>>> fun(1, 2, add# 把 add 作为实参传递
    a = 1
    b = 2
    result = 3

    练习:

    有一个列表

    students = [
        {'name': 'zhangsan', 'age': 18, 'score': 92},
        {'name': 'lisi', 'age': 20, 'score': 90},
        {'name': 'wangwu', 'age': 19, 'score': 95},
        {'name': 'jerry', 'age': 21, 'score': 98},
        {'name': 'chris', 'age': 17, 'score': 100},
    ]

    要求,对上述列表里的数据按照score进行升序排序。

    Python中使用函数作为参数的内置函数和类:

    函数名或类名

    功能

    参数描述

    sorted函数

    用来将一个无序列表进行排序

    函数参数的返回值规定按照元素的哪个属性进行排序

    filter

    用来过滤一个列表里符合规定的所有元素,得到的结果是一个迭代器

    函数参数的返回值指定元素满足的过滤条件

    map

    将列表里的每一项数据都执行相同的操作,得到的结果是一个迭代器

    函数参数用来指定列表里元素所执行的操作

    reduce函数

    对一个序列进行压缩运算,得到一个值。python3以后,这个方法被移到了functools模块

    函数参数用来指定元素按照哪种方式合并

    高阶函数

    在Python中,函数其实也是一种数据类型。

    def test():
        return 'hello world'
    print(type(test))  # 

    函数对应的数据类型是 function,可以把它当做是一种复杂的数据类型。

    既然同样都是一种数据类型,我们就可以把它当做数字或者字符串来处理。

    定义一个变量指向函数

    在Python中,我们还可以定义一个变量,让它来指向一个函数,相当于给函数起了一个别名。

    def test():
        return 'hello wrold'
     
    
    fun = test   # 定义了一个变量fun,让它指向了 test 这个函数
    print(fun())   # 使用fun()可以直接调用test这个函数
     
    
    print(id(fun))  # 1819677672040
    print(id(test))  # 1819677672040

    注意:在定义一个变量表示一个函数时,函数后面不能加括号!加括号表示的是调用这个函数。

    def test():
        return 'hello world'
     
    
    result = test()   # 这种写法是调用test函数,并把函数的返回值赋值给result变量
    print(result())   # 这里会报错  TypeError: 'str' object is not callable
     
    
    fun = test   # 这种写法是给test函数起了一个别名,注意,这里的test后面不能加()
    fun()        # 可以使用别名调用这个函数

    高阶函数

    既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,同样,我们还可以把一个函数当做另一个函数的返回值。这种函数的使用方式我们称之为高阶函数。

    函数做为另一个函数的参数

    def test(age,action):
        if age < 18:
            print('您还没满十八岁,请退出')
        action()   # 把参数action直接当做一个函数来调用
    def smoke():
        print('我已经年满十八岁了,我想抽烟')
     
    
    my_action = smoke  # 定义一个变量my_action,让它指向smoke函数
    test(21, my_action)  # 将my_action传给 test 函数作为它的参数
     
    
    test(21,smoke)  # 还可以不再定义一个新的变量,直接传入函数名

    函数作为另一个函数的返回值

    def test():

        print('我是test函数里输入的内容')

    def demo():

        print('我是demo里输入的内容')

        return test  # test 函数作为demo函数的返回值

    result = demo()  # 我是demo里输入的内容  调用 demo 函数,把demo函数的返回值赋值给 result

    print(type(result)) #   result 的类型是一个函数

    result() # 我是demo里输入的内容    我是test函数里输入的内容   既然result是一个函数,那么就可以直接使用() 调用这个函数

    demo()()  # 我是demo里输入的内容    我是test函数里输入的内容

     

  • 相关阅读:
    Semantic Kernel入门系列:利用YAML定义prompts functions
    宝塔 Supervisor进程 日志
    【Mycat2实战】五、Mycat实现分库分表【实践篇】
    3D科研绘图与学术图表绘制:从入门到精通
    Java IDEA jackson序列化——查询父子类返回 亲测可行
    斜率优化之李超线段树
    【C++】泛型编程 ⑦ ( 类模板常用用法 | 类模板声明 | 类模板调用 | 类模板作为函数参数 )
    laravel8-rabbitmq消息队列-实时监听跨服务器消息
    17 【Document 节点】
    机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件
  • 原文地址:https://blog.csdn.net/sun13212715744/article/details/128002858