函数(二)
一.函数时第一类对象:函数名指向的值可以被当中参数传递
1.函数名可以被传递
name = 'jason' x = name print(x) print(id(x)) def func(): print('from func') print(func) print(id(func)) f = func func() print(f) f() # 其实指向的也是函数func指向函数体代码的内存地址
2.函数名可以被当做参数传递给其他函数
def func(): print('from func') def index(args): print(args) args() print('from index') index(func)
3.函数名可以被当做函数的返回值
def index(): print('index') def func(): print('func') return index res = func() print(res) res()
4.函数名可以被当做容器类型的参数
def func(): print('func') print(func()) l = [1,2,func,func()] # [1,2,<function func at 0x000001F7D79899D8>,None] print(l)
二.函数的嵌套调用与定义
1.嵌套调用
再函数内部调用其他函数,可以将复杂的逻辑简单化
def my_max(x,y): if x > y: return x return y def my_max4(a,b,c,d): res1 = my_max(a,b) res2 = my_max(res1,c) res3 = my_max(res2,d) return res3 print(my_max4(1,2,10,4))
2.嵌套定义
定义场景:写一个函数该函数用户可以通过传参的不同控制函数执行不同的功能
def outer(): x = 1 print('outer') def inner(): print('inner') # print(inner) return inner res = outer() print(res) res()
三.名称空间(命名空间)
1.名称空间是什么?
存放的是变量名与变量值的内存地址得绑定关系的地方
2.名称空间的分类:(一共分为三种)
1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
len max min
2.全局名称空间:文件级别的代码
x = 1 if 1 ==1 : y = 2 print(y) while True: z = 3 #x,y,z都会放到全局名称空间里 #if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的
3.局部名称空间:函数体内创建的名字都属于局部名称空间
3.生命周期:
内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁
全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁
局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)
4.图解
5.名称空间的查找顺序(******)
1.需要先确定你当前在哪(大前提)
1.站在全局: 全局 >>> 内置
2.站在局部: 局部 >>> 全局 >>> 内置
按照上图来说就是先锁定你当前的位置,从当前位置向外面的找
函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)
x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): # x = 444 def f4(): # x = 555 print(x) x = 777 # 纯粹为了教学演示 f4() x = 777 # 纯粹为了教学演示 f3() f2() f1() def func(): x = 1 def index(): print(x) # 获取全局找x return index res = func() x = 999 res()
四.作用域
首先作用域分为两大类:1.全局作用域
有效范围:内置名称空间 全局名称空间
2.局部作用域
有效范围:局部名称空间
下面有两个能够修改全局变量与局部变量的方法
1.global 2.nonlocal
1.在局部修改全局变量
# global 在局部修改全局的不可变数据类型 # x = [] # 因为列表是可变类型 x = 1 # 不可变类型 username = 'jason' def func(): # x.append('嘿嘿嘿') global x,username # 修改全局变量 而不是创建局部名称空间 x = 999 username = 'egon' func() print(x) print(username)
2.在局部修改局部变量
# nonlocal 局部修改局部 def func(): x = 1 def index(): nonlocal x x = 2 index() print(x) func()
global:局部修改全局 如果想修改多个 逗号隔开
nonlocal:局部修局部 如果想修改多个 逗号隔开
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!