**中有問題和問題的解釋。
#!/usr/bin/python
#coding: utf-8
# 判斷乙個人是否及格,如果滿分150,則90及格,如果滿分100,則60及格
# 開始的疑惑:當fun函式執行完以後,對應的val的值就應該消失,但是,
# 當下面**再次呼叫f(60)的時候(這個f()函式就是fun_c()函式)
# 卻能夠列印出val的值???
def fun(val):
'val是得到的分數'
# 列印此時儲存的val的位址
print("%x" % id(val))
def fun_c(passline):
'passline是及格線'
if val >= passline:
print("通過")
else:
print("不及格")
return fun_c
f = fun(89) # f就是fun_c函式
# 利用__closure__列印出fun_c()函式的屬性,可以發現f中第乙個元素的id值和val的id值位址相同
# 這說明如果引用了外部的變數(enclosing變數)的話,會將這個變數新增到函式屬性中
# 當再次進行查詢(即f(60))的時候,並不是到**中去查詢,而是到函式屬性中去查詢
# 也就是上面的fun_c的屬性中有val的值,是乙個元組,不能夠改變
print(f.__closure__)
f(60)
f = fun(89)
f(90)
閉包的作用:
1. **的封裝
2. **復用
傳遞閉包的應用
傳遞閉包是離散數學中的概念,先 不嚴謹的 給出一些定義 笛卡爾積 兩集合中的元素自由組成全部有序二元組 學名叫序偶 的集合 a b 則 a b a b 則a times b a b 則a b 關係 a b a times b a b的任意乙個子集稱r rr為從a aa到b bb的乙個關係,a a a...
傳遞閉包的計算 Warshall
o n 3 的高效閉包演算法 演算法內容 1.做出關係r的矩陣m 2.列舉每一列,以這一列對應的元素為中間元素去創造新的關係 一行一行來做,如果當前行對應的元素與列對應的元素有關係,例如arb,則考慮有無關係,若有關係則ar 具體實現就是m a m b 有點類似於多源最短路演算法,也是一種動態規劃的...
傳遞閉包的正確姿勢
就是給你乙個有向圖,詢問所有點對之間的可達性。直接floyed的複雜度為o n 3w o frac o wn3 同時由於floyed的列舉有後繼性,因此不能使用4毛子優化 考慮先縮掉scc,使得圖變為乙個dag。按照拓撲序逆序構造答案。此時由於狀態不存在後繼性,因此可以對中間點每b bb個分塊,每塊...