一、名稱空間和作用域
名稱空間: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