Python基礎 函式的巢狀和閉包

2022-08-20 18:06:11 字數 2226 閱讀 6454

命名空間: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=3print('-->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()

列印結果為

#print(foo)的結果

#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

x=1

def f1():

x=2y=3

def f2():

print(x)

yreturn 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):

res=func(*args,**kwargs)

return res

python函式巢狀閉包 閉包與巢狀函式

沒有區別,因為沒有閉合函式,不是真的。有closures,但這一術語指的是在外部和內部範圍中儲存變數的技術。只剩下巢狀函式。在 巢狀函式只是在另乙個函式內部定義的函式 def outer def inner 當outer 定義了乙個inner 然後也使用的名稱,則該變數名稱為閉包單元,儲存在inne...

Python巢狀函式 閉包

python中乙個與眾不同的語法就是可以巢狀函式,所謂巢狀,並不像其他語言中的在乙個函式中呼叫另乙個函式,而是在定義乙個函式的時候,函式體裡還能定義另乙個函式。內函式可以訪問外函式的作用域,這就是 python基礎教程 p105裡 它帶著它的環境 和相關的區域性變數 及 由於python的巢狀作用域...

函式物件 巢狀和閉包函式

精髓 可以把函式當成變數去用 func 記憶體位址 def func print from func f func 函式func賦值給變數f print f,func 列印f和func的記憶體位址,完全相同 f 相當於呼叫了函式func 輸出 func at 0x02f434a8 from func...