7

Python 必须enumerate()使用索引遍历对象。我怀疑解释器创建大量 int 对象的唯一目的是跟踪事物的位置。PEP 页面显示以下内容,但我并不真正了解幕后发生的事情:

它为所有可迭代对象提供了与 iteritems() 为字典提供的相同优势——一种紧凑、可读、可靠的索引表示法。

那么这里有什么魔力呢?

4

2 回答 2

14

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。

于 2013-05-29T08:05:06.903 回答
2

它可以帮助你知道东西在哪里......

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]
于 2013-05-29T08:02:14.367 回答