Python 必须enumerate()
使用索引遍历对象。我怀疑解释器创建大量 int 对象的唯一目的是跟踪事物的位置。PEP 页面显示以下内容,但我并不真正了解幕后发生的事情:
它为所有可迭代对象提供了与 iteritems() 为字典提供的相同优势——一种紧凑、可读、可靠的索引表示法。
那么这里有什么魔力呢?
Python 必须enumerate()
使用索引遍历对象。我怀疑解释器创建大量 int 对象的唯一目的是跟踪事物的位置。PEP 页面显示以下内容,但我并不真正了解幕后发生的事情:
它为所有可迭代对象提供了与 iteritems() 为字典提供的相同优势——一种紧凑、可读、可靠的索引表示法。
那么这里有什么魔力呢?
enumerate()
是一个迭代器;它只动态生成索引int
值;它不会预先产生它们。
您可以尝试阅读enumobject.c
源代码,但基本上可以像这样翻译成 Python:
def enumerate(iterable, start=0):
count = start
for elem in iterable:
yield count, elem
count += 1
yield
关键字使它成为一个生成器函数,并且您需要循环生成器(或调用next()
它)以推进该函数以生成数据,一次yield
调用一次。
Python 也实习int
值,所有介于 -5 和 256(含)之间的值都是单例,所以上面的代码甚至不会产生新的int
对象,直到你达到 257。
它可以帮助你知道东西在哪里......
l = ['apple', 'banana', 'cabbage']
for idx, item in enumerate(l):
print "the item: %s, is at position %s" % (item, idx)
>>>
the item: apple, is at position 0
the item: banana, is at position 1
the item: cabbage, is at position 2
这在以下场景中有所帮助。假设您想在列表中找到每个“卷心菜”项目。并且知道他们的索引。
l = ['apple', 'banana', 'cabbage', 'monkey', 'kangaroo', 'cabbage']
def find_indexes(lst, match):
results = []
for idx, item in enumerate(l):
if item == match:
results.append(idx)
return results
print find_indexes(l, 'cabbage')
>>>
[2, 5]