在 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脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一