1.闭包函数
闭包函数:闭(封闭/关闭)包(闭包函数内部的函数)--》返回闭包函数内部的函数
import requests
def f1():
def f2():
print('from f2')
return f2
f2 = f1()
f2()
----------------------------------------------------------
def f1(url):
def spider():
print(url)
return spider # 闭包函数
闭包函数:闭包函数把 闭包函数内部的变量 + 闭包函数内部的函数 这两者包裹在一起,然后通过返回值的形式返回出来
闭包函数至少也得符合函数嵌套
def f1(url):
def f2():
print(url)
pass
return f2
res = f1(1)
res()
2.装饰器
装饰器:装饰(新增加了一个额外的功能)
装饰器的本质就是一个 给函数增加功能的函数
装饰器:给函数 增加功能的函数,增加功能时要注意以下两点:
-
不改变原函数的源代码
-
不改变原函数的调用方式
import time
def index():
"""被装饰的函数"""
print('index')
time.sleep(1)
index()
# 增加功能:计时功能
---------------------------------------------------------
def index():
"""被装饰的函数"""
start = time.time()
print('index')
time.sleep(1)
end = time.time()
print(end-start)
index()
-----------------------------------------------------------
def index():
"""被装饰的函数"""
print('index')
time.sleep(1)
start = time.time() # 获取当前时间
index()
end = time.time()
print(end-start)
def index1():
print('index1')
# 改变调用方式
---------------------------------------------------------------
def index():
"""被装饰函数"""
print('index')
time.sleep(1)
def time_count(func):
start =time.time()
func()
end = time.time()
print(end-start)
1.装饰器本身是函数,只不过它用来装饰被装饰的函数
2.装饰器装饰函数 不改变被装饰函数源代码
3.装饰器装饰函数 不改变被装饰函数的调用方式
# v1
import time
def index():
"""被装饰的函数"""
print('index')
time.sleep(1)
# time_count装饰器:对被装饰函数计时时
def time_count(func) # func才是真正的index
"""装饰器"""
def wrapper():
start = time.time()
func()
end = time.time()
print(end - start)
return wrapper
index = time_count(index) # index == wrapper
index() # wrapper()
----------------------------------------------------------------------
# v2:带返回值
import time
def index():
"""被装饰的函数"""
print('x',x)
print('index')
time.sleep(1)
return 'index'
# time_count装饰器:对被装饰函数计时
def tiem_count(func): # func才是真正的index
"""装饰器"""
def wrapper():
start = time.time()
res = func() # index()
res = func() # index()
end = time.time()
print(end - start)
return res
return wrapper
index = time_count(index) # index == wrapper
res = index() # wrapper()
print(res)
----------------------------------------------------------------------------
# v3:加参数
import time
def index(x,y,z = 10):
"""被装饰函数"""
print('x',x)
print('index')
time.sleep(1)
return 'index'
# time_count装饰器:对被装饰函数计时
def time_count(func) # func才是真正的index
"""装饰器"""
def wrapper(*args,**kwargs): # (10,20) # *args和kwargs接收所有参数
start = time.time()
res = func(*args,**kwargs) # index() # *(10,20) # *args和swargs打散参数传给真正的index
end = time.time()
print(end - start)
return res
return wrapper
index = time_count(index) # index == wrapper
res = index(10,20,320) # wrapper()
print(rse)
登录装饰器:
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 213
res = index(10,20)
二层装饰器
- 用来装饰函数的,它的本质是函数
- 不改变函数源代码
- 不改变函数调用方式
装饰器模板,如果装饰器真的不懂就记住模板
def deco(func):
def wrapper(*arge,**kwargs):
# 要加什么功能就加上去
res = func(*args,**kwargs)
return res
return wrapper
3.三层装饰器
username_list = []
def sanceng(role):
def login_deco(func):
def wrapper(*arge,**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 = username and pwd_inp == pwd
if sername_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)
4.迭代器引入
- 整型
- 浮点型
- 字符串
- 列表
- 元组
- 集合
- 字典
可迭代对象:含有__iter__方法的就叫可迭代对象
迭代器:含有__iter__和___next__方法的就叫做迭代器
print(x)
print(s)
with open('user_infp.txt', 'r', encoding='utf8') as fr:
fr.__next__()
生成器:含有yield关键字的函数就叫生成器