在本文中,我們將介紹Python 中for 循環和推導式的一些常見用法,如何分析現有循環,以及如何將它們轉換為Elixir 中的等效表達式,使用Enum 模組和 推導式.
中的函數我們將重點放在:
我們將以一個結合了這三者的基本範例來結束!
在 Python 中,for 循環 通常具有交錯處理功能 - 這些步驟被組合在一起形成相同的子句或主體。下面是前兩個偶數的平方的範例:
這個交錯體的一個挑戰是:
分解每個步驟可以讓您了解正在發生的轉換,消除任何不必要的轉換,並將這些步驟重寫為另一種語言構造或更高層級的函數。
註解上面的函數會得到:
結果 - 步驟順序是:
推導式 是映射 和過濾 集合(如列表和字典)的簡單方法。它們沒有提供減少結果的方法,但是我們可以使用諸如 sum 之類的內建函數來轉換上面的函數來處理理解的結果:
透過推導式,表達式將map 步驟(num ** 2) 和filter 步驟(如果num % 222 == 0) 清楚。 sum 是此處的 reduce 步驟。
在 Python 中瀏覽這些推導式很容易,而且它為推導式的複雜度設定了有用的上限。
有了這個背景,並且更了解 Python 處理構造的結構和限制,讓我們繼續使用 Elixir 的推導式和 Enum 管道來重寫上述 Python 程式碼!
我們要如何將步長寫成平方數?在 Elixir 中,這很簡單!
使用 Enum.map:
並使用推導式(for):
生成器 表達式,產生要在 for 表達式主體中使用的值,在 do:
之後使用 Enum.filter(或 Enum.reject)很容易做到:
我們希望在求平方之前過濾掉奇數,因此我們將其放置在管道中的正確位置 - 在 Enum.map 之前。
使用推導式,我們可以在推導式的頭部添加第二個表達式,一個過濾器,它是一個布林測試:
rem(n, 2) == 0 表達式會丟棄所有返回false(或nil)的元素,留下[2, 4] 作為實際傳遞到主體的數字(do: n ** 2)的理解。
使用 Enum.reduce/2,我們可以透過加到累加器來將平方數列表轉換為其總和。如果我們沒有為累加器指定初始值 (Enum.reduce/3),第一個元素將用作累加器的初始值,這裡很方便:
透過推導式,我們比 Python 的同等功能更強大。我們可以透過在頭部增加另一個子句來新增一個歸約步驟:
此處進行兩項更改:
作為一般規則,我們應該以盡可能最高等級的方式表達我們想要轉換的資料。將 Enum.reduce 視為最低層級的函數轉換很有用,因為所有其他資料處理都可以用它來重寫。
Enum 模組包含大量高階函數,通常涉及將值清單減少為單一聚合值,例如總和、最大值或最小值。在本例中,我們想要元素的總和。
對於枚舉管道,這很簡單:
沒有辦法在推導式中表示這些高階聚合函數,因此我們可以將推導式的輸出透過管道傳送到 Enum.sum 呼叫中,類似於我們在 Python 中的做法:
通常應該避免混合不同的形式,特別是如果轉換是簡單的,因為它會減輕讀者的精神負擔 - 上面的reduce:形式儘管級別較低,但實際上閱讀起來更清晰。
總而言之,我們最後得到了兩種可以被認為是慣用的形式。對於枚舉管道:
與理解:
易於閱讀的程式碼應該能夠直接瀏覽,沒有歧義或在表達式上結結巴巴。我認為這兩種形式都符合該標準,如:
在 Elixir 中可以透過多種不同的方式來編寫這些轉換,並且程式碼庫很容易改變樣式,特別是當程式碼發生變化且處理隨著時間的推移變得更加複雜時。
PureType 可以分解和分析枚舉管道和推導式,以最清晰、最慣用的形式表示它們,了解您的偏好並提高程式碼對團隊中其他人的可讀性和清晰度。今天就來試試吧!
以上是Elixir 中的 For 迴圈和推導式 - 轉換命令式程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!