zoukankan      html  css  js  c++  java
  • 带参数装饰器、递归函数

    带参数装饰器、递归函数

    # 带参数的装饰器
    # 准备好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)
      
  • 相关阅读:
    PHP中常用的字符串格式化函数总结
    php格式化金额函数分享
    PHP获取当前日期和时间及格式化方法参数
    CSS 中如何把 Span 标签设置为固定宽度
    css中 Span 元素的 width 属性无效果原因及多种解决方案
    js网页如何获取手机屏幕宽度
    HTML meta viewport属性详细说明
    Android onLowMemory()和onTrimMemory()
    Qt 拷贝文件目录
    QT5.1 调用https
  • 原文地址:https://www.cnblogs.com/maqian/p/11905255.html
Copyright © 2011-2022 走看看