在学习 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”代码。
一般来说,这已经足够了:
for item in myList:
if item == something:
doStuff(item)
如果您需要索引:
for index, item in enumerate(myList):
if item == something:
doStuff(index, item)
它不会并行执行任何操作。它基本上抽象了您在 C++ 中手动执行的所有计数工作,但它执行的操作几乎完全相同(只是在幕后执行,因此您不必担心)。
您提出的很好问题!在 Python 中,确实有更“pythonic”的方式来处理循环,尤其是当你想迭代列表时,enumerate()
是非常合适的工具。
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()
enumerate()
:enumerate()
返回一个包含索引和元素的元组。例如,假设 myList = ['a', 'b', 'c']
,那么 enumerate(myList)
会生成:
(0, 'a')
(1, 'b')
(2, 'c')
因此,i
是索引,value
是列表中的元素。
关于 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()
!如果您有更多问题,随时提问。