带参数装饰器、递归函数

带参数装饰器、递归函数

# 带参数的装饰器
# 准备好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)
    
posted @ 2019-11-21 14:05  豆子V  阅读(164)  评论(0编辑  收藏  举报