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