Elixir 中的 For 循环和推导式 - 转换命令式代码
在本文中,我们将介绍 Python 中 for 循环和推导式的一些常见用法,如何分析现有循环,以及如何将它们转换为 Elixir 中的等效表达式,使用 Enum 模块和 推导式.
中的函数我们将重点关注:
- 通过函数转换数据集合 (map)
- 将值过滤到集合中或从集合中过滤出来(过滤器)
- 生成单个聚合值或结构,例如平均值(减少或折叠)
我们将以一个结合了这三者的基本示例来结束!
Python
For 循环
在 Python 中,for 循环 通常具有交错处理功能 - 这些步骤被组合在一起形成相同的子句或主体。下面是前两个偶数的平方的示例:
result = 0 for num in [1, 2, 3, 4, 5]: if num % 2 == 0: result += num ** 2 print(result) # Output: 20
这个交错体的一个挑战是:
- 识别每个步骤,并且......
- 弄清楚它是什么类型的步骤。
分解每个步骤可以让您了解正在发生的转换,消除任何不必要的转换,并将这些步骤重写为另一种语言构造或更高级别的函数。
注释上面的函数会得到:
result = 0 for num in [1, 2, 3, 4, 5]: ## Filter if num % 2 == 0: ## Reduce (result += ) and Map (num ** 2) result += num ** 2 print(result) # Output: 20
步骤
结果 - 步骤顺序是:
- 过滤“出”奇数/“入”偶数
- 将数字(例如2)映射到其相应的平方数(例如4)
- 减少为偶数平方和
推导式
Python 中的推导式 是映射 和过滤 集合(如列表和字典)的简单方法。它们没有提供减少结果的方法,但是我们可以使用诸如 sum 之类的内置函数来转换上面的函数来处理理解的结果:
result = sum(num ** 2 for num in [1, 2, 3, 4, 5] if num % 2 == 0) print(result) # Output: 20
通过推导式,表达式将 map 步骤 (num ** 2) 和 filter 步骤(如果 num % 2 == 0) 清楚。 sum 是此处的 reduce 步骤。
在 Python 中浏览这些推导式很容易,并且它为推导式的复杂性设置了有用的上限。
有了这个背景,并且更好地理解了 Python 处理构造的结构和限制,让我们继续使用 Elixir 的推导式和 Enum 管道重写上述 Python 代码!
映射:Enum.map 和生成器
我们如何将步长写成平方数?在 Elixir 中,这很简单!
使用 Enum.map:
result = 0 for num in [1, 2, 3, 4, 5]: if num % 2 == 0: result += num ** 2 print(result) # Output: 20
并使用推导式(for):
result = 0 for num in [1, 2, 3, 4, 5]: ## Filter if num % 2 == 0: ## Reduce (result += ) and Map (num ** 2) result += num ** 2 print(result) # Output: 20
生成器 表达式,生成要在 for 表达式主体中使用的值,在 do:
之后过滤:Enum.filter和filters
使用 Enum.filter(或 Enum.reject)很容易做到:
result = sum(num ** 2 for num in [1, 2, 3, 4, 5] if num % 2 == 0) print(result) # Output: 20
我们希望在求平方之前过滤掉奇数,因此我们将其放置在管道中的正确位置 - 在 Enum.map 之前。
使用推导式,我们可以在推导式的头部添加第二个表达式,一个过滤器,它是一个布尔测试:
Enum.map([1, 2, 3, 4, 5], & &1 ** 2)
rem(n, 2) == 0 表达式会丢弃所有返回 false(或 nil)的元素,留下 [2, 4] 作为实际传递到主体的数字(do: n ** 2)的理解。
减少-> Enum.reduce和reduce:
使用 Enum.reduce/2,我们可以通过添加到累加器来将平方数列表转换为其总和。如果我们没有为累加器指定初始值 (Enum.reduce/3),第一个元素将用作累加器的初始值,这在这里很方便:
for n <- [1, 2, 3, 4, 5], do: n ** 2
通过推导式,我们比 Python 的同等功能更强大。我们可以通过在头部添加另一个子句来添加一个归约步骤:
[1, 2, 3, 4, 5] |> Enum.filter(& rem(&1, 2) == 0) |> Enum.map(& &1 ** 2)
此处进行两项更改:
- 在头部添加一个reduce: 0子句,指定我们将累加一个初始值为0的值
- 更改 for 主体以捕获 acc 值(累加器),我们可以将当前平方值添加到该值。
内置函数:Enum.sum
作为一般规则,我们应该以尽可能最高级别的方式表达我们想要转换的数据。将 Enum.reduce 视为最低级别的函数转换很有用,因为所有其他数据处理都可以用它来重写。
Enum 模块包含大量高级函数,通常涉及将值列表减少为单个聚合值,例如总和、最大值或最小值。在本例中,我们想要元素的总和。
对于枚举管道,这很简单:
for n <- [1, 2, 3, 4, 5], rem(n, 2) == 0, do: n ** 2
没有办法在推导式中表示这些高级聚合函数,因此我们可以将推导式的输出通过管道传输到 Enum.sum 调用中,类似于我们在 Python 中的做法:
[1, 2, 3, 4, 5] |> Enum.filter(& rem(&1, 2) == 0) |> Enum.map(& &1 ** 2) |> Enum.reduce(& &1 + &2)
通常应该避免混合不同的形式,特别是如果转换是简单的,因为它会减轻读者的精神负担 - 上面的reduce:形式尽管级别较低,但实际上阅读起来更清晰。
Elixir 哪种表达方式更好?
总而言之,我们最终得到了两种可以被认为是惯用的形式。对于枚举管道:
result = 0 for num in [1, 2, 3, 4, 5]: if num % 2 == 0: result += num ** 2 print(result) # Output: 20
和理解:
result = 0 for num in [1, 2, 3, 4, 5]: ## Filter if num % 2 == 0: ## Reduce (result += ) and Map (num ** 2) result += num ** 2 print(result) # Output: 20
易于阅读的代码应该能够直接浏览,没有歧义或在表达式上结结巴巴。我认为这两种形式都符合该标准,如:
- 它们遵循单一一致的形式 - 枚举管道或推导式
- 每个表达式对应一个处理步骤
- 可以从上到下或从左到右不间断地阅读
结论
在 Elixir 中可以通过多种不同的方式来编写这些转换,并且代码库很容易改变样式,特别是当代码发生更改且处理随着时间的推移变得更加复杂时。
PureType 可以分解和分析枚举管道和推导式,以最清晰、最惯用的形式表示它们,了解您的偏好并提高代码对团队中其他人的可读性和清晰度。今天就尝试一下吧!
以上是Elixir 中的 For 循环和推导式 - 转换命令式代码的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。
