• 第一章 1.11 高阶函数


    一.实参高阶函数

    1.函数作为变量使用

    python中声明函数就是声明一个类型是function的变量,变量名就是函数名
    普通变量能做的函数都能做:

    • 1).一个变量可以给另一个变量赋值,函数也可以赋值给一个变量
    • 2).变量的值可以修改,函数作为变量并被赋值后,函数原本的功能就消失了
    • 3).变量作为序列中的元素,函数也行
    • 4).变量作为函数的参数,函数也行

    将函数作为另一个函数的参数,这就是实参高阶函数

    2.系统的实参高阶函数

    列表.sort(); sorted(); max(); min() -> 都有一个参数key,要求是一个函数

    例:列表.sort()排序函数,
    sort()括号里面有key函数和revers,key函数确定了排序的规则,revers=True时倒序,revers=False时正序

    1).排序函数;参数key要求是一个函数,作用是用来定制拍寻的规则
    key的要求:
    ①:key是一个函数
    ②:函数中有且只有一个参数,这个参数指向的是序列中的每个元素
    ③:函数需要一个返回值,这个返回值就是排序的时候比较大小的对象
    2).最大值函数:

    # 练习:进下面的列表按个位数的大小排序
    nums = [100, 39, 51, 62, 58]
    nums.sort(key=lambda item: item % 10)
    print(nums)
    print(max(nums, key = lambda item: item % 10))
    # 练习:将学生按成绩排序
    students = [
        {'name': '小明', 'age': 18, 'grade': 90},
        {'name': '小花', 'age': 28, 'grade': 59},
        {'name': '狗子', 'age': 8, 'grade': 87},
        {'name': '大黄', 'age': 45, 'grade': 98}
    ]
    students.sort(revers=True, key=lambda item: item['grade']
    print(students)
    print(max(students, key = lambda item: item['grade']
    # 按学生年龄和分数的和排序
    students.sort(key = lambda itme: item['age'] + item['grade']
    print(students)
    print(max(students,key = lambda item: item['age'] + item['grade']
    


    二.返回值高阶函数

    1.函数作为函数的返回值 - 返回值高阶函数

    #func1就是一个返回值高阶函数
    def func1():
        def func2():
            print('函数2')
        return func2
    

    2.闭包 - 函数1中声明了函数2 ,函数2 中使用了函数1中的数据,则函数1就是一个闭包
    特点:闭包函数中的数据不会因为函数调用结束而销毁

    def func3():
        a = 10
        print(id(a))
    
        def func4():
            print(a)
            print(id(a))
    
        return func4
    

    面试题练习:

    #不执行以下代码,问以下代码的执行结果
    list1 = []
    for i in range(5):
        list1.append(lambda x: x*i)
    
    print(list1[1](2), list1[2](2), list1[3](2))
    
    
    
    def func2(seq=[]):
        seq.append(10)
        return seq
    print(func2())
    print(func2())
    


    三.装饰器

    1.什么是装饰器

    装饰器本质就是一个函数 装饰器 = 返回值高阶函数+实参高阶函数+糖语法
    装饰器是python的三大神器之一:装饰器、迭代器、生成器
    装饰器的作用:给已经写好的函数添加新的功能

    2.用函数给函数添加功能的方法

    方法一

    # ①:给不需要参数的函数添加功能
    def add_time(fn):
        star = time.time()
        fn
        end = time.time()
        print('函数执行时间:%fs' % (end - star))
    
    
    # ②:给需要参数的函数添加功能
    def add_time2(fn, *args, **kwargs):
        star = time.time()
        fn(*args, **kwargs)
        end = time.time()
        print('函数执行时间:%fs' % (end - star))
    
    
    def func1():
        print('======')
        print('++++++')
    
    
    def func2():
        print('你好,python')
        print('你不好,python')
    
    
    def func3(x, y):
        print('%d+%d=%d' % (x, y, x+y))
    
    
    print(add_time(func1()))
    print(add_time(func2()))
    print(add_time2(func3, 10, 20))
    

    方法二(装饰器)

    无参装饰器函数:
    def 函数名1(参数1):
     def 函数名2(*args, **kwargs):
      参数1(*args, **kwargs)
     新功能对应的代码
     return 函数名2

    说明:
    函数名1 - 装饰器的名称;需要添加的共嗯名称
    参数1 - 需要添加功能的函数,一般命名为fn
    函数名2 - 随便命名,

    # 添加统计函数执行时间的装饰器
    def add_time3(fn):
        def test(*args, **kwargs):
            star = time.time()
            re =fn(*args, **kwargs)
            end = time.time()
            print(end - star)
            return re
        return test
    
    
    # 练习>>>>>>>
    def exchange_hex(fn):
        def test(*args, **kwargs):
            re = fn(*args, **kwargs)
            if type(re) == int:
                return hex(re)
            return re
        return test
    
    
    @exchange_hex
    def diy_sum(x, y):
        return x+y
    
    
    print(diy_sum(10, 20))
    


    四.迭代器

    1.什么是迭代器(iter)

    迭代器也是python提供的容器型数据类型
    迭代器存储数据的特点:
    ①:一个迭代器能存多个数据
    ②:若要获取或查看数据必须要从迭代器中取出
    ③:取出来的数据不能再添加到迭代器

    2.将数据存入迭代器

    ①:将其他序列转换成迭代器
    ②:创建一个生成器

    3.获取迭代器中的元素

    迭代器中的元素只要取出(任何方式)那这个元素在迭代器中就不存在了

    1).获取单个元素

    next(迭代器) - 取出迭代器中最上面的元素
    print(next(iter1))
    print(next(iter1))
    print(next(iter1))

    2).遍历

    for x in iter2:
    print('x:', x)

  • 相关阅读:
    ubuntu root 登录没有声音(waiting for sound system to respond)
    android openVG source prj
    http://source.android.com/ android官网(下载源码及sdk)
    8个优秀的Android开源游戏引擎
    2010開放原始碼創新應用開發大賽 (有很好的源码)
    GIT和repo使用方法:下载内核 android源码包
    Real6410系列教程 android
    [转]Protel布局文件转化为Allegro placement文件
    ubuntu网卡设置
    ubuntu 下安装java6的源
  • 原文地址:https://www.cnblogs.com/anjhon/p/11892352.html
Copyright © 2020-2023  润新知