今日 重点知识
一:函数是第一类对象
1.函数名可以被传递
name = 'jason' x = name print(x) print(id(x),id(name)) def func(): print('func123') print('func') print(id(func)) f=func #在函数定义阶段 func()# 在函数调用阶段 print(f,id(f),id(func)) f() #其实指向的也是函数fun从指向航叔体代码的内存地址 2.函数名可以被当做参数传递给其他函数
def func(): # 第五步 print('from func') #第六步 def index(args): #第二步 func=args print(args) # 第三步 ====>print(func) 此时就是func中存的地址 args() # 第四步 print('from index') # 第七步 index(func) # 第一步 ''' 结果:from func from index
3.函数名可以被当做函数的返回值
def index(): #第七步 print('index') #第八步 def func(): #第二步 print('func') #第三步 打印func return index #第四步 把index作为返回值返回给res res = func() # 第一步 print(res) #第五步 res 相当于 index 就是答应他的地址 res() #第六步 相当于index()
结果为:funcindex
4.函数名可以被当做容器类型的参数
def func(): #第二步 print('func1') #第三步 print(func()) #第一步 l = [1,2,func,func()] #第四步 print(l) #第五步
结果为:func1 None func1 [1, 2,, None]
二:名称空间
名称空间是什么? 就是放名字的地方 详细解释:存放的是变量名与变量值的内存地址得绑定关系的地方 要想访问一个变量的值 必须先去名称空间中拿到对应的名字 才能够访问变量的值
1,名称空间的分类:
1,内置名称空间
即python自身内部创建好的,提前定义好的,例如 len, max, min
2,局部名称空间
在函数内部的,函数体内创建的名字都属于局部名称空间
3,全局名称空间
相对于文件级别的,在for while,中创建的名字都是全局名称空间的
2,生命周期(名称空间)
1,内置名称空间:在python解释器启动时就已经创建好的,关闭解释器立马销毁
2,全局名称空间:右键运行执行文件时创建,执行结束完立马销毁
3,局部名称空间:函数调用时,自动创建,函数执行完毕,立马销毁,自动销毁
3,名称空间的查找顺序:
名字的查找顺序:
1,首先要确定你当前在那(全局还是局部)
1,站在全局:首先在全局找,找不到再去内置名称空间找
2,站在局部:首先在局部找,找不到再去全局找,全局无就去内置找。
+ 总结:函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)
局部与局部之间是并列关系,站在全局找,只有全局和内置
作用域作用
作用域
全局作用域: 全局有效,:
内置名称空间
全局名称空间
局部作用域: 局部有效
局部作用域
在局部修改全局的变量:global
global 在局部修改全局的不可变数据类型
局部修改全局 如果想修改多个 逗号隔开
nonlocal:局部修局部 如果想修改多个 逗号隔开