<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            16.5. 數據中心思想編程

            現在的你,可能正抓耳撓腮地狠想,為什么這樣比使用 for 循環和直接調用函數好。這是一個非常好的問題。通常這是一個程序觀問題。使用 mapfilter 強迫你圍繞數據進行思考。

            就此而言,你從沒有數據開始,你所做的第一件事是獲得當前腳本的目錄路徑,并獲得該目錄中的文件列表。這就是關鍵的一步,使你有了待處理的真實數據:文件名列表。

            當然,你知道你并不關心所有的文件,而只關心測試套件。你有太多數據,因此你需要過濾(filter)數據。你如何知道哪些數據應該保留?你需要一個測試來確定,因此你定義一個測試并把它傳給 filter 函數。這里你應用了一個正則表達式來確定,但無論如何構建測試,原則是一樣的。

            現在你有了每個測試套件的文件名 (且局限于測試套件,因為所有其他內容都被過濾掉了),但是你還需要以模塊名來替代之。你有正確數量的數據,只是格式不正確。因此,你定義了一個函數來將文件名轉換為模塊名,并使用這個函數映射整個列表。從一個文件名,你可以獲得一個模塊名,從一個文件名列表,你可以獲得一個模塊名列表。

            如果不應用 filter,你也可以使用 for 循環結合一個 if 語句的方法。map 的使用則可以由一個 for 循環和一個函數調用來取代。但是 for 循環看起來像是個繁重的工作。至少,簡單講是在浪費時間,糟糕的話還會隱埋 Bug。例如,你需要弄清楚如何測試這樣一個條件:“這個文件是測試套件嗎?”這是應用特定的邏輯,沒有哪個語言能自動為我們寫出其代碼。但是一旦你搞清楚了,你還需要費盡周折地定義一個新的空列表,寫一個 for 循環以及一個 if 語句并手工地調用 append 將符合條件的元素一個個添加到新列表中,然后一路上注意區分哪個變量里放著過濾后的數據,哪個變量里放著未過濾的老數據。為什么不直接定義測試條件,然后由 Python 為你完成接下來的工作呢?

            當然啦,你可以嘗試眩一點的做法,去刪除列表中的元素而不新建一個列表。但是你以前吃過這樣的虧。試圖在循環中改變數據結構是很容易出問題的。Python 是一個這樣工作的語言嗎?用多長時間你才能搞清這一點?你能確定記得你第二次這樣嘗試的安全性?程序員在和這類純技術課題較勁的過程中,花費了太多的時間,犯了太多的錯誤,卻并沒有什么意義。這樣并不可能令你的程序有所進步,只不過是費力不討好。

            我在第一次學習 Python 時是抵觸列表解析的,而且我抗拒 filtermap 的時間更長。我堅持著我更艱難的生活,固守著類似于 for 循環和 if 語句以及一步步地以代碼為中心的編程方式。而且我的 Python 程序看起來很像是 Visual Basic 程序,細化每一個函數中的每一個操作步驟。它們卻有著同樣的小錯誤和隱蔽的 Bug。這一切其實都沒有意義。

            讓這一切都遠去吧。費力不討好的編程不重要,數據重要。并且數據并不麻煩,它們不過就是數據。如果多了,就過濾。如果不是我們要的,就映射。聚焦在數據上,摒棄費力的勞作。

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线