For 循环中的 Python 循环计数器

在我下面的示例代码中,计数器 = 0真的是必需的吗? 还是有更好的、更多的 Python 方法来访问循环计数器?我看到了一些与循环计数器相关的 PEP,但它们要么被延迟,要么被拒绝(PEP 212PEP 281)。

这是我的问题的一个简化例子。在我的实际应用程序中,这是用图形完成的,整个菜单必须重新绘制每一帧。但是这种方法以一种简单的文本方式演示了它,这种方式很容易复制。

也许我还应该补充一下,我正在使用 Python 2.5,尽管我仍然对是否有一种特定于2.6或更高版本的方法感兴趣。

# Draw all the options, but highlight the selected index
def draw_menu(options, selected_index):
counter = 0
for option in options:
if counter == selected_index:
print " [*] %s" % option
else:
print " [ ] %s" % option
counter += 1




options = ['Option 0', 'Option 1', 'Option 2', 'Option 3']


draw_menu(option, 2) # Draw menu with "Option2" selected

当运行时,它输出:

 [ ] Option 0
[ ] Option 1
[*] Option 2
[ ] Option 3
331789 次浏览

像下面这样使用 enumerate():

def draw_menu(options, selected_index):
for counter, option in enumerate(options):
if counter == selected_index:
print " [*] %s" % option
else:
print " [ ] %s" % option


options = ['Option 0', 'Option 1', 'Option 2', 'Option 3']
draw_menu(options, 2)

注意 : 如果愿意,您可以选择在 counter, option周围放置括号,如 (counter, option),但它们是无关的,通常不包括在内。

你也可以这样做:

 for option in options:
if option == options[selected_index]:
#print
else:
#print

虽然如果有重复的选项,您可能会遇到问题。

我有时会这样做:

def draw_menu(options, selected_index):
for i in range(len(options)):
if i == selected_index:
print " [*] %s" % options[i]
else:
print " [ ] %s" % options[i]

虽然我倾向于避免这样,如果这意味着我将多次说 options[i]

enumerate 就是你要找的。

你可能也对 打开行李感兴趣:

# The pattern
x, y, z = [1, 2, 3]


# also works in loops:
l = [(28, 'M'), (4, 'a'), (1990, 'r')]
for x, y in l:
print(x)  # prints the numbers 28, 4, 1990


# and also
for index, (x, y) in enumerate(l):
print(x)  # prints the numbers 28, 4, 1990

另外,还有 itertools.count(),所以你可以做一些像

import itertools


for index, el in zip(itertools.count(), [28, 4, 1990]):
print(el)  # prints the numbers 28, 4, 1990