装饰器:
本质就是闭包
开放封闭原则
扩展开发,修改源代码封闭,不能修改调用方式
在不该源代码的基础上添加功能
@装饰器的名字 在被装饰的函数正上方 独占一行
@语法糖 被装饰的函数名 = 装饰器的名字(被装饰的函数名)
基本语法格式:
1 def inner(func): 2 def warper(*args,**kwargs): 3 ret=func(*args,**kwargs) 4 return ret 5 return warper 6 @inner
用的时候@一下最外层函数。
1 def inner(func): 2 def warper(*args,**kwargs): 3 ret=func(*args,**kwargs) 4 return ret 5 return warper 6 @inner 7 def num_sum(*args,**kwargs): 8 print(*args) 9 num_sum(5,4,5,6,8,2)
执行结果:5 4 5 6 8 2
eg:
1 import time 2 def inner(func): # 闭包, func现在就是foo的内存地址 3 x=func # 把foo的内存地址赋值给了x 4 def wapeer(): 5 s_time=time.time() 6 x() # 执行foo() 7 ss_time=time.time() 8 print(ss_time-s_time) 9 return wapeer # 返回函数,不能加() 函数名当作值返回 10 @inner # 被装饰的函数正上方加一个 @+装饰器的名字 11 def foo(): 12 print('is foo') 13 foo()
同一个函数被多个装饰器装饰
@wrapper1
@wrapper2
@wrapper3
def func():
pass
1 2 3 func 3 2 1
匿名函数:
lambda 匿名函数:
lambda 参数:返回值
匿名函数没有名字,怎么查看 函数.__name__
匿名函数的返回值只能是一个,不能是多个
匿名函数可不可以写到一行
print((lambda x:x)()) 调用的时候要传参
1 lst=[1,2,3,4] 2 print(list(map(lambda x:x**2+1,lst)))
内置函数:
排序的函数:
sorted('可迭代对象',key='函数名(函数名里写排序规则),reverse=True的时候是降序')
1 ls=[1,2,3,4] 2 def func(ls): 3 lst=[] 4 for i in ls: 5 lst.append(i**i) 6 return lst 7 print(sorted(func(ls),reverse=True))
过滤函数:
filter() 内置函数(筛选函数|过滤函数)
filter('写好过滤规则的函数','可迭代对象') 函数可以是匿名,也可以是定义好的
1 def foo(x): 2 if x['age']>15: 3 return x 4 dic=[{'name':'乔狗','age':19},{'name':'乔二狗','age':16}] 5 print(list(filter(foo,dic))) 6 print(list(filter(lambda x:x['age']>17,dic)))
映射函数:
map() 映射函数
可以快速将多个元素相同的可迭代对象,进行上下累加 返回的是一个数据
语法: map(function, iterable, ...)
1 lst=[1,2,3,4] 2 def func(x): 3 return x**2 4 print(list(map(func,lst)))
外号:拉链函数
zip() #拉链
返回的是对个,如果有三个可迭代对象,就按照最短的进行输出
累积算函数:
reduce() 累 计算
快速求一个可迭代对象的累计算
reduce 函数 函数会对参数序列中元素进行累积 累计算
语法: reduce(function, iterable[, initializer])
function -- 函数,有两个参数
iterable -- 可迭代对象
initializer -- 可选,初始参数
1 from functools import reduce 2 lst=[2,3,4] 3 print(reduce(lambda x,y:x**y,lst))
枚举:
enumerate() #枚举 将可迭代对象放到里边,默认数字是0开始,自己指定开始的数字
四舍五入:
round(4.44)