| 導航:起始頁 > Dive Into Python > 函數編程 > 數據中心思想編程 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
現在的你,可能正抓耳撓腮地狠想,為什么這樣比使用 for 循環和直接調用函數好。這是一個非常好的問題。通常這是一個程序觀問題。使用 map 和 filter 強迫你圍繞數據進行思考。
就此而言,你從沒有數據開始,你所做的第一件事是獲得當前腳本的目錄路徑,并獲得該目錄中的文件列表。這就是關鍵的一步,使你有了待處理的真實數據:文件名列表。
當然,你知道你并不關心所有的文件,而只關心測試套件。你有太多數據,因此你需要過濾(filter)數據。你如何知道哪些數據應該保留?你需要一個測試來確定,因此你定義一個測試并把它傳給 filter 函數。這里你應用了一個正則表達式來確定,但無論如何構建測試,原則是一樣的。
現在你有了每個測試套件的文件名 (且局限于測試套件,因為所有其他內容都被過濾掉了),但是你還需要以模塊名來替代之。你有正確數量的數據,只是格式不正確。因此,你定義了一個函數來將文件名轉換為模塊名,并使用這個函數映射整個列表。從一個文件名,你可以獲得一個模塊名,從一個文件名列表,你可以獲得一個模塊名列表。
如果不應用 filter,你也可以使用 for 循環結合一個 if 語句的方法。map 的使用則可以由一個 for 循環和一個函數調用來取代。但是 for 循環看起來像是個繁重的工作。至少,簡單講是在浪費時間,糟糕的話還會隱埋 Bug。例如,你需要弄清楚如何測試這樣一個條件:“這個文件是測試套件嗎?”這是應用特定的邏輯,沒有哪個語言能自動為我們寫出其代碼。但是一旦你搞清楚了,你還需要費盡周折地定義一個新的空列表,寫一個 for 循環以及一個 if 語句并手工地調用 append 將符合條件的元素一個個添加到新列表中,然后一路上注意區分哪個變量里放著過濾后的數據,哪個變量里放著未過濾的老數據。為什么不直接定義測試條件,然后由 Python 為你完成接下來的工作呢?
當然啦,你可以嘗試眩一點的做法,去刪除列表中的元素而不新建一個列表。但是你以前吃過這樣的虧。試圖在循環中改變數據結構是很容易出問題的。Python 是一個這樣工作的語言嗎?用多長時間你才能搞清這一點?你能確定記得你第二次這樣嘗試的安全性?程序員在和這類純技術課題較勁的過程中,花費了太多的時間,犯了太多的錯誤,卻并沒有什么意義。這樣并不可能令你的程序有所進步,只不過是費力不討好。
我在第一次學習 Python 時是抵觸列表解析的,而且我抗拒 filter 和 map 的時間更長。我堅持著我更艱難的生活,固守著類似于 for 循環和 if 語句以及一步步地以代碼為中心的編程方式。而且我的 Python 程序看起來很像是 Visual Basic 程序,細化每一個函數中的每一個操作步驟。它們卻有著同樣的小錯誤和隱蔽的 Bug。這一切其實都沒有意義。
讓這一切都遠去吧。費力不討好的編程不重要,數據重要。并且數據并不麻煩,它們不過就是數據。如果多了,就過濾。如果不是我們要的,就映射。聚焦在數據上,摒棄費力的勞作。
<< 重識列表映射 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
動態導入模塊 >> |