博客整理day12
Python day 12
闭包函数
闭(封闭,函数内部函数)包(包含):函数内部函数对外部作用域而非全局作用域的引用.
两种为函数传参的方法
-
使用参数
def func(x): print(x) func(1)
-
包给函数
def func(x): # x = 1 def f1(): print(x) return f1 f2 = func(2)
装饰器
无参装饰器
什么是装饰器
装饰器本质上也是函数,装饰器是为被装饰对象添加额外的功能
要注意的两点:
- 装饰器本身是可以任意调用的函数对象
- 被装饰的对象也是可以任意可调用的函数对象
装饰器的实现必须遵循两个原则
1. 不修改被装饰对象的源代码
2. 不修改被装饰对象的调用方式
装饰器的用法
import time
def index():
print('welcome to index')
time.sleep(1)
return 123
def home(name):
print(f'welcome {name} to page')
time.sleep(1)
return name
def time_count(func):
#func = 最原始的index
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(f'{func} time is {start - end}')
return res
return wrapper
home = time_count(home)
home('simple')
index = time_count(index)
index()
装饰器语法糖
#在被装饰函数上面单独写上@装饰器名
@time_count
# @time_count 就等于 home = time_count(home)
def home(name):
print(f'welcome {name} to page')
time.sleep(1)
return name
装饰器模板
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
有参装饰器
#三层函数
username_list = []
def sanceng(role):
def login_deco(func):
def wrapper(*args, **kwargs):
if username_list:
print('已经登录,请勿重复登录')
res = func(*args, **kwargs)
return res
username_inp = input('请输入用户名:')
pwd_inp = input('请输入密码:')
with open(f'{role}_info.txt', 'r', encoding='utf8') as fr:
for user_info in fr:
username, pwd = user_info.strip().split(':')
if username_inp == username and pwd_inp == pwd:
print('登录成功')
username_list.append(username)
res = func(*args, **kwargs)
return res
else:
print('登录失败')
return wrapper
return login_deco
@sanceng('admin')
def index(x, y):
print('index')
print('x,y', x, y)
return 123
res = index(10, 20)