Comment puis-je limiter les itérations d'une boucle en Python Stack Overflow

la mise en œuvre Naive

Naif Python provenant d'autres langues serait probablement écrire cela parfaitement utile et performant (si unidiomatic) Code:

la mise en œuvre plus idiomatiques

Mais Python a énumérer, qui subsume près de la moitié de ce code bien:







Nous avons donc coupé le code au sujet supplémentaire dans la moitié. Mais il doit y avoir une meilleure façon.

Si Énumérer a un autre argument d'arrêt en option (par exemple, il faut un argument de départ comme celui-ci: énumèrent (articles, start = 1)) qui, je pense, être idéal, mais le ci-dessous n'existe pas (voir la documentation sur enumerate ici ):

Notez qu'il n'y aurait pas besoin de nommer l'index parce qu'il n'y a pas besoin de le référencer.

Est-il un moyen idiomatiques d'écrire ce qui précède? Comment?

Une question secondaire: pourquoi est-ce pas construit en Énumérer?

Est-il plus court, moyen idiomatiques d'écrire ce qui précède? Comment?

Y compris l'index

zip arrête sur le plus court iterable de ses arguments. (En contraste avec le comportement des zip_longest. Qui utilise la plus longue itérables.)

Ainsi, nous pouvons passer un objet de plage (avec son argument d'arrêt) à zip et de l'utiliser comme une énumération limitée.







zip (plage (limite), objets)

Utilisation de Python 3, zip et intervalle de retour iterables, qui pipeline les données au lieu de matérialiser les données dans des listes pour les étapes intermédiaires.

Pour obtenir le même comportement en Python 2, juste xrange substituer pour la gamme et itertools.izip pour zip.

Si l'index ne nécessitant pas, itertools.islice

Vous pouvez utiliser itertools.islice:

qui ne nécessite pas l'affectation à l'index.

Ce qui précède serait moins performant pour ceux qui utilisent déjà énumérer, car il faudrait vérifier s'il est temps d'arrêter chaque itération. Nous pouvons simplement vérifier et utiliser l'ancienne Énumérer si ne prenez pas un argument d'arrêt:

Cette vérification supplémentaire aurait un impact faible performance négligeable.

Quant à savoir pourquoi Énumérer n'a pas un argument d'arrêt, cela a été proposé à l'origine (voir PEP 279):

Cette fonction a été initialement proposé avec démarrage en option et d'arrêter des arguments. GvR [Guido van Rossum] souligne que la énumération des appels de fonction (SEQN, 4, 6) a une alternative, l'interprétation plausible comme une tranche qui reviendrait les quatrième et cinquième éléments de la séquence. Pour éviter l'ambiguïté, les arguments facultatifs ont été abandonnées même si cela signifiait perdre la flexibilité comme un compteur de boucle. Cette flexibilité est le plus important pour le cas commun de comptage d'un, comme dans:

Donc, apparemment départ a été gardé parce qu'il était très précieux, et l'arrêt a été abandonné parce qu'il avait moins de cas d'utilisation et a contribué à la confusion sur l'utilisation de la nouvelle fonction.

Je suppose que maintenant la communauté Python connaît l'utilisation des énumérations, les coûts de confusion seraient compensés par la valeur de l'argument.

Jusqu'à ce moment-là, vous pouvez utiliser:

ou, si vous n'avez pas besoin de l'index du tout:







Articles Liés