在 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: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',