在 Python 中编写循环Loops的艺术

2023-12-30 22:44

本文主要是介绍在 Python 中编写循环Loops的艺术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 Python 中编写循环Loops的艺术(The Art of Writing Loops in Python)

文章目录

  • 在 Python 中编写循环Loops的艺术(The Art of Writing Loops in Python)
    • 一次获取索引Indexes和值Values
    • 通过 Product 函数避免嵌套循环Nested Loops
    • 使用 Itertools 模块编写花式循环
      • 进行无限循环infinite loop
        • 通过 `count` 函数
        • 通过 `cycle` 函数
        • 通过 `repeat` 函数
      • 将多个可迭代对象iterables合并为一个
      • 挑出相邻的重复元素
    • 定制循环
    • Conclusion 结论

Simple is better than complex – 简单胜于复杂

for 循环是大多数编程语言中非常基本的控制流工具。例如,C 语言中一个简单的 for 循环如下所示:

int i;
for (i=0;i<N;i++)
{//do something
}

对于复杂的场景,我们通常需要编写难看的嵌套循环nested loops或定义大量辅助变量assistant variables(如上述代码中的 i )。

幸运的是,在 Python中事情就变得方便多了。我们有很多技巧来编写更优雅的循环loops,它们确实让我们的生活变得更轻松。在 Python 中,嵌套循环nested loops不是不可避免的,辅助变量assistant variables也不是必须的,我们甚至可以自己定制 for 循环。

本文将介绍在 Python 中编写循环loops的一些最有用的技巧tricks。希望它能帮助您感受 Python 之美。

一次获取索引Indexes和值Values

使用 for 循环的一个常见场景是从列表list中获取索引indexes和值values。当我开始学习 Python 时,我写的代码如下:

for i in range(len(my_list)):print(i, my_list[i])

这当然行得通。但还不够 Pythonic。几个月后,我找到了标准的 Pythonic 方法:

for i, v in enumerate(my_list):print(i, v)

如上所示,内置的built-in enumerate 函数function可以让我们的生活变得更轻松。

通过 Product 函数避免嵌套循环Nested Loops

嵌套循环Nested loops令人头疼。它们会降低代码的可读性readability并使事情变得复杂complex。例如,跳出嵌套循环breaking out of the nested loops通常不是很容易。我们需要知道最内层循环inner-most loop何时被破坏,第二个最内层循环second inner-most loop何时被破坏,等等。

幸运的是,Python 内置的built-in itertools 模块中有一个很棒的函数function,叫做 product 。我们可以使用它来避免编写大量嵌套循环nested loops。

让我们通过一个简单的例子来感受一下它有多有用:

list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]for a in list_a:for b in list_b:for c in list_c:if a + b + c == 2077:print(a, b, c)
# 70 2000 7

如上图所示,我们需要三个嵌套循环nested loops,才能从三个列表lists中得到总和等于 2077 的三个数字。代码一点也不整齐。

使用 product 函数进行尝试

from itertools import productlist_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]for a, b, c in product(list_a, list_b, list_c):if a + b + c == 2077:print(a, b, c)
# 70 2000 7

如上图所示,在 product 函数的帮助下,只需要一个循环one loop。

因为 product 函数会根据输入的可迭代对象 生成笛卡尔积Cartesian product。它可以帮助我们在很多情况下避免嵌套循环nested loops。

使用 Itertools 模块编写花式循环

事实上, product 函数function只是冰山一角。如果您探索 Python 内置的built-in itertools 模块module。一个新世界将向你敞开大门。这个工具箱toolbox包含了许多有用的方法methods来满足我们对循环loops的需求。它们的完整列表可以在官方文档official document中找到。让我们在此欣赏一些有趣的用法。

进行无限循环infinite loop

至少有三种方法可以实现无限循环:

通过 count 函数
import itertoolsnatural_num = itertools.count(1)
for n in natural_num:print(n)
# 1,2,3,...
通过 cycle 函数
import itertoolsmany_yang = itertools.cycle('Zhang')
for y in many_yang:print(y)
# 'Z','h','a','n','g','Z','h','a',...
通过 repeat 函数
import itertoolsmany_zhang = itertools.repeat('Zhang')
for y in many_zhang:print(y)
# 'Zhang','Zhang',...

