2
votes

Explication de la plage avec tranche

Comment 456 est-il devenu 459?

>>> a = range(123, 456, 7)[1::4]  
>>> print(a)
range(130, 459, 28)


0 commentaires

3 Réponses :


1
votes

Vos deux résultats sont essentiellement identiques .

En python 3, les plages sont séquences immuables , en python 2 elles renvoient une liste:

print(a)
> range(130, 459, 28)

print(*range(130, 459, 28))
> 130 158 186 214 242 270 298 326 354 382 410 438

python 2.7:

print(a) 
> [130, 158, 186, 214, 242, 270, 298, 326, 354, 382, 410, 438]


3 commentaires

Les objets range de Python 3 ne sont pas des itérateurs. Vous pouvez les parcourir à plusieurs reprises. Vous ne pouvez pas non plus appeler directement next sur l'un d'eux (vous devez d'abord le passer à iter , pour obtenir un itérateur réel).


La plage Python 3 n'est pas un itérateur. C'est toujours une séquence. Il ne génère que des articles à la demande maintenant.


@Blckknght merci pour la correction, corrigé, ref ajouté à la documentation



1
votes

Pour commencer.

a = range(123, 456, 7)[1::4]
print(list(a))
#[130, 158, 186, 214, 242, 270, 298, 326, 354, 382, 410, 438]

c'est-à-dire que nous obtenons une liste de 123 à 456, avec un pas de 7

Ensuite, nous essayons l'étape suivante. p>

a = range(123, 456, 7)
print(list(a))
#[123, 130, 137, 144, 151, 158,.....431, 438, 445, 452]

Ce qui équivaut à la plage avec un début de 130, avec une taille de pas de 28, et la dernière valeur est 459, qui est plage (130, 459, 28) , qui vous dit également de prendre tous les 4 éléments de la plage, à partir du 1er élément.


0 commentaires

0
votes

Notez que cela se produit également si vous créez une tranche qui ne change rien:

>>> b[1::4]
range(130, 466, 28)

Le dernier nombre inclus dans cette plage est 452, donc toute valeur 452 vous donnerait le même résultat. Étant donné que la première valeur qui n'est pas incluse est l'arrêt avec un pas de 1, il est plus cohérent de l'utiliser pour d'autres étapes également; il vous permet de déterminer rapidement quelle sera la dernière valeur qui est incluse en soustrayant l’étape de l’arrêt.


Ce que je ne sais pas , c'est pourquoi cette logique n'est pas suivie pour la nouvelle étape de 28; sur cette base, il serait utile que le résultat soit:

>>> b = range(123, 456, 7)
>>> print(b[::1])
range(123, 459, 7)

afin que vous puissiez facilement déterminer que la dernière valeur incluse était 438. Cependant, toute valeur 438 donnera le même résultat, donc 459 n'est pas tout à fait faux.


0 commentaires