# 带参数的装饰器 # 准备好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()
函数或其余代码均可解决递归解决的问题,但递归在某些时候能有出奇制胜的效果python
本身调用本身app
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)