目录
一.多层语法糖
语法糖会将下面紧挨着的函数名当做第一个参数自动传给@函数调用
实际案例:
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')
二.有参装饰器
1.什么是有参装饰器:
给装饰器传递额外的参数,满足多个数据值的传输切换
2.实操
def outer(mode):
def login(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('数据来自集合')
elif mode == '5':
print('数据来于文本文件')
return inner
return login
@outer('1')
def index():
print('from index')
index()
@outer('2')
def func():
print('from func')
func()
"""
函数名加括号执行优先级最高 有参装饰器的情况
先看函数名加括号的执行
然后再试语法糖的操作
"""
3.装饰器模板
1.常用的无参装饰器模板
def outer(func_name):
def inner(*args, **kwargs):
'''被装饰函数执行前可做的额外的操作'''
res = func_name(*args, **kwargs)
'''被装饰函数执行后可做的额外操作'''
return res
return inner
@outer
def index():
pass
2.不常用的有参装饰器
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('dict')
def func():
pass
三.装饰器修复技术
-
了解知识
help() :在使用python来编写代码时,会经常使用python自带函数或模块,一些不常用的函数或是模块的用途不是很清楚,这时候就需要用到help函数来查看帮助。help()函数是查看函数或模块用途的详细说明。
def index(): '''我是最棒的!!!''' pass help(index) 结果: Help on function index in module __main__: index() 我是最棒的!!!
-
装饰器修复技术
from functools import wraps def outer(func_name): def inner(*args, **kwargs): '''我是inner''' res = func_name(*args, **kwargs) return res return inner @outer def func(): '''我是才是func''' pass help(func) print(func) 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(3) = get_age(1) + 2 gat_age(1) = 18 """ def get_age(n): if n == 1: return 18 return get_age(n-1) + 2 res = get_age(5) print(res) # 26