Python基础--函数的嵌套和闭包
一、名称空间和作用域
名称空间:Python所有有关命名的操作都是在操作名称空间,例如变量名,函数名
1、内置名称空间:Python解释器提供好的功能,解释器启动跟着一起启动,是全局作用域
2、全局名称空间:Python中顶行写的,不在函数内部定义的,都是全局名称空间,在运行的时候会产生名称空间,是全局作用域
3、局部名称空间:在一个小范围定义,只能当前范围及其子空间内运行,例如在函数内部定义的,是局部作用域
二、函数的嵌套
1、函数的嵌套调用
2、函数的嵌套定义
x = 1111111111111111
def f1():
#x=1
print('------>f1 ',x)
def f2():
#x = 2
print('---->f2 ',x)
def f3():
x=3
print('-->f3 ',x)
f3()
f2()
f1()
三、函数的使用
1、函数可以被当做变量赋值
def foo():
print("foo")
print(foo) #打印foo的内存地址空间,函数的名字在不带小括号时表示的是函数的内存地址
f=foo #把foo的内存地址空间做值赋值给f变量
print(f) #打印f,起始就是打印foo的内存地址空间
f() #f()事实上就是执行foo函数,等同于foo()
打印结果为
<function foo at 0x0000000000B91378> #print(foo)的结果
<function foo at 0x0000000000B91378> #print(f)的结果
foo #执行f()的结果,实际就是执行foo()的结果
2、函数可以当做参数传递
def foo():
print("foo")
print(foo) #打印foo的内存地址空间
f=foo #把foo的内存地址空间做值赋值给f变量
print(f) #打印f,起始就是打印foo的内存地址空间
f() #f()事实上就是执行foo函数,等同于foo()
def bar(func):
print(func) #这个是打印foo()函数的内存地址
func() #func是foo的内存地址,加()实际就是执行foo()函数
return func
f = bar(foo) #这个是获取bar的返回值
print(f) #打印f,就是打印bar()的返回值,就是foo()的内存地址,和print(func)相同
f() #f是bar
def bar(func):
print(func)
bar(foo()) #这个是先执行foo()行数,执行函数里的代码,先打印foo,然后把foo()的返回值作为bar()函数的实参传递给bar,foo()没有返回值,所以是None
#结果就是先输出一个 "foo" 然后bar(None),把none传递给bar()函数,打印No
四、闭包:内部函数的代码包含对外部作用域的引用,但一定不是对全局作用域的引用,闭包函数一定有__closure__方法
x=1
def f1():
x=2
y=3
def f2():
print(x)
y
return f2
f=f1() #f是f2的内存地址
f() #f()就是f2(),可以保证f2()可以在任何位置执行,而不受作用域的限制
print(f.__closure__) #打印结果是元组,元组个数代表的是闭包所引用的上次函数的元素个数
print(f.__closure__[0]) #结果是元组,可以使用索引的方式查看
print(f.__closure__[0].cell_contents) #查看指定元组所对应的应用上层参数的值
def init(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper