24-Python函式4
摘要:
1.閉包
概念
在函式巢狀的前提下
內層函式引用了外層函式的變數(包括引數)
外層函式, 又把 內層函式 當做返回值進行返回
這個內層函式+所引用的外層變數, 稱為 "閉包"
標準格式
...
1.閉包
概念 在函式巢狀的前提下 內層函式引用了外層函式的變數(包括引數) 外層函式, 又把 內層函式 當做返回值進行返回 這個內層函式+所引用的外層變數, 稱為 "閉包" 標準格式 def test1(a): b = 10 其他函式定義程式碼 def test2(): print(a) print(b) return test2 應用場景 外層函式, 根據不同的引數, 來生成不同作用功能的函式 案例 根據配置資訊, 生成不同的分割線函式 注意事項 1. 閉包中, 如果要修改引用的外層變數 需要使用nonlocal 變數宣告 否則當做是閉包內, 新定義的變數 2. 當閉包內, 引用了一個, 後期會發生變化的變數時, 一定要注意 函式, 是被呼叫時, 才去確定變數標識所對應的值
2.裝飾器
作用 在函式名以及函式體不改變的前提下, 給一個函式附加一些額外程式碼 語法 @裝飾器 def 被裝飾函式(): code 案例 發說說, 發圖片 附加 身份驗證 操作 "開放封閉"原則 已經寫好的程式碼, 儘可能不要修改 如果想要新增功能, 在原先程式碼基礎上, 單獨進行擴充套件 單一職責 注意 裝飾器的執行時間, 是立即執行 進階 裝飾器疊加 從上到下裝飾 從下到上執行 對有參函式進行裝飾 無論什麼場景, 保證函式呼叫引數個數一致 為了通用, 可以使用不定長引數, 結合 拆包操作進行處理 對有返回值的函式進行裝飾 無論什麼場景, 保證函式返回值一致 帶有引數的裝飾器 通過@裝飾器(引數)的方式, 呼叫這個函式, 並傳遞引數; 並把返回值, 再次當做裝飾器進行使用 先計算 @ 後面的內容, 把這個內容當做是裝飾器
3.生成器
生成器 是一個特殊的迭代器(迭代器的抽象層級更高) 所以, 擁有迭代器的特性 惰性計算資料, 節省記憶體 能夠記錄狀態, 並通過next()函式, 訪問下一個狀態 具備可迭代特性 但是, 如果打造一個自己的迭代器, 比較複雜 需要實現很多方法 後續在"面向物件"程式設計中會進行講解 所以, 就有一個更加優雅的方式 "生成器" 建立方式 生成器表示式 把列表推導式的[] 修改成() (i for i in range(1, 10000000) if i % 2 == 0) 生成器函式 函式中包含yield語句 這個函式的執行結果就是 "生成器" 產生資料的方式 生成器具備可迭代特性 next()函式 等價於 生成器.__next__() for in send() 方法 send方法有一個引數,指定的是上一次被掛起的yield語句的返回值 相比於.__next__() 可以額外的給yield 語句 傳值 注意第一次呼叫 t.send(None) 關閉生成器 g.close() 後續如果繼續呼叫, 會丟擲StopIteration異常提示 注意 如果碰到return 會直接終止, 丟擲StopIteration異常提示 生成器只會遍歷一次