今日总结

  • 名称空间

  • 名字的查询

  • 作用域

  • global与nonlocal关键字

  • 函数名对象

  • 函数的嵌套

 

名称空间

名称空间:存放变量名和变量值绑定的地方

名称空间的分类:
1.内置名称空间
python解释器提前给我们定义好的
len() print() open()
2.全局名称空间
在py文件中编写的代码运行产生的名字都会存到全局名称空间
age = 18 # 变量名age进入全局名称空间
def func(): # 函数名func存入全局名称空间
pass
3.局部名称空间
函数体代码运行产生的都是局部名称空间
def index():
age = 18 # age进入局部名称空间
存活周期
1.内置名称空间
python解释器运行 产生
python解释器关闭 销毁
2.全局名称空间
py文件开始运行 产生
py文件结束运行 销毁
3局部名称空间
函数体代码开始运行 产生
函数体代码结束运行 销毁

 

名字的顺序查找

在查找名字的时候 一定要搞清楚自己在哪个空间
1.如果在局部名称空间
查找顺序为:局部名称空间>>>全局名称空间>>>内置名称空间
2.如果在全局名称空间
查找顺序为:全局名称空间>>>内置名称空间

作用域

作用域就是名称空间能够作用的范围
内置名称空间
程序任意阶段位置均可使用(全局有效)
全局名称空间
程序任意阶段位置均可使用(全局有效)
局部名称空间
一般情况下只在各自局部名称中使用(局部有效)

global与nonlocal关键字

global:局部修改全局不可变类型

不可变:
a = '全局'
def index():
x = '局部' ## 并不是在修改全局的x 而是在局部空间创建了一个新的x
#如果想要在局部名称空间中修改全局名称空间中的名字 属于不可变类型 那么需要关键字申明 不可变类型不需要加关键字
global x # 申明 修改的是全局x而不是产生新的x
x = 555

index()
print(x)
可变:
l1 = [111,222,333]
def index():
l1.append[444]
index()
print(l1)

 

 


nonlocal:对于嵌套函数,内层如果想要修改外层不可变数据类型则需要此关键字,不可变数据类型不需要

 

 

函数多种用法

用法1:函数名可以当作变量名赋值
def index():
print('from function index')
print(index)
res = index #让res也指向函数体代码
print(res)
res() # index()

 

 



用法2:函数名还可以当成函数的实参
def index():
print('from index')
def func(a):
print('from func')
print(a)
a()
func(index)

 

 


用法3:函数名还可以当作函数的返回值
def index():
print('from index')
return index # 将函数名当作返回值
def func():
print('from func')
res = index() # 接收函数名
print(res) #指向func函数的内存地址
res() # func()

 

 


用法4:函数名可以作为容器类型的元素
def index():
print('from index')
l1 = [11,22,33,44,index]
print(l1)
l1[-1]() # index()

 

 

 

函数的嵌套

def my_max
'''返回两个数最大的值'''
if a > b:
return a
return b

def many_max(a,b,c,d)
res = my_max(a,b)
res1 = my_max(res,c)
res2 = my_max(res1,d)
many_max(33,55,22,77) # 返回77



 posted on 2022-03-17 20:50  鳗鱼的春天  阅读(23)  评论(0编辑  收藏  举报