小能豆

理解 Python 枚举

py

在学习 Python 之前,我开始自学一些 C++,并且习惯于编写如下循环

   for( int i = 0; i < 20; i++ )
   {
       cout << "value of i: " << i << endl;
   }

转向python后我发现自己经常使用类似这样的东西。

i = 0
while i < len(myList):
   if myList[i] == something:
       do stuff
   i = i + 1 

我读到过,这根本不是“pythonic”,而且我发现自己在需要迭代某些东西时经常使用这种类型的代码,我发现 Python 中的 enumerate 函数我认为我应该使用它,但我不确定如何使用 enumerate 编写类似的代码?我想问的另一个问题是,当使用 enumerate 时,它是否以相同的方式有效运行,还是并行进行比较?

在我的示例代码中:

if myList[i] == something:

使用枚举,这会同时检查所有值还是逐个循环?

抱歉,如果这对于论坛来说太基础了,我只是试着理解它,以便我可以在学习的同时练习“pythonic”代码。


阅读 22

收藏
2024-12-05

共2个答案

小能豆

一般来说,这已经足够了:

for item in myList:
    if item == something:
        doStuff(item)

如果您需要索引:

for index, item in enumerate(myList):
    if item == something:
        doStuff(index, item)

它不会并行执行任何操作。它基本上抽象了您在 C++ 中手动执行的所有计数工作,但它执行的操作几乎完全相同(只是在幕后执行,因此您不必担心)。

2024-12-05
小能豆

您提出的很好问题!在 Python 中,确实有更“pythonic”的方式来处理循环,尤其是当你想迭代列表时,enumerate() 是非常合适的工具。

1. enumerate() 用法:

enumerate() 是一个内建函数,它返回一个可迭代的对象,其中每个元素都是一个包含两个值的元组:索引和值。

例如,您提到的 C++ 循环:

for( int i = 0; i < 20; i++ )
{
    cout << "value of i: " << i << endl;
}

在 Python 中,您可以使用 enumerate() 来更“pythonic”地写它:

for i, value in enumerate(myList):
    if value == something:
        do_stuff()

2. 如何理解 enumerate()

enumerate() 返回一个包含索引和元素的元组。例如,假设 myList = ['a', 'b', 'c'],那么 enumerate(myList) 会生成:

(0, 'a')
(1, 'b')
(2, 'c')

因此,i 是索引,value 是列表中的元素。

3. 并行比较的问题:

关于 enumerate() 是否“并行”工作的问题,答案是否定的。enumerate() 和常规的循环是一样的,它是一个逐项处理的过程。即使使用了 enumerate(),Python 仍然是一个逐个检查列表中每个值的过程。它并不会一次性处理所有值,而是像原始 while 循环一样,逐个检查列表中的每个元素。

示例:

myList = [1, 2, 3, 4, 5]
something = 3

for i, value in enumerate(myList):
    if value == something:
        print(f"Found {something} at index {i}")
        break  # 如果找到了,可以终止循环

输出:

Found 3 at index 2

总结:

  • 使用 enumerate() 是一个更“pythonic”的方法,避免了手动管理索引变量 i
  • enumerate() 会像普通的循环一样逐个检查每个元素,不是并行的。
  • 代码会更加简洁、易读,避免了额外的索引管理。

希望这些解释能帮助您更好地理解如何使用 enumerate()!如果您有更多问题,随时提问。

2024-12-05