名称空间与作用域
名称空间Namespace:存放名字与内存地址绑定关系的地方
内置名称空间:
放的是python自带的名字,print/len/input等
生命周期:解释器启动则产生,解释器关闭则销毁
全局名称空间:
放的是顶级的名字
生命周期:运行python文件则立即产生,python文件运行结束则销毁
局部名称空间:
放的是函数内的名字
生命周期:调用函数则产生,函数调用完毕则销毁
重要的结论1:名字的查找优先级
局部--》全局--》内置 LEGB,l,当前位置,E外部位置,G全局位置,B内置位置
基于自己当前所在的位置向外查找
重要结论2:名称空间的嵌套关系是以函数定义为准生成的,与调用位置无关
global:全局名称空间
x = 1
def foo():
global x
x = 2
foo()
print(x)
x = 2
在局部改全局
nonlocal:(关键字)外部位置:声明一个名字是来自外层函数,如果外层没有不会找到全局,会报错
x = 1
def f1():
x = 2
def f2():
nonlocal x
x = 3
f2()
print(x)
f1()
全局作用域:全局存活,全局有效
内置名称空间。全局名称空间
局部作用域:临时存活,局部有效
局部名称空间
函数是第一类对象:函数是第一等公民
1,函数可以被赋值
def foo():
print('form foo')
f = foo
f()
2,函数可以被赋值
x = 10
def func(aaa):
print(aaa)
func(x)
3,函数可以当作函数的返回值
def foo():
print('form foo')
4,函数可以当作容器类型的元素
def foo():
print('form foo')
l = [foo]
ATM编写的大纲
# print('注册功能')
#
# def login():
#
# print('登录功能')
#
# def balance_enquity():
# print('余额查询')
#
# def transfer():
# print('转账')
#
# def withdraw():
# print('提现')
#
# func_dic={
# '1':['注册',register],
# '2':['登录',login],
# '3':['余额查询',balance_enquity],
# '4':['转账',transfer],
# '5':['提现',withdraw]
# }
#
# while True:
# for k in func_dic:
# print(k,func_dic[k][0])
# choice = input('请输入命令编号').strip()
# if not choice.isdigit():
# print('请输入正确的命令')
# continue
#
# if choice == '0':
# break
#
# if choice in func_dic:
# func_dic[choice][1]()
# else:
# print('输入的指令不存在')
函数的嵌套调用:在调用一个函数的过程中,该函数内部又调用了其他函数
def bar():
print('form bar')
def foo():
print('form foo')
bar()
foo()
def max2(x,y):
if x > y:
return x
else:
return y
def max4(a,b,c,d):
res1 = max2(a,b)
res2 = max2(res1,c)
res3 = max2(res2,d)
print(res3)
max4(115,222,888,456)
函数嵌套定义:在函数内又定义了其他函数---》封闭
def foo():
def bar():
print('form bar')
bar()
foo()
bar()
只能在函数内调bar,外部调不了,调foo也不行
闭包函数 = 名称空间与作用域 + 函数对象 + 函数嵌套定义
闭函数:定义在函数内部的函数
包函数:内部函数引用了一个外层函数的名字
def foo():
x = 111
def wrapper():
print(x)
return wrapper
f = foo()
闭包函数就是为函数体传参的一种方案
浙公网安备 33010602011771号