Dans l'exemple de code ci-dessous, le compteur = 0 est-il vraiment requis ou existe-t-il un meilleur moyen, plus Python, d'accéder à un compteur de boucles? J'ai vu quelques PEP liés aux compteurs de boucle, mais ils ont été soit différés, soit rejetés ( PEP 212 et PEP 281 ).
Ceci est un exemple simplifié de mon problème. Dans mon application réelle, cela se fait avec des graphiques et tout le menu doit être repeint à chaque image. Mais cela le démontre sous forme de texte simple, facile à reproduire.
Peut-être devrais-je également ajouter que j'utilise Python 2.5, bien que cela m'intéresse toujours s'il existe un moyen spécifique à la version 2.6 ou supérieure.
# 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
Lorsqu'il est exécuté, il génère:
[ ] Option 0
[ ] Option 1
[*] Option 2
[ ] Option 3
Utilisez enumerate()
comme suit:
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)
Remarque : Vous pouvez éventuellement mettre des parenthèses autour de counter, option
, comme (counter, option)
, si vous voulez, mais elles sont superflues et non normalement inclus.
Vous pouvez aussi faire:
for option in options:
if option == options[selected_index]:
#print
else:
#print
Bien que vous rencontriez des problèmes s'il existe des options en double.
Je ferai parfois ceci:
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]
Bien que j'aie tendance à éviter cela si cela signifie que je vais dire options[i]
plus de deux fois.
enumerate
est ce que vous recherchez.
Vous pourriez aussi être intéressé par décompresser :
# 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
En outre, il existe itertools.count()
afin que vous puissiez faire quelque chose comme
import itertools
for index, el in Zip(itertools.count(), [28, 4, 1990]):
print(el) # prints the numbers 28, 4, 1990