使用Pythonic方式替代for循环

图片[1]-使用Pythonic方式替代for循环-山海云端论坛

挑战自我,不写 for 循环!为什么呢?因为这可以迫使你学习更高级、更地道的语法和库。以 Python 为例,本文将分享一些你可能在别人的代码中见过,但却很少用到的语法。

我已经开始探索 Python 中惊人的语言功能有一段时间了。一开始,我给自己设定了一个挑战,目的是练习更多 Python 语言功能,而不是依赖其他编程语言的经验。这使得整个过程变得越来越有趣!代码变得更简洁,结构也更加清晰和规范。接下来,我将分享这些好处。

通常情况下,我们会使用 for 循环来:

  • 从序列中提取信息。
  • 生成一个新的序列。

但幸运的是,Python 提供了许多工具来完成这些任务,你只需要转变思路,用不同的方式来解决问题。

通过避免编写 for 循环,你能获得以下好处:

  • 更少的代码量。
  • 更好的代码可读性。
  • 更少的缩进(对于 Python 而言,这很重要)。

让我们看一下下面的代码结构:

<code>with ...: for ...: if ...: try: except: else:</code>

在这个例子中,我们处理了多层嵌套的代码,这很难阅读。我发现这段代码中,缩进混合了管理逻辑(如 with、try-except)和业务逻辑(如 for、if)。如果你遵循“只对管理逻辑使用缩进”的规则,那么核心业务逻辑应该立即脱离出来。

“扁平结构胜于嵌套结构” – Python 之禅

以下是替代 for 循环的几种常用方法:

  1. 列表推导式 / 生成器表达式

举个简单的例子,如果你想将一个数组转换为另一个数组:

<code>result = [do_something_with(item) for item in item_list]</code>

如果你喜欢 MapReduce,你也可以使用 map,或者 Python 中的列表推导式。如果只想迭代数组中的元素,也可以使用生成器表达式。

  1. 函数

如果你想将一个数组映射成另一个数组,只需调用 map 函数即可:

<code>doubled_list = map(lambda x: x * 2, old_list)</code>

如果想将序列减少为单个值,请使用 reduce:

<code>from functools import reduce summation = reduce(lambda x, y: x + y, numbers)</code>

此外,许多 Python 内置函数都支持迭代对象。

  1. 抽取函数或生成器

上述方法适用于简单逻辑。但对于更复杂的逻辑呢?作为程序员,我们编写函数来解决复杂的问题。同样的思路适用于此。如果你写了这样的代码:

<code>results = [process_item(item) for item in item_list]</code>

对于嵌套函数,你也可以采用类似的方式。另外,如果你的代码块需要记录一些内部状态,可以使用生成器来实现。

不要自己写,itertools 可以帮你实现:

<code>from itertools import accumulate a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] results = list(accumulate(a, max))</code>

结论:

在大多数情况下,你都不需要编写 for 循环。

避免编写 for 循环可以提高代码的可读性。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容