python-day12--函数进阶
1.命名空间:
分三种:全局命名空间,局部命名空间,内置命名空间。
加载顺序:内置命名空间→全局命名空间→局部命名空间
取值顺序:局部命名空间→全局命名空间→内置命名空间
2.作用域:
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含 内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效
小范围可以用大范围,大范围不能用小范围
在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。如果都没有,报错
3.globals方法 (全局改变)
a = 10
def func():
global a
a = 20
print(a)
func()
print(a)
4.locals方法
def func():
a = 12
b = 20
print(locals())
print(globals())
func()
在局部调用globals和locals
5.函数的嵌套和作用域链
嵌套定义:定义在内部的函数无法直接在全局被调用
def f1():
def f2():
def f3():
print("in f3")
print("in f2")
f3()
print("in f1")
f2()
f1()
作用域链:在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。如果都没有,报错
6.nonlocal关键字
# 1.外部必须有这个变量
# 2.在内部函数声明nonlocal变量之前不能再出现同名变量
# 3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
def f1():
a = 1
def f2():
nonlocal a
a = 2
f2()
print('a in f1 : ',a)
f1()
7.函数的本质:
①简单的说就是一个变量,保存了函数所在的内存地址
②具体来说:1.可以当变量被引用;2.可以被当作容器类型的元素;3.可当作函数的参数和返回值
8.闭包函数:
定义: 1.闭:内部的函数;2.包:包含外部函数的变量(就是用到外部函数的变量)
固定格式:
def func():
name = 'eva'
def inner():
print(name)
return inner
f = func()
f()
9.判断闭包函数的方法: __closure__
#输出的__closure__有cell元素 :是闭包函数
def func():
name = 'eva'
def inner():
print(name)
print(inner.__closure__)
return inner
f = func()
f()
#输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
def inner():
print(name)
print(inner.__closure__)
return inner
f2 = func2()
f2()
10.闭包嵌套:
def wrapper():
money = 1000
def func():
name = 'eva'
def inner():
print(name,money)
return inner
return func
f = wrapper()
i = f()
i()