文章摘要: 1.2 生成器表示式與函式 1.3 動態程式碼執行與動態匯入 本文中functions[action](db) 程式碼中
-
- 1.2 生成器表示式與函式
- 1.3 動態程式碼執行與動態匯入
本文中,我們將學習多種不同的程式設計技術,並介紹很多附加的、通常也是更高階的Python 語法。
1、過程型程式設計進階
本節沒有任何新的語法,以之前的內容為基礎給出一種有用的程式設計技術。
1.1 使用字典進行分支
Python 中,函式本身是一種物件,函式名就是對函式的物件引用。如果我們寫一個函式名,其後面沒有小括號,Python 會知道我們是將其當做物件引用。
假設我們要做一個控制檯程式,改程式有幾個選單:
(A)dd (E)dit (L)ist (R)emove (Q)uit
使用者可以輸入 a、e、l、r、q
分別進入各個選單,我們一般的思路是使用 if...else...
語句來實現:
if action == 'a': add_dvd(db) elif action == 'e': edit_dvd(db) elif action == 'l': list_dvds(db) elif action == 'q': quit(db)
使用者的選擇存放在變數 action
中。
下面介紹一種簡單的方法,既然函式是 物件 ,那麼就可以放到字典中當做 鍵 或 值 來對待。
# 使用字典進行分支 functions = dict(a=add_dvd, e=edit_db, l=list_db, q=quit) functions[action](db)
程式碼中,我們建立了一個字典,其鍵為選單選項,其值為函式引用;第二條語句中,我們取回與給定操作對應的函式引用,並使用呼叫操作符 ()
呼叫被引用的函式,並且傳遞引數 db
。使用字典進行分支的程式碼,不僅簡短,而且更容易擴充套件,並且在擴充套件的同時不影響效能。
1.2 生成器表示式與函式
之前介紹過了生成器函式與方法,建立生成器表示式也是可能的。在語法上,這與列表內涵幾乎是一樣的,區別在於: 語句包含在圓括號中 ,而不是方括號中。其語法格式為:
(expression for item in iterable)
(expression for item in iterable if condition)
下面兩個程式碼片段分別展示了通過 yield 和 for…in 迴圈實現的生成器:
# 程式碼片段一 def items_in_key_order(d): for key in sorted(d): yield key, d[key] # 程式碼片段二 def items_in_key_order(d): return ((key, d[key]) for key in sorted(d))
生成器提供了一種執行「惰性」評估的方法,這意味著只有在實際需要的時候才計算值,這比一次性計算一個很大的列表要更加高效。有效的生成器可以生成我們需要數量的值——而沒有上限,比如:
# 沒有上限的生成器 def quarters(next_quart=0.0): while True: yield next_quart next_quart += 0.25
這一函式將返回 0.0、0.25、0.5 … …,以此類推。下面展示如何使用該生成器:
result = [] for x in quarters(): result.append(x) if x > 1.0: break
1.3 動態程式碼執行與動態匯入
某些場合中,編寫一段程式碼,並用其生成我們所需要的程式碼,迴避直接編寫所需要的程式碼更簡單。