Python for循环中的循环计数器

在我下面的示例代码中,是否真的需要counter = 0,还是有一个更好,更Python的方法来访问循环计数器? 我看到一些与循环计数器有关的PEP,但是它们被推迟或拒绝( PEP 212和PEP 281 )。

这是我的问题的一个简单的例子。 在我的真实应用中,这是用graphics完成的,整个菜单必须重新绘制每一帧。 但是这以简单的文本方式certificate它很容易重现。

也许我还应该补充一点,我正在使用Python 2.5,尽pipe如果有特定于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 

像这样使用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) 

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

你也可以这样做:

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

尽pipe如果有重复的选项,您会遇到问题。

我有时会这样做:

 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