閉包執行的時候值的傳遞方式

2021-07-24 14:58:48 字數 858 閱讀 8520

**中有問題和問題的解釋。

#!/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個分塊,每塊...