364 votes

Pourquoi la gamme (début, fin) n’inclut pas fin ?

<pre><code></code><p>vous donne</p><pre><code></code></pre><p>Pourquoi pas 1-11 ?</p><p>Ont-ils simplement décidé de le faire comme ça au hasard ou faut-il avoir une valeur, que je ne vois pas ?</p></pre>

283voto

marcog Points 39356

Parce qu'il est plus courant d'appel range(0, 10) qui renvoie [0,1,2,3,4,5,6,7,8,9] qui contient 10 éléments qui équivaut len(range(0, 10)). Rappelez-vous que les programmeurs préfèrent 0 basée sur l'indexation.

Aussi, considérons le code suivant extrait:

for i in range(len(li)):
  pass

Pourriez-vous voir que si range() sont allés jusqu'à exactement len(li) que ce serait problématique? Le programmeur devra explicitement soustraire 1. Cela suit également la tendance commune de programmeurs préférant for(int i = 0; i < 10; i++) sur for(int i = 0; i <= 9; i++).

Si vous appelez de la gamme avec un début de 1 fréquemment, vous pouvez définir votre propre fonction:

>>> range1 = lambda start, end: range(start, end+1)
>>> range1(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

25voto

sepp2k Points 157757

Gammes exclusives ont-ils quelques avantages :

D’une part, chaque article dans est un index valide pour listes de longueur .

Aussi a une longueur de , pas `` qui serait une plage inclusive.

19voto

kindall Points 60645

Il fonctionne bien en combinaison avec de base zéro de l'indexation et de l' len(). Par exemple, si vous avez 10 éléments dans une liste x, elles sont numérotées de 0 à 9. range(len(x)) vous donne 0-9.

Bien sûr, les gens vont vous dire que c'est plus Pythonic faire for item in x ou for item, index in enumerate(x) plutôt que d' for i in range(len(x)).

Découpage fonctionne de cette façon: foo[1:4] est articles 1 à 3 de l' foo (en gardant à l'esprit que le point 1 est en fait le deuxième élément en raison de la non-indexation). Pour des raisons de cohérence, elles doivent fonctionner de la même façon.

Je pense que: "le premier numéro que vous voulez, suivie par le premier numéro que vous ne voulez." Si vous voulez 1-10, le premier numéro que vous ne voulez pas est 11, il est donc range(1, 11).

Si elle devient trop lourde pour une application particulière, il est assez facile d'écrire une petite fonction d'assistance qui ajoute 1 à la fin de l'index et des appels range().

14voto

xuanji Points 897

Il est également utile pour le partage de gammes ; peut être divisé en et , tandis que la gamme inclusivement, vous écririez soit ou . Bien que rarement, vous avez besoin de diviser les plages, vous n’ont pas tendance à diviser les listes assez souvent, qui est une des raisons pour trancher une liste inclut l’élément a-th mais pas le b-th. Puis `` ayant la même propriété rend bien cohérent.

11voto

Skilldrick Points 33002

La longueur de la gamme est la valeur diminuée de la valeur du fond.

Il est très similaire à quelque chose comme :

dans un langage de style C.

Aussi comme la gamme de Ruby :

Ruby reconnaît toutefois que plusieurs fois vous aurez envie d’inscrire la valeur finale et offre l’autre syntaxe :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X