閉包 -> 函式的巢狀
阿新 • • 發佈:2018-12-10
內層函式對外層函式中的變數的使用
好處:
1. 保護變數不被侵害
2. 讓一個變數常駐記憶體
如何通過程式碼檢視一個閉包
__closure__: 有東西就是閉包. 沒東西就不是閉包
# 閉包的優點: # 1, 可以保護變數不被其他人侵害 # 2, 保持一個變數常駐記憶體 # def wrapper(): # a = "哈哈" # 不安全的一種寫法 # name = "周杰倫" # def inner(): # print(name) # 在內層函式中使用了外層函式的區域性變數 # print(a) # def ok(): # nonlocal a # a = 108 # print(a) # return inner # 返回函式名 # # ret = wrapper() # ret() # # def ok(): # global a # a = 20 # print(a ) # def wrapper(): # name = "周杰倫" # 區域性變數常駐與記憶體 # def inner(): # print(name) # 在內層函式中使用了外層函式的區域性變數 # return inner # 返回函式名 # # inner() # # ret = wrapper() # ret是一個內層函式 # ret() # ret是inner, 執行的時機是不確定的, 必須保證裡面的name必須存在 # 超級簡易版爬蟲 # from urllib.request import urlopen # 匯入一個模組 # # 幹掉數字簽名 # import ssl # ssl._create_default_https_context = ssl._create_unverified_context # # # def func(): # # 獲取到網頁中的內容, 當網速很慢的時候. 反覆的去開啟這個網站. 很慢 # content = urlopen("https://www.dytt8.net/").read() # # def inner(): # return content.decode("gbk") # 網頁內容 # return inner # # print("開始網路請求") # ret = func() # 網路請求已經完畢 # print("網路請求完畢") # print("第一次", ret()[5]) # print("第二次", ret()[5]) # def wrapper(): name = "alex" def inner(): print("胡辣湯") print(inner.__closure__) # 檢視是否是閉包. 有內容就是閉包, 沒有內容就不是閉包 inner() wrapper()