将多个可迭代对象iterables合并为一个

chain() 函数可以帮助我们将多个可迭代对象multiple iterables 合并为一个chain object。

from itertools import chainlist_a = [1, 22]
list_b = [7, 20]
list_c = [3, 70]for i in chain(list_a, list_b, list_c):print(i)
# 1,22,7,20,3,70

挑出相邻的重复元素

groupby 函数用于在迭代器iterator中找出相邻的重复项adjacent duplicate items,并将它们放在一起。

from itertools import groupbyfor key, group in groupby('ZHhHANNGGG'):print(key, list(group))
# Z ['Z']
# H ['H']
# h ['h']
# H ['H']
# A ['A']
# N ['N', 'N']
# G ['G', 'G', 'G']

如上图所示,相邻的相同字符被放在了一起。此外,我们还可以告诉 groupby 函数如何判断两个项目是否相同:

from itertools import groupbyfor key, group in groupby('ZHhHANNGGG', lambda x: x.upper()):print(key, list(group))
# Z ['Z']
# H ['H', 'h', 'H']
# A ['A']
# N ['N', 'N']
# G ['G', 'G', 'G']

定制循环

在欣赏了上述所有示例之后,是时候思考一下为什么 Python 中的 for 循环如此灵活和优雅了。在我看来,这是因为我们可以在 for 循环的迭代器iterator中应用函数。上面提到的所有技巧都是在迭代器iterator中使用一些特殊的函数。所有技巧的模板如下:

for x in function(iterator)

在底层,内置的 itertools 模块只是为我们实现了一些常用函数function。如果我们不小心忘记了其中的某个函数function,或者找不到我们需要的函数function,我们可以自己编写一个。更具体地说,这些函数function就是生成器generators。这就是为什么我们可以通过它们生成无限循环。

简而言之,我们可以通过编写自定义的生成器generator,随心所欲地定制 for 循环。

让我们来看一个简单的例子:

def even_only(num):for i in num:if i % 2 == 0:yield imy_list = [1, 9, 3, 4, 2, 5]
for n in even_only(my_list):print(n)
# 4
# 2

如上例所示,我们定义了一个名为 even_only 的生成器generator。如果在 for 循环中使用该生成器generator,列表中将只遍历偶数。

当然,上面的例子只是用于解释。还有其他方法可以做同样的事情,比如使用列表推导式List Comprehension。

my_list = [1, 9, 3, 4, 2, 5]
for n in (i for i in my_list if not i % 2):print(n)
# 4
# 2

Conclusion 结论

用 Python 编写循环可以非常灵活和优雅。我们可以适当使用一些内置工具,甚至可以自己定义生成器generators来编写简洁的循环。

这篇关于在 Python 中编写循环Loops的艺术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/554229

相关文章

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

Python中CSV文件处理全攻略

《Python中CSV文件处理全攻略》在数据处理和存储领域,CSV格式凭借其简单高效的特性,成为了电子表格和数据库中常用的文件格式,Python的csv模块为操作CSV文件提供了强大的支持,本文将深入... 目录一、CSV 格式简介二、csv模块核心内容(一)模块函数(二)模块类(三)模块常量(四)模块异常

Python报错ModuleNotFoundError的10种解决方案

《Python报错ModuleNotFoundError的10种解决方案》在Python开发中,ModuleNotFoundError是最常见的运行时错误之一,通常由模块路径配置错误、依赖缺失或命名冲... 目录一、常见错误场景与原因分析二、10种解决方案与代码示例1. 检查并安装缺失模块2. 动态添加模块

python利用backoff实现异常自动重试详解

《python利用backoff实现异常自动重试详解》backoff是一个用于实现重试机制的Python库,通过指数退避或其他策略自动重试失败的操作,下面小编就来和大家详细讲讲如何利用backoff实... 目录1. backoff 库简介2. on_exception 装饰器的原理2.1 核心逻辑2.2

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到