在 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实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

Python 交互式可视化的利器Bokeh的使用

《Python交互式可视化的利器Bokeh的使用》Bokeh是一个专注于Web端交互式数据可视化的Python库,本文主要介绍了Python交互式可视化的利器Bokeh的使用,具有一定的参考价值,感... 目录1. Bokeh 简介1.1 为什么选择 Bokeh1.2 安装与环境配置2. Bokeh 基础2

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模