元類
五、實踐為王
請記住上面的簡單案例,如果您想從本文中獲得對Python元類僅有的一點印象。紙上得來終覺淺,絕知此事要躬行,開始吧。
模塊
此時,在包pkg中就可以導入子模塊mod_1(彷彿子模塊mod_1真的在包pkg中):
3、可導出的公有屬性
在公有屬性方面,包與模塊的行為完全一致,當然別忘了包還有 動態的新增屬性。
2、導入過程
一個模塊的導入過程主要分三步:搜索、加載 和 名字綁定。(具體參考 The import statement)
1)搜索
3、更多細節根據 The import statement 中的描述,以下是導入原理對應的Python偽碼:
函數式編程
差異點 | 函數(lambda表達式) | 函數(def語句) |
---|---|---|
函數體 | 只能是單行表達式(expression) | 可以是任意複雜的語句(statement) |
函數返回值 | 返回值就是函數體中的表達式的求值結果 | 由函數體中的return語句指定 返回值 |
函數名 | 定義後直接返回函數對象(匿名函數) | 定義後自動為函數對象綁定函數名 |
函數定義位置 | 可以在任何允許函數對象出現的位置定義(支持即時定義,即時調用) | 只能在允許語句出現的位置定義(先定義,後調用) |
用途 | 多用於一次性使用的簡單函數 | 適用於一切函數和類方法 |
閉包的這種 能夠記住環境狀態 的特性非常有用,Python中有一些其他特性就是藉助閉包來實現的,比如 裝飾器
從上面的示例可以看出,如果在編碼過程中遇到了“多次用相同的參數調用一個函數”的場景,就可以考慮使用偏函數來固化這些相同的參數,進而簡化函數調用。
可以看出,這個閉包版本的唯一缺點是它需要對函數title進行重新定義(與默認參數的情況有些類似)。
總而言之,如果需要對 已有函數 進行參數固化,偏函數是最佳選擇。
2、生成器表達式
生成器表達式(Generator Expressions)與列表解析在語法和功能方面都非常相似。二者的根本差異是:生成器表達式返回一個 生成器,而列表解析返回一個列表。如下所示:
差異點 | 生成器表達式 | 列表解析 |
---|---|---|
表示方法 | (expr for item in iterable if cond_expr) | [expr for item in iterable if cond_expr] |
返回值 | 一個生成器 | 一個列表 |
與列表解析相比,生成器表達式具有 延遲計算(lazy evaluation)的特點,因此在使用內存上更有效。關於生成器表達式的實際案例,可以參考 Python核心編程(第二版) 中的 『8.13』 一節:『生成器表達式』。
謝謝閱讀!!!!
閱讀更多 我用Python 的文章