Python compteur de boucle dans une boucle for
Dans mon exemple de code ci-dessous, le compteur = 0 vraiment nécessaire, ou est-il un meilleur, plus de Python, de façon à obtenir l'accès à un compteur de boucle? J'ai vu un peu de PEPs liées aux compteurs de boucle, mais ils étaient soit différé ou refusé (PEP 212 et PEP 281).
C'est un exemple simplifié de mon problème. Dans mon application réelle de ce qui est fait avec des graphiques et de l'ensemble du menu doit être repeint chaque image. Mais cela démontre dans un texte simple manière qui est facile à reproduire.
Je devrais peut-être ajouter que je suis à l'aide de Python 2.5, même si je suis toujours intéressé si il y a une manière spécifique de 2.6 ou supérieur.
# 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 affiche:
[ ] Option 0
[ ] Option 1
[*] Option 2
[ ] Option 3
- vous pouvez simplement utiliser la longueur du tableau de propriété au lieu de la pour les dans la boucle de la méthode, pour i < tableau.longueur?
- double possible de l'Accès à l'index en Python pour les boucles
Vous devez vous connecter pour publier un commentaire.
Utilisation
enumerate()
comme suit:Note: Vous pouvez éventuellement mettre des parenthèses autour de
counter, option
, comme(counter, option)
, si vous voulez, mais ils sont étrangers et ne sont généralement pas inclus.Vous pouvez aussi faire:
Bien que vous vous souhaitez rencontrer des problèmes si il y a les options en double.
Je vais parfois faire:
Bien que j'ai tendance à éviter cette situation, si cela signifie que je vais dire
options[i]
plus d'un couple de fois.python -m timeit "s = 'String used for testing'; ''.join(str(i)+str(c) for i, c in enumerate(s))"
etpython -m timeit "s = 'String used for testing'; ''.join(str(i)+str(s[i]) for i in xrange(len(s)))"
. Chacun d'entre eux en moyenne sur 8.83 usec par boucle de plus de 100 000 boucles. D'autres tests (trop long pour un commentaire) a montré un très faible (~2%) des augmentations de vitesse pourxrange(len(s))
si il seulement nécessaire pour accéder à l'élément sur tous les 16 itérations.énumérer
est ce que vous cherchez.Vous pourriez également être intéressé par déballage:
Aussi, il y a
itertools.count()
de sorte que vous pourriez faire quelque chose comme