一、定义
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
二、分类
1.map函数
map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 list 返回。
### *sum 表示可变参数,可接收多个值
map() 作为高阶函数,把运算规则抽象了.
练习: 把这list列表中的所有数字转为字符串;([1,2,3]---['1','2','3'])
2.reduce函数
reduce 把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。
### 类加
### 阶乘
3.filter函数
filter() 也接收一个函数和一个序列。和 map() 不同的是,filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True
还是 False 决定保留还是丢弃该元素。
###在一个 list 中,删掉偶数,只保留奇数:
###删除100以内的质数
4.sorted函数
• 排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速
排序,排序的核心是比较两个元素的大小。通常规定如下:
x < y, return -1
x == y, return 0
x > y, return 1
# 排序: 由小到大,sorted函数(默认reverse=False)
# 排序: 由大到小, reverse=True, 代表排序后进行反转;
### 对不同类型的手机电脑品牌以销售量和单价进行排序
###sorted 函数应用
(携程笔试)
给定一个整形数组,将数据中所有的0移动到末尾,非0向保持不变;
在原始数组上进行移动操作,误创建新的数据;
#输入:
第一行是数组长度,后续每一行是数组的一条记录;
4
0
7
0
2
#输出:
调整后数组的内容
7
2
0
0
#### 将0移动到开头
#### 匿名函数:将0移动到开头
#### 对字符串排序
例:将字符串“apple” 排在最后,
5.返回值是函数
# 闭包: 函数里面嵌套函数;
###求和
# f = lazy_sum(1,2,3,4) 调用 lazy_sum() 时,返回的并不是求和结果,而是求和函数
# f() #调用函数 f 时,才真正计算求和的结果
## 调用 lazy_sum() 时,每次调用都会返回一个新的函数,即使传入相同的参数
6.匿名函数
•当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
•关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数
• 匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。
• 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数;
##也可以把匿名函数作为返回值返回
##累加
## 可变参数和关键字参数
三、装饰器
# 装饰器: 用来装饰函数 ,或装饰类
# 装饰器函数基本格式:
def 装饰器名称(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
pass
return wrapper
# 使用装饰器函数
@装饰器名称 # hello = 装饰器名称(hello) # hello = wrapper
def hello():
pass
# 调用函数
hello() # 实质执行的是wrapper函数
hello.__name__
hello.__doc__
### 装饰器第一个模版
# 语法糖
# @compute_time <==> hello = compute_time(hello)
# hello()
#
# @compute_time <==> hello1 = compute_time(hello1)
# hello1()
四、函数的解包
*args: 对列表或者元组进行解包的;
**kwargs:对字典解包
### 实现日志记录的装饰器函数
日志格式: 时间 函数名 运行时间: 运行结果:
###
### print(add.__name__)
### print(add.__doc__)
### 注释@functools.wraps(fun)后,结果为:
### 装饰器的第二个模版
##判断bbs账户是否登陆
###探究多个装饰器的执行顺序
# 当有多个装饰器时, 从下到上调用装饰器;