内容回顾
多层语法糖
有参装饰器
装饰器模板
装饰器修复技术
递归函数
多层语法糖
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( )
'''
多层语法糖 加载顺序由下往上
每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖
如果上面没有语法糖了 则变形为 index = outter1(wrapper2)
'''
有参装饰器
def outer ( mode) :
def login_auth ( func_name) :
def inner ( * args, ** kwargs) :
username = input ( 'username>>>:' ) . strip( )
password = input ( 'password>>>:' ) . strip( )
if mode == '1' :
print ( '数据直接写死' )
elif mode == '2' :
print ( '数据来源与文本文件' )
elif mode == '3' :
print ( '数据来源于字典' )
elif mode == '4' :
print ( '数据来源于MySQL' )
return inner
return login_auth
'''当装饰器中需要额外的参数时>>>:有参装饰器'''
'''
函数加括号执行优先级最高 有参装饰器的情况
先看函数名加括号的执行
然后再是语法糖的操作
'''
@outer ( '1' )
def index ( ) :
print ( 'from idex' )
index( )
@outer ( '2' )
def func ( ) :
print ( 'from func' )
func( )
无参、有参装饰器模板
def outer ( func_name) :
def inner ( * args, ** kwargs) :
res = func_name( )
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 functool import wraps
def outer ( func_name) :
@wraps ( func_name)
def inner ( * args, ** kwargs) :
'''我是inner 我的目的是为了迷糊人'''
res = func_name( )
return res
return inner
@outer
def func ( ) :
'''我是真正的func没有被装饰'''
pass
help ( func)
递归函数
1. 函数的递归调用
函数直接或者间接的调用了函数自身
def index ( ) :
print ( 'from index' )
index( )
index( )
def inex ( ) :
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 998'''
2. 递归函数
1. 直接或间接调用
2. 每次调用都必须比上一次简单 并且需要有一个明确的结束条件
递推:一层层往下
回溯: 基于明确的结果一层层往往上
伪代码:
age( 5 ) = age( 4 ) + 2 第五个人的年龄比第四个人的年龄大2 岁
age( 4 ) = age( 3 ) + 2 第四个人的年龄比第三个人的年龄大2 岁
age( 3 ) = age( 2 ) + 2 第三个人的年龄比第二个人的年龄大2 岁
age( 2 ) = age( 1 ) + 2 第二个人的年龄比的一个人的年龄大2 岁
age( 1 ) = 18 第一个人的年龄是18 岁
def get_age ( n) :
if n == 1 :
return 18
return get_age( n- 1 ) + 2
res = get_age( 5 )
print ( res)
练习
利用递归函数依次打印出列表中的每一个数据值
l1 = [ 1 , [ 2 , [ 3 , [ 4 , [ 5 , [ 6 , [ 7 , [ 8 , ] ] ] ] ] ] ] ]
def func ( num) :
for i in num:
if type ( i) == int :
print ( i)
else :
func( i)
func( l1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!