只需要索引:枚举或(x)范围?

Lar*_*gas 28 python enumerate range

如果我只想在循环中使用索引,我应该更好地range/xrange结合使用该函数len()

a = [1,2,3]
for i in xrange(len(a)):
    print i 
Run Code Online (Sandbox Code Playgroud)

还是enumerate?即使我根本不使用p

for i,p in enumerate(a):
    print i    
Run Code Online (Sandbox Code Playgroud)

Jon*_*nts 18

我会使用enumerate它,因为它更通用 - 例如它将适用于iterables和序列,并且仅返回对象的引用的开销并不是那么大 - xrange(len(something))尽管(对我来说)更容易阅读,因为你的意图 - 将打破对象,不支持len......

  • @jamylak:注意`itertools.count(10)`是一个infinte生成器,所以你也不想枚举它. (2认同)
  • @SvenMarnach 好的,然后 `itertools.islice(itertools.count(10, 2), 50, 100)` 可能是一个更好的例子,尽管你可以使用数学来从中制作一个 `xrange`。 (2认同)
  • @jamylak:是的,或者`iter([])`更简洁.:) (2认同)

Sve*_*ach 16

这是一个罕见的要求 - 从容器中使用的唯一信息是它的长度!在这种情况下,我确实使这个事实明确并使用第一个版本.


Ros*_*nko 14

使用带有len的xrange是一个很常见的用例,所以是的,如果你只需要按索引访问值,就可以使用它.

但是如果你因为某种原因喜欢使用枚举,你可以使用下划线(_),它只是一个经常看到的符号,表明你不会以某种有意义的方式使用变量:

for i, _ in enumerate(a):
    print i
Run Code Online (Sandbox Code Playgroud)

使用下划线(_)也可能发生陷阱.在i18n库和系统中将'翻译'函数命名为_也很常见,因此请注意将其与gettext或其他类似的库(对@lazyr)一起使用.

  • 请注意将这个成语与[`gettext`](http://docs.python.org/library/gettext.html#gettext.install)结合使用,因为它使用`_`变量来表示其他内容,这个use会影响当前命名空间中的`gettext`` _`.它可能导致奇怪的错误. (2认同)
  • @jamylak [Nope](http://docs.python.org/py3k/library/gettext.html#gettext.install) (2认同)
  • 不使用`_`作为变量名的最重要原因是人们对它有各种奇怪的误解,并倾向于将其误认为某种特殊语法.我已经看到*很多人被这个混淆了,所以我只是把它叫做'假'来避免这种混乱.显式优于隐式. (2认同)
  • @jamylak.我对IDE的五分钱.Eclipse-PyDEV/Aptana在查找未使用的名称时默认使用下划线(它不会将其计入计数). (2认同)