在 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删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核