1、定义
参数为函数对象或返回函数对象的函数,称之为高阶函数,即函数的函数,如:
#示例1
def compute(f,s): #f是函数对象,s是系列对象
return f(s)
compute(min,(1,2,3,4)) #输出1
#示例2
def myfunc_out(n1): #外函数
def myfunc_in(n2): #内函数
print(n1+n2) #内函数的部分参数来自于外函数
return myfunc_in #返回内函数对象
f=myfunc_out(5) #调用外函数并赋值n1=5,f是内函数对象
f(3)
#输出8
2、常见的(内置)高阶函数
(1)map()
map(f,iterable,...)将函数f用于可迭代对象,返回结果为可迭代map对象,而不是立即计算结果,将其转换为列表或for循环迭代它来访问计算后的值。
#示例1
def is_odd(x):
return x % 2 ==1
list(map(is_odd,range(5)))
#输出[False, True, False, True, False] 判断是否是奇数
#示例2
list(map(abs,range(5)))
#输出[0, 1, 2, 3, 4]
(2)filter()
filter(f,iterable)将函数f应用于每一个元素,根据返回值是True或False决定保留或丢弃该元素,返回结果是filter对象。
#示例1 同上
list(filter(is_odd,range(5)))
[1, 3] #返回奇数元素
#示例2 定义is_palindrome判断一个数字是否是回文数即121、232、454等
def is_palindrome(x):
if str(x) == str(x)[::-1]:
return x
list(filter(is_palindrome,range(100,200)))
#输出100-200的回文数[101, 111, 121, 131, 141, 151, 161, 171, 181, 191]
注: 字符串的切片操作s[start:stop:step]
#字符串的切片操作s[start:stop:step]
s = 'Hello, World!'
print(s[7:12]) #从第7位到第12位的所有字符
World
print(s[1:10:2]) #从第1位到第10位每间隔2位取一次数
el,Wr
print(s[:5]) #省略起始位,取前5位字符
Hello
print(s[5:]) #从第5位开始取到末尾
, World!
print(s[::-1]) #字符串反转
!dlroW ,olleH
(3)sorted()
对可迭代对象排序并返回结果列表,排序依据可以是函数对象。默认升序,使用reverse=True实现倒序排列。
sorted([4,3,6,-8,9],key=abs) #按照绝对值升序排序
#[3, 4, 6, -8, 9]
sorted([4,3,6,-8,9],key=abs,reverse=True) #按照绝对值倒序
#[9, -8, 6, 4, 3]
sorted(["Dog","cat","rabbit"],key=str.lower) #不区分大小写按照首字母升序
#['cat', 'Dog', 'rabbit']
sorted(["Dog","cat","rabbit"],key=len) #按照字符串长度排序
#['Dog', 'cat', 'rabbit']
3、函数装饰器
装饰器实质上是一个高阶函数,作用是为已经存在的函数添加额外的功能。装饰器主要有三个特点:
- 本质上是一个嵌套函数;
- 内部函数的参数是外部函数的参数;
- 外部函数的返回内部函数对象
通俗理解,装饰器的外函数通常接受被装饰的函数作为参数,而内部的嵌套函数则是用来实际执行装饰操作的部分,也可以说是装饰器的“装饰”部分。
例1、timeit函数装饰器用来计算某个函数程序执行的时间
import time
def timeit(func): #定义函数装饰器,参数是my_func
def wrapper(*s): #装饰器的嵌套内函数,执行装饰操作
start=time.perf_counter()
func(*s)
end=time.perf_counter()
print('运行时间:',end-start)
return wrapper
@timeit #对my_sum函数使用函数装饰器
def my_sum(n): #被装饰的函数
sum = 0
for i in range(n):
sum += i
print(sum)
if __name__=='__main__':
my_sum(50)
例2、在html中斜体加粗显示字符
def makebold(fn):
def wrapper(*s):
return "<b>"+fn(*s)+"</b>"
return wrapper
def makeitalic(fn):
def wrapper(*s):
return "<i>"+fn(*s)+"</i>"
return wrapper
@makebold
@makeitalic
def func(s):
return s
#测试
if __name__=='__main__':
result=func("xiaoyankaixin")
print(result)