目录
global与nonlocal
money = 666
def index():
global money
money = 123
index()
print(money) # 123
"""
局部名称空间直接修改全局名称空间中的数据
"""
def index():
name = 'jason'
def inner():
nonlocal name
name = 'kevin'
inner()
print(name)
index() # kevin
"""
内部局部名称空间修改外层局部名称空间中的数据
"""
函数名的多种用法
+++++++++++
函数名其实绑定的也是一块内存地址 只不过该地址里面存放是不是数据值而是一段代码 函数名加括号就会找到该代码并执行
+++++++++++
1. 可以当做变量名赋值
def index():pass
res = index
res
2. 可以当做函数的参数
def index():
print('from index')
def func(a):
print(a) # 打印了a变量名绑定的数据值index函数的内存地址
a() #类似于执行了index()函数
func(index)
3. 可以当做函数的返回值
def index():
print('from index')
def func():
print('from func')
return index
res = func() # from func
print(res) #打印index函数内存地址
res() # 相当于执行index()函数的代码块 from index
def index():
print('from index')
def func():
print('from func')
return func
res = index() # from index
print(res) # 打印func函数的绑定内存地址
res() # 相当于执行func()函数的代码块 from func
4. 可以当做容器类型(可以存放多个数据的数据类型)的数据
def register():
print('注册功能')
def login():
print('登录功能')
def withdraw():
print('提现功能')
def transfer():
print('转账功能')
def shopping():
print('购物功能')
# 定义功能编号与功能的对应关系
func_dict = {
'1': register,
'2': login,
'3': withdraw,
'4': transfer,
'5': shopping
}
while True:
print("""
1.注册功能
2.登录功能
3.提现功能
4.转账功能
5.购物功能
""")
choice = input('>>>:').strip()
if choice in func_dict:
func_name = func_dict.get(choice)
func_name()
else:
print('功能编号不存在')
闭包函数
"""
定义在函数内部的函数 并且用到了外部函数名称空间中的名字
1. 定义在函数内
2. 用到外部函数名称空间中的名字
"""
# 简单版闭包函数
def index():
name = 'jason'
def inner():
print(name)
# 给函数体代码传参的方式1: 代码里面缺什么变量名形参里面就补什么变量名
def register(name,age):
print(f"""
姓名:{name}
年龄:{age}
""")
register('jason', 18)
# 给函数体代码传参的方式2:闭包函数
def outer(name, age):
def register():
print(f"""
姓名:{name}
年龄:{age}
""")
return register
res = outer('jason', 18)
res()
res()
装饰器简介
1.概念
在不改变被装饰对象原代码和调用方式的情况下给被装饰对象添加新的功能
2.本质
并不是一门新的技术,而是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的结果
3.口诀
对修改封闭 对扩展开放
4.储备知识
时间相关操作
import time
print(time.time()) #时间戳(距离1970-01-01 00:00:00所经历的秒数)
time.sleep(3)
print('睡醒了 干饭')
count = 0
#循环之前先获取时间戳
start_time = time.time()
while count < 1000:
print('呵呵')
count += 1
end_time = time.time()
print('循环消耗的时间:', end_time - start_time)
装饰器推导流程
import time
def index():
time.sleep(3)
print('from index')
def home():
time.sleep(1)
print('from home')
'''1.直接在调用index函数的前后添加代码'''
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>', end_time - start_time)
import time
def index():
time.sleep(3)
print('from index')
def home():
time.sleep(1)
print('from home')
'''2.index调用的地方较多 代码不可能反复拷贝>>>:相同的代码需要在不同的位置反复执行>>>:函数'''
def get_time():
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>', end_time-start_time)
get_time()
import time
def index():
time.sleep(3)
print('from index')
def home():
time.sleep(1)
print('from home')
'''3.函数体代码写死了 只能统计index的执行时间 如何才能做到统计更多的函数运行时间 直接传参变换统计的函数'''
def get_time(xxx): #xxx为形参,接收函数名get_time实参传进来的函数
start_time = time.time()
xxx() # 接收index函数名并执行index()函数体内的代码
end_time = time.time()
print('函数的执行时间为>>>', end_time - start_time)
get_time(index) # 接收index函数名并执行get_time函数体内代码
get_time(home) # 接收home函数名并执行get_time函数体内代码
import time
def index():
time.sleep(3)
print('from index')
def home():
time.sleep(1)
print('from home')
'''4.虽然实现了一定的兼容性 但是并不符合装饰器的特征 第一种传参不写 只能考虑闭包'''
def outer(xxx):
# xxx = index
def get_time():
start_time = time.time()
xxx()
end_time = time.time()
print('函数的执行时间为>>>', end_time - start_time)
return get_time
res = outer(index)
res()
res1 = outer(home)
res1()
import time
def index():
time.sleep(3)
print('from index')
def home():
time.sleep(1)
print('from home')
'''5.调用方式还是不对 如何变形>>>:变量名赋值绑定(******)'''
def outer(xxx):
def get_time():
start_time = time.time()
xxx()
end_time = time.time()
print('函数的执行时间为>>>', end_time - start_time)
return get_time
# res = outer(index) #赋值符号的左边是一个变量名 可以随意包括命名
# res()
# res1 = outer(home)
# res1()
index = outer(index)
index()
home=outer(home)
home()
import time
'''6.上述装饰器只能装饰无参函数 兼容性太差'''
def func(a):
time.sleep(0.1)
print('from func', a)
def func1(a,b):
time.sleep(0.2)
print('from func1', a, b)
def func2():
time.sleep(0.3)
print('from func2')
def outer(xxx):
def get_time(a, b):
start_time = time.time()
xxx(a, b)
end_time =time.time()
print('函数的执行时间为>>>:',end_time - start_time)
return get_time
func1 = outer(func1)
func1(1, 2)
import time
'''7.被装饰的函数不知道有没有参数及有几个参数 如何兼容'''
def func(a):
time.sleep(0.1)
print('from func', a)
def func1(a,b):
time.sleep(0.2)
print('from func1', a, b)
def outer(xxx):
def get_time(*args, **kwargs): # get_time(1,2,3) args=(1,2,3)
start_time = time.time()
xxx(*args, **kwargs) # xxx(*(1,2,3)) xxx(1,2,3)
end_time =time.time()
print('函数的执行时间为>>>:',end_time - start_time)
return get_time
func = outer(func)
func(123)
func1=outer(func1)
func1(1,2)
装饰器模板
装饰器语法糖