我后悔没有早点知道 Python中迭代的八个技巧

文摘   科技   2024-08-18 07:27   上海  








01


引言





大家好,我是AI算法之道!


Python是我最喜欢的编程语言之一,它向来以其简单性、多功能性和可读性而闻名。


在Python编程中有各种各样的小技巧,在本文中,我们将深入探讨Python中关于迭代和循环的八个进阶小技巧,希望可以帮助到大家!





02


enumerate() & zip()


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

通过 enumerate() 函数,我们可以在遍历列表(或元组)时同时生成索引和值。无论出于何种原因,如果我们需要索引,这个函数都非常有用。

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

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



03


 关键字break


关键字break多用于循环(for 循环或 while 循环)中,当执行到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 循环:

如果我们不想编写这么多嵌套 for 循环,可以使用 itertools.product 来帮助我们。简而言之,itertools.product 可以模拟多层嵌套 for 循环,而我们无需编写多层嵌套 for 循环语句。

此外,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(),并不会得到苹果、橘子和梨,而是打印出某个生成器对象。这是因为生成器函数会返回一个生成器对象

生成器对象就是用来遍历的。最简单的方法是:1)使用 for 循环或 2)用 list() 封装我们的生成器对象






08


为什么要使用生成器函数


如果我们想立即输出一个值,就需要使用生成器函数。如果我们有大量数据,但又不想将所有数据加载到内存中(这可能会导致内存不足错误),这一点就特别有用。下面是一个简单的比较例子:

在我们的普通函数中,我们首先完成所有转换项的计算,并在返回之前将其存储在 out 中。因此,如果我们有一个包含 100 万个元素的输入列表,这样操作的话:
  • 将所有 dostuff(项目)存储在输出列表中(存储在内存中)

  • 需要等待 100 万次计算全部完成后再返回

  • 这可能会导致内存外错误和效率低下

与之对比,在我们的生成器函数中,当一个值准备输出时,我们就会立马产生(输出)这个值。这样做的好处如下:
  • 我们不会在内存中存储所有 100 万个元素

  • 我们不需要等 100 万次计算全部完成后才返回结果

因此,当我们想要最大限度地提高效率并避免内存不足错误时,我经常使用生成器来代替普通函数。







09


iter() 和 next()


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

在内部,for 循环实际上使用了一个迭代器对象。要获取列表的迭代器对象,我们使用 iter() 函数。
我们的迭代器对象包含一个列表序列,我们可以通过迭代访问它。为此,我们可以使用 next() 函数来获取下一个元素。
每次在迭代器对象上调用 next() 时,迭代器内部的指针都会移动到下一个元素。因此,如果我们在同一个迭代器对象上调用 next(),返回的将是下一个元素。

因此,我们可以一次又一次地使用 next(),直到迭代器对象没有东西可返回为止。当这种情况发生时,就会引发 StopIteration 异常。
如果我们想对迭代进行更多控制,可以选择使用这种方法,而不是 for 循环和 while 循环。





10


总结


本文重点介绍了python中关于迭代的八种进阶技巧,希望这些小技巧可以帮助到大家,提升大家的工作效率!



您学废了吗?





点击上方小卡片关注我




添加个人微信,进专属粉丝群!


AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
 最新文章