global与nonlocal
1.global的作用:
可以在局部空间里直接就该全局名称工具中的数据
代码展示:
name = 'moon'
def fucn():
name = 'god'
fucn()
print(name)
def fucn():
global name
name = 'god'
fucn()
print(name)
2.nonlocal的作用:
可以是内部局部空间修改外层局部空间变量数据
def fucn():
age = 18
def fucn2():
age = 20
fucn2()
print(age)
fucn()
def fucn():
age = 18
def fucn2():
nonlocal age
age = 20
fucn2()
print(age)
fucn()
函数名的多种用法
函数名其实也是类似一个变量名,只是一个名字和一个内存地址的链接,该地址内存放的不是数据值而是一端代码,当使用函数名后面加上()时 则会通过这个名字找到这段代码并执行
1.函数名可以用来给变量名赋值
def func():
name = 'moon'
res = func
res()
print(res)
2.可以当做函数的实参
def func():
print('moon')
def func2(func):
print('god')
print(func)
func2(func)
3.可以当做函数的返回值
def func()
print('func')
def func1()
print('func1')
return func
res = func1()
print(res)
res()
4.函数名也可以当做是容器类型,可以放在字典中
def register():
print('注册功能')
def login():
print('登录功能')
func_dict = {'1':register,'2':login}
choice = input('请选择要执行的功能>>>')
if choice in func_dict
func_dict.get(choice)()
else:
print('功能不存在')
闭包函数
1,什么是闭包函数?
在函数体内部的函数,并且用到了外部函数名称空间中的名字
需要满足,定义在函数体内 并且 用到了外部函数名称空间中的名字
代码展示:
def func():
a = 1
b = 2
def func2():
print(a+b)
func2()
func()
2,闭包函数实际应用
给另外一种函数体代码传参的方式
2.1方式1:代码里面缺什么变量名形参里面就补什么变量名
def func(a,b):
a = a
b = b
def func2():
print(a+b)
func2()
func(1,2)
func(1,2)
func(1,2)
2.2闭包函数传参
def func(a, b):
def func2():
print(a + b)
return func2
res = func(2,3)
res()
res()
res = func(3,3)
res()
res()
装饰器简介
1,装饰器的概念
在!不改变被装饰对象的源代码!和!调用方式!的情况下给被装饰的对象添加新的功能
2.本质
是由 函数参数 加上 名称空间 函数名多种用法 闭包函数技术的组合产生的
3.口诀
对修改封闭 对扩展开发
4,装饰器的推导流程
import time
def index():
time.sleep(3)
print('from index')
def home():
time.sleep(1)
print('from home')
--------现在如果我们想在 index函数体代码前后添加代码-------
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
--------现在如果这段代码需要在不同地方反复使用 我们再把他们包装成函数-------
def get_time():
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
get_time()
--------现在如果这段代码需要在不同地方反复使用 并且是不同的函数体-------
def get_time(xxx):
start_time = time.time()
xxx()
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
get_time(index)
get_time('其他实参')
------------更加完善一点,加上闭包函数的功能---------------
def outer(xxx):
def get_time():
start_time = time.time()
xxx()
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
return get_time
res = outer(index)
res()
------------更加完善一点,如果传递的函数本身还有形参---------------
import time
def index(a):
print(a)
time.sleep(3)
print('from index')
def home(a,b):
time.sleep(1)
print('from home')
def outer(xxx):
def get_time(a):
start_time = time.time()
xxx(a)
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
return get_time
res = outer(index)
res(a)
------------更加完美,被装饰函数不确认有多少传参---------------
def outer(xxx):
def get_time(*regs,**wregs):
start_time = time.time()
xxx(*regs,**wregs)
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
return get_time
res = outer(index)
res(a,2,2,3,2)
------------被装饰函数如果有返回值---------------
import time
def index(*args):
print(args)
time.sleep(2)
print('from index')
return '我是index'
def moon(a,b):
time.sleep(1)
print('from MOON')
return '我是moon'
def outer(xxx):
def get_time(*args,**kwargs):
start_time = time.time()
res = xxx(*args,**kwargs)
end_time = time.time()
print('函数index的执行时间为>>>:', end_time - start_time)
return res
return get_time
res = outer(moon)
print(res(123,222))
装饰器固定模板
def 装饰器函数名(被装饰函数名):
def inner(*args,**kwargs):
res = 被装饰函数名(*args,**kwargs)
return res
return inner
装饰器语法糖
def outer(func_name):
def inner(*args,**kwargs):
res = func_name(*args,**kwargs)
return res
return inner
@outer
def func():
print('im func')
return 'func'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了