zoukankan      html  css  js  c++  java
  • 有参装饰器、多个装饰器装饰一个函数、递归

    1、有参装饰器:给装饰器添加一个参数、来控制装饰器的行为。

    @auth(参数)

    auth里层的函数名 = auth(参数)

    被装饰的函数名 = auth里层的函数名(被装饰的函数名)

    被装饰的函数名()

    应用场景:flask框架的路由就是有参装饰器

    def arg(argv):
    def wrapper(func):
    def inner(*args,**kwargs):
    if argv:
    print("开始装饰")
    ret = func(*args,**kwargs)
    if argv:
    print("装饰结束")
    return ret
    return inner
    return wrapper
    def index():
    print("is index")
    wrapper = arg(True)
    index = wrapper(index)
    index()
    # 结果:开始装饰
    # is index
    # 装饰结束
    2、三层有参装饰器:

    msg = """
    1.微信
    2.抖音
    3.邮箱
    请选择您要登陆的软件:
    """
    choose = input(msg)
    def auth(arg):
    def wrapper(func):
    def inner(*args,**kwargs):
    user = input("username:")
    pwd = input("password:")
    if arg == "1":
    if user == "alex" and pwd == "alex1234":
    func(*args,**kwargs)
    elif arg == "2":
    if user == "wusir" and pwd == "1234":
    func(*args,**kwargs)
    elif arg == "3":
    if user == "meet" and pwd == "1234":
    func(*args,**kwargs)
    return inner
    return wrapper
    @auth(choose) #wechat = wrapper(wechat) = auth(choose)
    def wechat():
    print("微信")
    a = auth(choose)
    wechat = a(wechat)
    wechat()
    @auth(choose)
    def dy():
    print("抖音")
    @auth(choose)
    def email():
    print("邮箱")
    if choose == "1":
    wechat()
    elif choose == "2":
    dy()
    elif choose == "3":
    email()
    结果:微信
    3、有参装饰器微信、抖音、邮箱:
    msg = """
    微信
    抖音
    邮箱
    请选择您要登陆的软件:
    """
    choose = input(msg)
    def auth(arg):
    def wrapper(func):
    def inner(*args,**kwargs):
    user = input("username:")
    pwd = input("password:")
    if arg == "微信":
    if user == "alex" and pwd == "alex1234":
    func(*args,**kwargs)
    else:
    print("账号或密码错误!")
    elif arg == "抖音":
    if user == "wusir" and pwd == "1234":
    func(*args,**kwargs)
    else:
    print("账号或密码错误!")
    elif arg == "邮箱":
    if user == "meet" and pwd == "1234":
    func(*args,**kwargs)
    else:
    print("账号或密码错误!")
    return inner
    return wrapper
    @auth(choose) #wechat = wrapper(wechat) = auth(choose)
    def wechat():
    print("微信")
    @auth(choose)
    def dy():
    print("抖音")
    @auth(choose)
    def email():
    print("邮箱")
    func_dic = {
    "微信":wechat,
    "抖音":dy,
    "邮箱":email
    }
    if choose in func_dic:
    func_dic[choose]()
    else:
    print("输入有误请重新输入!")
    4、多个装饰器装饰一个函数时先执行离被装饰的函数最近的装饰器:
    def f1(func):   #func == index
    def f2(*args,**kwargs):
    print("这是f1的装饰开始")
    func(*args,**kwargs)
    print("这是f1的装饰结束")
    return f2
    def foo1(func): #func == f2
    def foo2(*args,**kwargs):
    print("这是foo1的装饰开始")
    func(*args,**kwargs)
    print("这是foo1的装饰结束")
    return foo2
    @foo1 #index = foo1(index) #index = foo1(f2)
    @f1 #index = f1(index) #现在的index其实就是返回的f2
    def index():
    print("is index")
    index() #foo2()
    结果:   这是foo1的装饰开始

          这是f1的装饰开始
          is index
          这是f1的装饰结束
          这是foo1的装饰结束

    看到的真不为真

    看到的真不为真

    看到的真不为真

    5、递归的精华:一递一归。

    6、递归的定义:不断调用自己本身(死递归)

            有明确的结束条件

    7、死递归如下:

    def func():
    print(1)
    func()
    func()
    结果:RecursionError: maximum recursion depth exceeded while calling a Python object--递归错误:调用Python对象时,最大递归深度超过了
    最大深度/层次、官方:1000、实际测试:998/997
    8、修改递归最大深度:
    import sys
    sys.setrecursionlimit(1000)
    9、递归举例:

    def age(n):
    if n == 3:
    return 18
    def age1(n):
    if n == 3:
    return 18
    return age(n + 1) - 2
    def age2(n):
    if n == 3:
    return 18
    return age1(n + 1) - 2
    print(age2(1))
    # 结果:14
    10、阶乘5层 1,2,3,4,5

    结果:120

    11、斐波那契数列:1,1,2,3,5,8,13,21,34,55

    12、递归效率低:每次进入更深一层递归时,问题规模相比上次递归都应有所减少,递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用就是通过栈(stack)这种数据结构实现的,每当进入一个函数调用时,栈就会增加一层栈,每当函数返回时,栈就会减少一层,由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

    作业题:

  • 相关阅读:
    Ubuntu环境下mysql常见的操作
    Ubuntu 下 Galera cluster for MySQL 集群安装
    Linux如何查看进程、杀死进程、启动进程等常用命令
    Ubuntu16.04配置静态IP地址
    Linux软件包管理之源码包、脚本安装包
    Linux软件包管理之yum在线管理
    Linux软件包管理之RPM命令
    Linux文本编辑器vim
    Linux常用命令之网络和关机重启命令
    Linux常用命令之压缩和解压缩命令
  • 原文地址:https://www.cnblogs.com/zhang-da/p/11665388.html
Copyright © 2011-2022 走看看