掌握Python编程需要了解各种精妙技巧,这篇文章将详细解析八个关于迭代与循环的高级使用方法,为开发者提供有价值的参考。

01

enumerate() & zip()

函数enumerate() 和 zip() 是Python中的内置函数。因此我们不需要导入任何东西。

使用 enumerate() 函数可以在遍历列表或元组时同时获取索引和对应的值。当需要获取元素索引时,该函数能提供便捷的解决方案。

zip()函数允许我们同时遍历 2 个或多个迭代对象(如列表/元组)。我们只需将迭代对象传递给 zip()函数即可。

请注意,如果我们只要到达一个迭代对象的末尾,zip() 函数就会停止生成值。例如,在下面的示例中,我们将受到仅包含 2 个元素的 fruits 列表的限制。

03

关键字break

break关键字主要用于终止循环结构(如forwhile循环),触发时直接跳出当前循环体。

使用场景

  • 循环控制:在满足特定条件时强制中断循环执行
  • 流程优化:避免不必要的迭代,提升代码效率

语法特征

  • 单行语句:通常独立成行break;
  • 无参数:不接收任何附加条件

注意事项

  • 仅影响最内层循环:嵌套循环中只中断所在层循环
  • 后续代码继续:循环体外代码仍按正常流程执行

在下面的示例中,当 word=='boy' 出现时,break 会在第 2 次迭代中执行。因此,我们的 for 循环会立即停止,不会继续访问"cat"和 "dog"

break 关键字也适用于 while 循环。在下面的示例中,当 num 达到 3 时,我们就中断,从而跳出 while 循环。

04

关键字continue

此外,与 break 一样,continue 关键字也用于 for 循环或 while 循环中。

执行 continue 关键字时,仅跳过当前迭代,并立即进入下一次迭代。continue 关键字不会停止整个循环。

在下面的示例中,如果单词是 "boy "或 "cat",就会执行 continue。在这种情况下,特定的迭代将被跳过。因此,只会打印 "apple "和 "dog"。

05

使用itertools.product

下面是一个普通的嵌套 for 循环:

使用 itertools.product 可以避免编写多层嵌套的 for 循环,它能够高效地模拟多重循环的功能。

itertools.product 简化了多重循环的实现,无需手动编写复杂的嵌套结构。

itertools 作为 Python 标准库的一部分,无需额外安装即可直接导入使用。

06

使用itertools.pairwise

假设我们有一堆数字:

在这个列表中,我们希望比较每一对相邻的数字 1 和 2、2 和 3、3 和 4、4 和 5(无论出于什么原因)。

为此,我们可以使用 range(len(ls)-1) 编写一个 for 循环,并进行索引操作:

在希望简化逻辑处理或提升代码可读性的情况下,itertools.pairwise 可以作为替代方案。

itertools.pairwise 函数会生成列表中每一对相邻的元素。

除此之外,itertools 模块还包含许多其他有用的迭代函数。

07

生成器函数

生成器函数是使用 yield 关键字输出内容的函数。这里,我们有一个简单琐碎的生成器函数 test(),代码如下:

在这里,如果我们像使用普通函数那样调用 test(),并不会得到苹果、橘子和梨,而是打印出某个生成器对象。这是因为生成器函数会返回一个生成器对象

生成器对象的主要功能是支持迭代操作。常见的调用方式包括两种:

  • 通过 for 循环直接遍历生成器
  • 使用 list() 函数将生成器转换为列表

08

为什么要使用生成器函数

生成器函数在需要立即输出值或处理大量数据时非常有用,尤其适用于避免内存不足的情况。以下是一个简单的对比示例:

普通函数会预先完成所有转换计算,并将结果存储在内存中的 out 变量后再返回。例如,处理一个包含 100 万个元素的列表时,所有 dostuff(item) 的结果都会先存储在内存中,必须等待全部计算完成才能返回。这种方式可能导致内存溢出和效率低下。

相比之下,生成器函数会在每次计算完成时立即输出结果。这种方式避免了在内存中存储全部 100 万个元素,同时无需等待所有计算完成才返回数据。因此,生成器函数在优化内存使用和提高执行效率方面具有明显优势。

09

iter() 和next()

下面是一个简单的列表,我们使用 for 循环对其进行遍历。

在内部,for 循环实际上使用了一个迭代器对象。要获取列表的迭代器对象,我们使用 iter() 函数。

我们的迭代器对象包含一个列表序列,我们可以通过迭代访问它。为此,我们可以使用 next() 函数来获取下一个元素。

调用迭代器对象的 next() 方法会使内部指针前移,每次返回后续元素。重复调用将依次获取后续值,直到元素耗尽时触发 StopIteration 异常。

迭代器的这种特性使其能够按需生成数据,无需一次性加载全部内容。

如果我们想对迭代进行更多控制,可以选择使用这种方法,而不是 for 循环和 while 循环。

10

总结

聚焦Python迭代的八种进阶用法,通过掌握这些技巧可显著优化开发者的日常工作效率。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