day12总结
闭包函数
闭(封闭/关闭)包(包子/把馅(闭包函数内部的变量)和皮(闭包函数内部的函数)包起来) --》返回闭包函数内部的函数
函数闭包函数:闭包函数把 闭包函数内部的变量 + 闭包函数内部的函数 这两者包裹在一起 然后通过返回值的形式返回出来
闭包函数至少也得符合函数嵌套
装饰器
装饰(新增加了一个额外的功能) 器(工具) --》 函数
装饰器的本质就是一个给函数增加功能的函数
装饰器 :1. 装饰器本身是函数,只不过它用来装饰 被装饰的函数
-
装饰器装饰函数 不改变被装饰函数源代码
-
装饰器装饰函数 不改变被装饰函数的调用方式
登录装饰器
# python装饰器语法糖(就是让代码更简洁)
username_list = []
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('user_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
@login_deco # index = login_deco(index)
def index(x, y):
print('index')
print('x,y', x, y)
return 123
二层装饰器:
-
用来装饰函数的,它本质是函数
-
不改变函数源代码
-
不改变函数调用方式
三层装饰器
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)
# 要记住装饰器的用途+装饰器的模板(多练);要了解装饰器至少要看3篇以上相关博客;要灵活运用至少5篇;要达到熟悉百度至少看10篇装饰器相关的博客
迭代器
可迭代对象:含有__iter__方法的就叫做可迭代对象
迭代器:含有__iter__和__next__方法的就叫做迭代器