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)这种数据结构实现的,每当进入一个函数调用时,栈就会增加一层栈,每当函数返回时,栈就会减少一层,由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

作业题:

python27期day14:有参装饰器、多个装饰器装饰一个函数、递归、作业题的更多相关文章

  1. day14 带参装饰器、迭代器、生成器

    """ 今日内容: 1.带参装饰器及warps 2.迭代器 3.生成器 """ """ # 一.带参装饰器及w ...

  2. day14带参装饰器,迭代器,可迭代对象 , 迭代器对象 ,for迭代器 , 枚举对象

    复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰 ...

  3. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  4. python27期day13:闭包、装饰器初始、标准版装饰器、作业题

    1.闭包: 保护数据安全.保护数据干净性. 2.闭包的定义:在嵌套函数内.使用非全局变量(且不使用本层变量) 将嵌套函数返回 闭包的目的:要接受被装饰的函数和被装饰函数需要的参数3.闭包举例子: de ...

  5. Python:有参装饰器与多个装饰器装饰一个函数

    有参装饰器 def timmerout(flag1): #flag1 =flag def timmer(f): def inner(*args,**kwargs): if flag1: start_t ...

  6. day15——有参装饰器、多个装饰器装饰一个函数

    day15 装饰器的进阶 有参装饰器 @auth(chose) 相等于以下两行代码的解构 wrapper = auth(chose) foo = wrapper(foo) # dic = {'user ...

  7. Python函数07/有参装饰器/多个装饰器装饰一个函数

    Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...

  8. python 装饰器的理解以及类装饰器

    python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...

  9. 使用@contextmanager装饰器实现上下文管理器

    通常来说,实现上下文管理器,需要编写一个带有__enter__和 __exit__的类,类似这样: class ListTransaction: def __init__(self, orig_lis ...

随机推荐

  1. Dijkstra算法堆优化详解

    DIJ算法的堆优化 DIJ算法的时间复杂度是\(O(n^2)\)的,在一些题目中,这个复杂度显然不满足要求.所以我们需要继续探讨DIJ算法的优化方式. 堆优化的原理 堆优化,顾名思义,就是用堆进行优化 ...

  2. 2019 SDN上机第四次作业

    2019 SDN上机第4次作业 1. 解压安装OpenDayLight控制器(本次实验统一使用Beryllium版本) 修改环境变量 2. 启动并安装插件 3. 用Python脚本搭建如下拓扑,连接O ...

  3. AtCoder Beginner Contest 139F Engines

    链接 problem 给出\(n\)个二元组\((x,y)\).最初位于原点\((0,0)\),每次可以从这\(n\)个二元组中挑出一个,然后将当前的坐标\((X,Y)\)变为\((X+x,Y+y)\ ...

  4. 【BZOJ5457】城市(线段树合并)

    点此看题面 大致题意: 一棵树上每个点有颜色\(a_i\)和权值\(b_i\),求以每个点为根的子树内权值和最大的颜色及其权值和. 线段树合并 这是一道线段树合并板子题. (关于线段树合并,可参考我的 ...

  5. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) F. Bits And Pieces sosdp

    F. Bits And Pieces 题面 You are given an array

  6. vscode配置python环境-运行调试-windows环境

    官方文件介绍 https://code.visualstudio.com/docs/languages/python 准备: vscode下载安装 python3版本下载(安装时可以选择添加环境变量, ...

  7. 【新特性速递】CSS3动画增强

    FineUIPro/Mvc/Core的下个版本(v6.1.0),我们对多个地方的CSS3动画进行了增强,使得用户体验更好. 1. 树控件启用EnableSingleExpand时,使得展开动画和折叠其 ...

  8. 大话设计模式Python实现-建造者模式

    建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 下面是一个建造者模式的demo #!/usr/bin/env python # ...

  9. torch_11_BEGAN

    BEGAN: 创新: 1.不是考虑生成图片与真实图片之间的真实的分布,而是估计分布的误差的分布之间的差距. 2.G,D的能力平衡提出了一种均衡的概念 3.提供了一种超参数,这超参数可以在图片的多样性和 ...

  10. MongoDB副本集--Secondary节点实例恢复

    场景描述 MongoDB副本集中有一台Secondary节点出现RECOVERING的状态 状态如下: arps:RECOVERING> rs.status() { "set" ...