2.14装饰器
装饰器本质上就是一个函数,它可以让其它函数在不需要任何代码修改的情况下,添加新的功能。
装饰器功能:①引入日志②函数执行时间统计③执行函数前预备处理④执行函数后清理功能⑤权限校验等场景⑥缓存
2.14.1装饰器装饰的函数带参数
(1)装饰器装饰的函数带确定参数
例子:
def outer(func):
def inner(number):
return func(number)
return inner
@outer
def f1(number):
print(number)
@outer
def f2(number):
print(number)
f1(100)
f2(200,200)
(2)装饰器装饰的函数带不定长参数
例子:
def outer(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
@outer
def f1(number):
print(number)
@outer
def f2(number,number2):
print(number)
print(number2)
f1(100)
f2(200,200)
(3)装饰器装饰的函数带返回值
例子:
def outer(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
@outer
def f1(number):
print(number)
return "f1"
@outer
def f2(number,number2):
print(number)
print(number2)
return "f2"
res = f1(100)
res2= f2(200,200)
print(res)
print(res2)
2.14.2装饰器案例(装饰器工厂函数)
# 班长 视频网站
# 增加功能 要求只能使用qq登录 login_type:QQ
def login_type(logintype):
def check_login(func):
def inner(name,pwd):
if logintype == "QQ":
if name == "班长" and pwd == "vip中p":
return func(name,pwd)
else:
return error()
else:
print("必须使用QQ登录")
return inner
return check_login
# 注意:login_type不是装饰器,而是一个创建装饰器的函数 :装饰器工厂函数
#login_type "
# 1、 check_login = login_type("QQ")
# 2、 .........
@login_type("QQ")
def American(name,pwd):
print("欧美专区")
@login_type("QQ")
def Japan(name,pwd):
print("日韩专区")
@login_type("QQ")
def Shunyi(name,pwd):
print("班长和彬哥专区")
def error():
print("请注册,支持班长和彬哥的事业!!!!!")
American("班长","vip中p")
Shunyi("班长","vip中p")
Japan("班长","vip中p")
2.14.3装饰器执行过程
装饰器是自上而下进行调用执行的
例子:
def outer1(func):
def inner1():
print("我是装饰器1")
return func()
return inner1
def outer2(func):
def inner2():
print("我是装饰器2")
return func()
return inner2
@outer1
@outer2
def f1():
print("我是一个函数")
f1()
2.14.4多重装饰器装饰顺序
2.14.5类装饰器
class Person(object):
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
print("我是内函数")
return self.func()
@Person # f1 = Person(f1)
def f1():
print("hello world")
f1()
2.14.6AOP面向切面编程
2.15内建属性
2.16内建函数
dir(__builtins__), 可以看到很多python解释器启动后默认加载的属性和函数,这些函数称之为内建函数
2.16.1range
range(stop) -> list of integers range(start, stop[, step]) -> list of integers
- start:计数从start开始。默认是从0开始。例如range(5)等价于range(0, 5);
- stop:到stop结束,但不包括stop.例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
- step:步长,每次跳跃的间距,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
python2中range返回列表,python3中range返回一个迭代值。如果想得到列表,可通过list函数
2.16.2map函数
(1)map函数会根据提供的函数对指定序列做映射
(2)map(function, sequence[, sequence, ...]) -> list
- function:是一个函数
- sequence:是一个或多个序列,取决于function需要几个参数
- 返回值是一个list
参数序列中的每一个元素分别调用function函数,返回包含每次function函数返回值的list
2.16.3filter函数
(1)filter函数会对指定序列执行过滤操作
(2)filter(function or None, sequence) -> list, tuple, or string
- function:接受一个参数,返回布尔值True或False
- sequence:序列可以是str,tuple,list
filter函数会对序列参数sequence中的每个元素调用function函数,最后返回的结果包
含调用结果为True的元素。
返回值的类型和参数sequence的类型相同
2.16.4reduce函数
(1)reduce函数,reduce函数会对参数序列中元素进行累积
(2)reduce(function, sequence[, initial]) -> value
- function:该函数有两个参数
- sequence:序列可以是str,tuple,list
- initial:固定初始值
reduce依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。 第一次调用function时,如果提供initial参数,会以sequence中的第一个元素和initial 作为参数调用function,否则会以序列sequence中的前两个元素做参数调用function。 注意function函数不能为None。
(3)注意:在Python3里,reduce函数已经被从全局名字空间里移除了, 它现在被放置在fucntools模块里,用的话要先引入: from functools import reduce