在python程式語言中,在函式體內置立另外乙個函式(物件,因為python一切皆物件,函式其實也是物件)是完全合法的,這種函式叫做內部/巢狀函式。
例子:
# coding : utf-8
def outer():
def inner():
print("is inner method")
print("is outer method")
inner()
#呼叫outer函式
outer()
#呼叫outer()的內部函式,報錯
# inner()
執行結果:
is outer method何為閉包?is inner method
inner() #呼叫inner()時,出現如下錯誤
nameerror: name 'inner' is not defined
如果在乙個內部函式裡,對在外部作用域(不是全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包(closure)
說的明了一點就是:在內部函式中,引用了外部函式的自由變數
閉包的作用:
閉包有兩種呼叫方式:
在內部直接呼叫
返回函式名稱
e.g1.在內部直接呼叫
# -*- coding: utf-8 -*-
def outer(name):
def inner(name):
# name = "mr.zhang" #這裡的name值會覆蓋呼叫outer函式實參的值,這是涉及變數在函式作用域的範圍
print("sub method :%s" %name)
# 使用__closuer__內建屬性來判斷是否是乙個閉包,返回位址,則是,返回none,則不是閉包函式
print(inner.__closure__)
inner(name) #在內部直接呼叫
outer("guido")
執行結果:
sub method :guidoe.g(,)
2.返回函式名稱
# -*- coding: utf-8 -*-
def sumer(num = 0):
count = [num]
def add():
count[0] += 1
return count[0]
return add
f = sumer(3)
print(f())
print(f())
print(f())
執行結果:
456
python函式巢狀閉包 閉包與巢狀函式
沒有區別,因為沒有閉合函式,不是真的。有closures,但這一術語指的是在外部和內部範圍中儲存變數的技術。只剩下巢狀函式。在 巢狀函式只是在另乙個函式內部定義的函式 def outer def inner 當outer 定義了乙個inner 然後也使用的名稱,則該變數名稱為閉包單元,儲存在inne...
Python巢狀函式 閉包
python中乙個與眾不同的語法就是可以巢狀函式,所謂巢狀,並不像其他語言中的在乙個函式中呼叫另乙個函式,而是在定義乙個函式的時候,函式體裡還能定義另乙個函式。內函式可以訪問外函式的作用域,這就是 python基礎教程 p105裡 它帶著它的環境 和相關的區域性變數 及 由於python的巢狀作用域...
python函式之高階 函式巢狀,命名空間,閉包
目錄2 函式命名空間與查詢順序 二 命名空間名字的查詢順序 3 函式作用域 4 函式的引數傳遞都是值拷貝 5 閉包函式 一 什麼是函式巢狀在乙個函式內又定義了另外乙個函式二 函式定義def foo def bar print from bar bar foo 這個是通過foo函式呼叫裡面的bar函式...