def func1(): a1 = 1 b2 = 2 print(666) func1() # len() print()
全局名称空间:存储的是全局(py文件)的变量与值的对应关系
临时(局部)名称空间:当函数执行时,会在内存中临时开辟一个空间,此空间记录函数中的变量与值的对应关系,随着函数的结束,临时名称空间而关闭。
python中的空间:
全局名称空间
临时(局部)名称空间
内置名称空间: len print 等内置函数等等。
print()
加载顺序: 内置名称空间 ---> 全局名称空间 ---> 函数执行时:临时(局部)名称空间
作用域:
全局作用域: 内置名称空间 全局名称空间
局部作用域:临时(局部)名称空间
取值顺序: 函数执行时:临时(局部)名称空间 ---> 全局名称空间 ----> 内置名称空间
# 取值顺序满足就近原则 len = 66 print(len) a = 1 def func(): a = 66 def func1(): a = 99 print(a) func1() func()
坑 (取值)
global nonlocal
局部只能引用全局的变量但是不能修改,修改就会报错
global
1可以修改全局变量
2在局部空间可以声明一个全局变量
# global第一个作用 可以修改全局变量
a = 1 def func(): global a #使用global引用全局变量a a=1 a += 1 print(a) func() # 2在局部空间可以声明一个全局变量
def func(): global a a = 1 # print(a) func() print(a)
# nonlocal
# 1,不能操作全局变量
# 1,不能操作全局变量 a = 2 def func(): nonlocal a print(a) func()
# 2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改 变。
子名称空间只能引用父名称空间的变量,但是不能修改。
def func1(): a = 1 def inner(): nonlocal a a += 1 print(a) # a=2 print(a) #a=1 inner() print(a) #a=2 func1()
二、函数的嵌套
def func1(): print(111) def func2(): '''1万行代码''' print(222) print(333) func2() print(444) func1()
# 结果:111 333 222 444
def func1(): print(111) def func2(): print(222) func1() def func3(): func2() print(333) func3()
三、函数名的运用
1、函数名可以作为普通变量用
def func1(): print(111) func1() # 函数名(函数的内存地址) 特殊的变量 a = 1 b = a print(b) #结果出来的是1 print(func1) #直接打印函数名,函数名对应的就是 函数的内存地址 它是一个特殊的变量
f1 = func1
f2 = f1
# print(f2) 打印f2就是相当于执行print(func1)就是对应的函数的内存地址
f2() # 相当于执行func1这个函数,所以结果出来的是111
2、函数名可以作为函数的参数
def func1(): print(111) def func2(x): #x当做一个形参接收。 是func1这个函数名 print(x) #所以打印的func1这个函数名的内存地址 x() #执行x()就相当于执行func1函数,所以结果出来的是111 func2(func1)
这就是变量名的交换,我把func1变量名传给了x,我打印x,然后让x执行,就相当于执行func1
3、函数名可以作为函数的返回值
这个有点难度了。
def func1(): print(111) def func2(x): return x # 2、我的return x返回值返回给func2(func1) 就相当于返回给 ret, ret = func2(func1) # 1、此时我要执行func2这个函数了,然后我把func1传给了x。 3、ret=x x=func1 ret() # 4、相当于执行func1
4、函数名可以作为容器类数据类型的参数
a = 1 b = 2 c = 3 l1 = [a,b,c] for i in l1: print(i)
故此我们可以这样:
def func1(): print(111) def func2(): print(222) def func3(): print(333) def func4(): print(444) l1 = [func1, func2, func3, func4] for i in l1: i()
不仅如此,我们还可以这样,先写4个函数,然后把函数执行的序号和函数名放到字典中,使用while循环这个可以选择的序号,就可以执行相对应的函数。双击666:
def func1(): print(111) def func2(): print(222) def func3(): print(333) def func4(): print(444) dic = { 1: func1, 2: func2, 3: func3, 4: func4, } while 1: choice = int(input('请输入数字:')) dic[choice]()