Python 为什么使用range()使索引和元素同时可用是不好的?

Python 为什么使用range()使索引和元素同时可用是不好的?,python,python-2.7,Python,Python 2.7,我现在正在网上阅读一些Python的东西,突然出现了一些有趣的东西。基本上它说不要这样做: for i in range(len(mylist)): print i, mylist[i] for (i, item) in enumerate(mylist): print i, item 相反,它说最好这样做: for i in range(len(mylist)): print i, mylist[i] for (i, item) in enumerate(myli

我现在正在网上阅读一些Python的东西,突然出现了一些有趣的东西。基本上它说不要这样做:

for i in range(len(mylist)):
    print i, mylist[i]
for (i, item) in enumerate(mylist):
    print i, item
相反,它说最好这样做:

for i in range(len(mylist)):
    print i, mylist[i]
for (i, item) in enumerate(mylist):
    print i, item

通常我会选择第一个选项,但我认为这样做没有任何潜在的风险。为什么第一个代码不好?与后一种代码相比,第一种代码体是否会对后续代码行产生某种影响?

除了可读性因素外,第二种代码段适用于任何iterable,而第一种代码段仅适用于可以索引的对象(例如列表)。例如,假设您正在使用一个集合:

>>> myset = {1,2,3}
>>>
>>> enumerate(myset)  # works
<enumerate object at 0x2c9440>
>>>
>>> myset[0]          # doesn't work
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing
myset={1,2,3} >>> >>>枚举(myset)#工作 >>> >>>myset[0]#不起作用 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:“set”对象不支持索引
这增加了代码的灵活性,如果您选择切换数据结构,您的生活也会变得更轻松。

因为第二个更容易阅读,也更不容易出错。好吧,fwiw,前者有一个函数调用,而不是后者有两个。