名称空间:Python全部有关命名的操做都是在操做名称空间,例如变量名,函数名 一、内置名称空间:Python解释器提供好的功能,解释器启动跟着一块儿启动,是全局做用域 二、全局名称空间:Python中顶行写的,不在函数内部定义的,都是全局名称空间,在运行的时候会产生名称空间,是全局做用域 三、局部名称空间:在一个小范围定义,只能当前范围及其子空间内运行,例如在函数内部定义的,是局部做用域
一、函数的嵌套调用 二、函数的嵌套定义
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()
一、函数能够被当作变量赋值
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()的结果
二、函数能够当作参数传递闭包
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
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