今日内容概要
- 多层语法糖问题
- 有参装饰器
- 装饰器修复技术
- 递归函数
今日内容详细
多层语法糖

| def outter1(func1): |
| print('加载了outter1') |
| def wrapper1(*args, **kwargs): |
| print('执行了wrapper1') |
| res1 = func1(*args, **kwargs) |
| return res1 |
| return wrapper1 |
| |
| def outter2(func2): |
| print('加载了outter2') |
| def wrapper2(*args, **kwargs): |
| print('执行了wrapper2') |
| res2 = func2(*args, **kwargs) |
| return res2 |
| return wrapper2 |
| |
| def outter3(func3): |
| print('加载了outter3') |
| def wrapper3(*args, **kwargs): |
| print('执行了wrapper3') |
| res3 = func3(*args, **kwargs) |
| return res3 |
| return wrapper3 |
| |
| |
| @outter1 |
| @outter2 |
| @outter3 |
| def index(): |
| print('from index') |
| """ |
| 多层语法糖 加载顺序由下往上 |
| 每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖 |
| 如果上面没有语法糖 则变形 index = outter1(wrapper2) |
| """ |
有参装饰器
| |
| def outer(mode): |
| def login_auth(func_name): |
| def inner(*args, **kwargs): |
| res = func_name(*args, **kwargs) |
| return res |
| return inner |
| return login_auth |
| '''当装饰器中需要额外的参数时>>>:有参装饰器''' |
| |
| """ |
| 函数名加括号执行优先级最高 有参装饰器的情况 |
| 先看函数名加括号的执行 |
| 然后再是语法糖的操作 |
| """ |
| |
| def index(): |
| print('from index') |
| index() |
| |
| |
| def func(): |
| print('from func') |
| func() |
装饰器模板
| 最常用的无参装饰器 |
| def outer(func_name): |
| def inner(*args, **kwargs): |
| res = func_name(*args, **kwargs) |
| return res |
| return inner |
| @outer |
| def index(): |
| pass |
| |
| 不常用的有参装饰器 |
| def outer_plus(mode): |
| def outer(func_name): |
| def inner(*args, **kwargs): |
| res = func_name(*args, **kwargs) |
| return res |
| return inner |
| return outer |
| @outer_plus('MySQL') |
| def func(): |
| pass |
装饰器修复技术
| def index(): |
| """index函数 非常的牛""" |
| pass |
| help(index) |
| help(len) |
| from functools import wraps |
| def oute00+ |
| r(func_name): |
| @wraps(func_name) |
| def inner(*args, **kwargs): |
| """我是inner 我擅长让人蒙蔽""" |
| res = func_name(*args, **kwargs) |
| return res |
| return inner |
| |
| @outer |
| def func(): |
| """我是真正的func 我很强大 我很牛 我很聪明""" |
| pass |
| |
| |
| |
| |
| func() |
递归函数
| 1.函数的递归调用 |
| 函数直接或者间接的调用了函数自身 |
| 直接调用 |
| def index(): |
| print('from index') |
| index() |
| index() |
| 间接 |
| def index(): |
| print('from index') |
| func() |
| |
| def func(): |
| print('from func') |
| index() |
| |
| func() |
| '''最大递归深度:python解释器添加的安全措施''' |
| count = 0 |
| def index(): |
| global count |
| count += 1 |
| print(count) |
| index() |
| index() |
| '''官网提供的最大递归深度为1000 我们在测试的时候可能会出现996 997 998''' |
| |
| 2.递归函数 |
| 1.直接或者间接调用自己 |
| 2.每次调用都必须比上一次简单 并且需要有一个明确的结束条件 |
| 递推:一层层往下 |
| 回溯:基于明确的结果一层层往上 |
| """ |
| get_age(5) = get_age(4) + 2 |
| get_age(4) = get_age(3) + 2 |
| get_age(3) = get_age(2) + 2 |
| get_age(2) = get_age(1) + 2 |
| get_age(1) = 18 |
| """ |
| def get_age(n): |
| if n == 1: |
| return 18 |
| return get_age(n-1) + 2 |
| res = get_age(5) |
| print(res) |
作业
| 1.利用递归函数依次打印列表中每一个数据值 |
| l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]] |
| def func(num): |
| for i in num: |
| if type(i) == list: |
| func(i) |
| else: |
| print(i) |
| |
| |
| func(l1) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构