第一章 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)

posted @ 2019-11-19 20:59  anjhon_木  阅读(238)  评论(0编辑  收藏  举报