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)
      
  • 相关阅读:
    java怎么导入一个项目到eclipse
    JDK安装与环境变量配置(链接by网络)
    配置安装ecplise跑项目
    电脑缺少**.dll文件
    Microsoft-Office-Professional-Plus-2007
    win7如何恢复以前的ie版本
    maven安装及maven项目导入流程(网络链接)
    LoadRunner录制Web协议的脚本 (by网络)
    spring中jdbc.properties用法
    linux 安装 mysql
  • 原文地址:https://www.cnblogs.com/maqian/p/11905255.html
Copyright © 2011-2022 走看看