18闭包
閉包:
只能存在嵌套的函數中
- 封閉的東西:保證數據安全
- 內層函數對外層函數非全局變量的引用(使用),就會形成閉包
- 被引用的全局變量被稱作自由變量,這個自由變量會與內層函數產生一個綁定關系
- 自由變量不會再內存中消失
由于閉包這個概念比較難以理解,尤其是初學者來說,相對難以掌握,所以我們通過示例去理解學習閉包。
給大家提個需求,然后用函數去實現:完成一個計算不斷增加的系列值的平均值的需求。
例如:整個歷史中的某個商品的平均收盤價。什么叫平局收盤價呢?就是從這個商品一出現開始,每天記錄當天價格,然后計算他的平均值:平均值要考慮直至目前為止所有的價格。
比如大眾推出了一款新車:小白轎車。
第一天價格為:100000元,平均收盤價:100000元
第二天價格為:110000元,平均收盤價:(100000 + 110000)/2 元
第三天價格為:120000元,平均收盤價:(100000 + 110000 + 120000)/3 元
…
方案一
- 從方案一中可以看出,基本上完成了我們的要求,但是這個代碼相對來說是不安全的,因為你的這個 l1 列表是一個全局變量,只要是全局作用域的任何地方,都可能對這個列表進行改變。
如:
那么怎么辦呢?有人說,你把他放在函數中不就行了,這樣不就是局部變量了么?數據不就相對安全了么?這樣計算的結果是不正確的,那是因為執行函數,會開啟一個臨時的名稱空間,隨著函數的結束而消失,所以你每次執行函數的時候,都是重新創建這個列表。
def make_averager(new_value):l1 = []l1.append(new_value)total = sum(l1)return total / len(l1)print(make_averager(100000)) # 100000.0 print(make_averager(110000)) # 110000.0 print(make_averager(120000)) # 120000.0那么這怎么做呢?這種情況下,就需要用到閉包了,我們用閉包的思想改一下這個代碼
def make_averager():l1 = []def averager(new_value):l1.append(new_value)total = sum(l1)return total / len(l1)return averagerabc = make_averager() # 等于averager print(abc(100000)) print(abc(110000)) print(abc(120000))# 100000.0 # 105000.0 # 110000.0 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: 17匿名函数
- 下一篇: 24-移动端app数据爬取