带参数装饰器、递归函数
带参数装饰器、递归函数
# 带参数的装饰器
# 准备好qq文件用于保存qq密码,tiktok用于保存抖音密码
def get_dic(file_name): #获取密码库
dic = {}
with open(file_name,mode='r',encoding='utf-8') as f1:
for line in f1:
username,psw = line.strip().split('|')
dic[username] = psw
return dic
def login(dic): # 3次登录功能
time = 3
while time > 0:
username = input('请输入用户名').strip()
psw = input('请输入密码').strip()
if dic.get(username)==psw:
return True
time -= 1
return False
def wrapper_out(file_name): #装饰器本体
def wrapper(func): #func=qq
def inner():
dic = get_dic(file_name) # 获取相应的密码库
if login(dic): #调用登陆函数
ret = func()
return ret
return False
return inner
return wrapper
@wrapper_out('腾讯') # 1 , wrapper_out('腾讯')---> wrapper 2 , qq = wrapper(qq) => inner
def qq():
print('欢迎登录qq')
return '登录成功'
print(qq()) # inner()
@wrapper_out('tiktok')
def tiktok():
print('欢迎访问抖音')
return '登录成功'
print(tiktok())
# 多个装饰器装饰同一个函数的运行顺序
def w1(func): # func = 原函数text
def inner():
print('正在运行w1.inner....1') #2
func() # 原函数text #3
print('正在运行w1.inner...2') #4
return inner
def w2(func): # func == w1.inner
def inner():
print('正在运行w2.inner...1') #1
func()
print('正在运行w2.inner...2') #5
return inner
@w2 # text = w2(text) 后面的text是w1.inner,前面的text == w2.inner
@w1 # 先运行 text = w1(text) 后面的text是原函数,前面的text == w1.inner
def text():
print('正在运行被装饰的函数...')
text()
递归函数:
-
函数或其他代码都可解决递归解决的问题,但递归在某些时候能有出奇制胜的效果
-
自己调用自己
def func(n): print('in func') n += 1 print(n) func(n) func(0) 官网规定:递归默认的最大深度是1000次 如果递归超过100次还没有解决这个问题,那么执意用递归,效率很低 import sys sys.setrecursionlimit(10000000) # 设定递归最大次数
# 例一 # def age(n): # if n == 1: # return 18 # else: # return age(n - 1) + 2 # print(age(4)) # ''' # n = 4 age(3) + 2 # n = 3 age(2) + 2 # n = 2 age(1) + 2 # n = 1 18 # ''' # # 例二 # l1 = [1, 3, 5, ['小马', '小刘', 18, [33, 44, [55, 77]]], [99, 22, 11, 9], 21] # # def func(lst): # for el in lst: # if type(el) != list: # print(el) # else: # func(el) # func(l1)