首頁 > 後端開發 > Python教學 > Elixir 中的 For 迴圈和推導式 - 轉換命令式程式碼

Elixir 中的 For 迴圈和推導式 - 轉換命令式程式碼

Linda Hamilton
發布: 2024-12-04 15:05:11
原創
164 人瀏覽過

For loops and comprehensions in Elixir - transforming imperative code

在本文中,我們將介紹Python 中for 循環和推導式的一些常見用法,如何分析現有循環,以及如何將它們轉換為Elixir 中的等效表達式,使用Enum 模組和 推導式.

中的函數

我們將重點放在:

  • 透過函數轉換資料集合 (map)
  • 將值過濾到集合中或從集合中過濾出來(過濾器
  • 產生單一聚合值或結構,例如平均值(減少摺疊

我們將以一個結合了這三者的基本範例來結束!

Python

For 迴圈

在 Python 中,for 循環 通常具有交錯處理功能 - 這些步驟被組合在一起形成相同的子句或主體。下面是前兩個偶數的平方的範例:

這個交錯體的一個挑戰是:

  1. 辨識每個步驟,並且......
  2. 弄清楚它是什麼類型的步驟。

分解每個步驟可以讓您了解正在發生的轉換,消除任何不必要的轉換,並將這些步驟重寫為另一種語言構造或更高層級的函數。

註解上面的函數會得到:

步驟

結果 - 步驟順序是:

  1. 濾波「出」奇數/「入」偶數
  2. 數字(例如2)對應到其對應的平方數(例如4)
  3. 減少為偶數平方和

推導式

Python 中的

推導式映射過濾 集合(如列表和字典)的簡單方法。它們沒有提供減少結果的方法,但是我們可以使用諸如 sum 之類的內建函數來轉換上面的函數來處理理解的結果:

透過推導式,表達式將map 步驟(num ** 2) 和filter 步驟(如果num % 222 == 0) 清楚。 sum 是此處的 reduce 步驟。

在 Python 中瀏覽這些推導式很容易,而且它為推導式的複雜度設定了有用的上限。

有了這個背景,並且更了解 Python 處理構造的結構和限制,讓我們繼續使用 Elixir 的推導式和 Enum 管道來重寫上述 Python 程式碼!

映射:Enum.map 和生成器

我們要如何將步長寫成平方數?在 Elixir 中,這很簡單!

使用 Enum.map:

並使用推導式(for):

生成器 表達式,產生要在 for 表達式主體中使用的值,在 do:

之後

過濾:Enum.filter和filters

使用 Enum.filter(或 Enum.reject)很容易做到:

我們希望在求平方之前過濾掉奇數,因此我們將其放置在管道中的正確位置 - 在 Enum.map 之前。

使用推導式,我們可以在推導式的頭部添加第二個表達式,一個過濾器,它是一個布林測試:

rem(n, 2) == 0 表達式會丟棄所有返回false(或nil)的元素,留下[2, 4] 作為實際傳遞到主體的數字(do: n ** 2)的理解。

減少-> Enum.reduce和reduce:

使用 Enum.reduce/2,我們可以透過加到累加器來將平方數列表轉換為其總和。如果我們沒有為累加器指定初始值 (Enum.reduce/3),第一個元素將用作累加器的初始值,這裡很方便:

透過推導式,我們比 Python 的同等功能更強大。我們可以透過在頭部增加另一個子句來新增一個歸約步驟:

此處進行兩項更改:

  1. 在頭部增加一個reduce: 0子句,指定我們將累加初始值為0的值
  2. 更改 for 主體以捕獲 acc 值(累加器),我們可以將當前平方值加到該值。

內建函數:Enum.sum

作為一般規則,我們應該以盡可能最高等級的方式表達我們想要轉換的資料。將 Enum.reduce 視為最低層級的函數轉換很有用,因為所有其他資料處理都可以用它來重寫。

Enum 模組包含大量高階函數,通常涉及將值清單減少為單一聚合值,例如總和、最大值或最小值。在本例中,我們想要元素的總和。

對於枚舉管道,這很簡單:

沒有辦法在推導式中表示這些高階聚合函數,因此我們可以將推導式的輸出透過管道傳送到 Enum.sum 呼叫中,類似於我們在 Python 中的做法:

通常應該避免混合不同的形式,特別是如果轉換是簡單的,因為它會減輕讀者的精神負擔 - 上面的reduce:形式儘管級別較低,但實際上閱讀起來更清晰。

Elixir 哪種表達方式比較好?

總而言之,我們最後得到了兩種可以被認為是慣用的形式。對於枚舉管道:

與理解:

易於閱讀的程式碼應該能夠直接瀏覽,沒有歧義或在表達式上結結巴巴。我認為這兩種形式都符合該標準,如:

  1. 它們遵循單一一致的形式 - 枚舉管道或推導式
  2. 每個表達式對應一個處理步驟
  3. 可以從上到下或從左到右不間斷地閱讀

結論

在 Elixir 中可以透過多種不同的方式來編寫這些轉換,並且程式碼庫很容易改變樣式,特別是當程式碼發生變化且處理隨著時間的推移變得更加複雜時。

PureType 可以分解和分析枚舉管道和推導式,以最清晰、最慣用的形式表示它們,了解您的偏好並提高程式碼對團隊中其他人的可讀性和清晰度。今天就來試試吧!

以上是Elixir 中的 For 迴圈和推導式 - 轉換命令式程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板