高级函数
- 接收一个或多个函数作为参数
- 将函数作为返回值返回
满足两个条件中任意一个即为高级函数
# 接收函数作为参数来使用
def fn1(a):
return a % 3 == 0
def fn2(a):
return a > 5
def fn(func, data):
a = []
for i in data:
if func(i):
a.append(i)
return a
lis = [1,2,3,4,5,6,7,8,9]
print(fn(fn1,lis))
# 将函数作为返回值返回
def fn():
def fn1():
print('我是第二层函数')
return fn1
data = fn()
print(data())
filter()和map()
filter()
fliter()过滤器,接受任意可迭代对象进行指定规则的过滤。
语法:filter(过滤规则,可迭代对象) (过滤后会返回一个filter的对象。)
map()
map()映射,根据指定规则,映射成为一个新的数组。
语法: map(映射规则,可迭代对象)(映射后会返回一个map的对象。)
def fn1(a):
return a % 3 == 0
lis = [1, 2, 3, 4, 5, 6, 7, 8, 9]
data = filter(fn1, lis)
print(data, list(data)) # <filter object at 0x00000270F4F41308> [3, 6, 9]
lis = [1, 2, 3, 4, 5, 6, 7, 8, 9]
data = map(fn1, lis)
print(data, list(data)) # <map object at 0x000001C102DA1308> [False, False, True, False, False, True, False, False, True]
匿名函数lambda()
lambda()匿名函数表达式是Python中的语法糖,用来创建一些简单的函数。
语法糖:对功能并没有影响,但能够增加程序的可读性,从而减少程序代码出错的机会
语法:lambda 参数列表:返回值
匿名函数不建议直接赋值给变量使用,一般它都是作为map()、filter()等函数的参数使用。
data = list(map(lambda a : a % 3 == 0, lis))
print(data) # [False, False, True, False, False, True, False, False, True]
data = list(filter(lambda a : a % 3 == 0, lis))
print(data) # [3, 6, 9]
sort()和sorted()的关系
sort(key=排序方法)用来对列表进行排序函数,如果没有key,则默认按照数字大写来排序,并且不同类型之间无法排序。
而sort()是在原列表基础上进行修改,sorted则不修改原列表,会将新列表已返回值形式返回。
sort()只能对可以变的可迭代对象操作,而sorted可以对元组等不可变的可迭代对象进行操作
lis = ['555', '66', '88', '9', '33333', '4444', '111111', 123]
lis1 = (5,6,2,3,4,9,1)
data = lis.sort(key = len and int)
print(data,lis) # None ['9', '66', '88', 123, '555', '4444', '33333', '111111']
data = sorted(lis1)
print(data,lis1) # [1, 2, 3, 4, 5, 6, 9] (5, 6, 2, 3, 4, 9, 1)
闭包
将函数作为返回值返回的一种高阶函数,常用于变量不希望被外部修改的时候。
形成闭包的条件
- 函数嵌套
- 将内部函数作为返回值返回
- 内部函数必须使用到外部函数
在闭包中可以创建只用当前函数才能访问到的变量,可以避免变量二次赋值后覆盖和加强变量的安全性。
def fn():
lis = []
def fn1(n):
lis.append(n)
return sum(lis)/len(lis)
return fn1
data = fn()
print(data(20)) # 20.0
print(data(30)) # 25.0
print(data(40)) # 30.0
装饰器
通过装饰器可以在不修改原函数的情况下最函数进行扩展(开发中对函数的扩展功能大多数都是用装饰器来完成的。)
常用装饰器创建方法(装饰器创建方法众多,在这里就举一个通用的方法):
def 装饰器名(func)
def 函数名(*args,**kwargs):
print(‘开头装饰器内容’)
func(*args,**kwargs)
print(‘结尾装饰器内容’)
return 函数名
调用时在需要添加装饰器的函数前添加 @装饰器名即可
def test(func):
def fn(*args,**kwargs):
print('我是开始装饰')
func(*args,**kwargs)
print('我是结束装饰')
return fn
@test
def fn1():
print('我是fn')
print(fn1())