Comment 456
est-il devenu 459
?
>>> a = range(123, 456, 7)[1::4] >>> print(a) range(130, 459, 28)
3 Réponses :
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]
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
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.
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
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.