今日总结
- 名称空间
- 名字的查找顺序
- 作用域
- global与nonlocal关键字
- 函数名对象
- 函数的嵌套
内容详细
名称空间
# 名称空间就是存放变量名与变量值绑定关系的地方
# 名称空间的分类
1.内置名称空间:就是Python解释器提前给我们定义好的,像len() print() open()等
2.全局名称空间:在py文件中编写的代码运行产生的名字都会存放到全局名称空间
eg:name = 'jason' # 变量名name存入到全局名称空间
def index(): # 函数名index存入到全局名称空间
pass
if True:
a = 1 #变量名a存入全局名称空间
for i in range(10): # 变量名i存入全局名称空间
pass
while True:
b = 2 # 变量名b存入全局名称空间
3.局部名称空间:函数体代码运行产生的都是局部名称空间
eg:def index():
name = 'jasson' # name存入局部名称空间
# 存活周期
1.内置名称空间:Python解释器一运行就会产生,一关闭就会销毁
2.全局名称空间:py文件开始运行就会产生,一结束就会销毁
3.局部名称空间:函数体代码运行就会产生,一结束就会销毁
名字的顺序查找
# 在查找名字的时候,一定要先知道自己处在哪个空间。如果在局部名称空间,顺序就是:局部名称空间>>>
# 全局名称空间>>>内置名称空间
# 如果在全局名称空间顺序就是:全局名称空间>>>>内置名称空间
# 局部名称空间之间如果不是嵌套关系,那么它们之间就互不干涉
作用域
# 作用域就是名称空间能够作用的范围
内置名称空间
程序任意阶段任意位置均可使用(全局有效)
全局名称空间
程序任意阶段任意位置均可使用(全局有效)
局部名称空间
一般情况下只在各自局部名称空间中有效(局部有效)
'''也可以通过一些手段打破规则'''
global与nonlocal关键字
# global关键字:局部修改全局不可变类型
eg:x = 1
def index():
x = 2
(并不是修改全局的x,而是在局部名称空间中创建一个新的x)
#如果想要在局部名称空间中修改全局名称空间的名字(不可变类型),就需要使用关键字global申明
#如果想要在局部名称空间中修改全局名称空间的名字(可变类型),不需要使用关键字global申明
eg:def index():
x = 111 # 在index的局部产生一个x = 111
l1 = [11,22,33]
def f1():
# x = 222(在f1的局部产生一个x = 222)
# print(x)
# 局部名称空间嵌套,内层修改外层
# nonlocal x
# x = 333
l1.append(44)
f1()
print(X)
print(l1)
index()
# 局部名称空间嵌套的情况下,内层如果想要修改外层,如果数据是不可变类型需要使用关键字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 func():
print('from func')
return index # 将函数名当做返回值
def index():
print('from index')
res = func() # res接收函数名
print(res) # 指向的是index函数的内存地址
res()
4.函数名可以作为容器类型的元素(内部可以存放多个元素的数据类型,如列表、集合、字典等)
def index():
print('from index')
l1 = [11,22,33,index]
print(l1)
l1[-1]()
函数的嵌套
def index():
func()
print('from index')
def func(): # 死循环
index()
print('from func')
func()
def my_max(a,b):
"""返回两个数中的较大值"""
if a > b:
return a
return b
def many_max(a,b,c,d):
"""返回四个数中的较大值"""
res = my_max(a,b) # 两两先比
res1 = my_max(res,b)
res2 = my_max(res1,d)
...
def all_func(cmd):
def register():
print('注册功能')
def login():
print('登录功能')
def transfer():
print('转账功能')
if cmd == '1':
register()
elif cmd == '2':
login()
elif cmd == '3':
transfer()
else:
print('再见')