1. 程式人生 > >閉包 -> 函式的巢狀

閉包 -> 函式的巢狀

內層函式對外層函式中的變數的使用

好處:
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()