J'essaie de faire une liste avec des chiffres 1-1000
. De toute évidence, ce serait ennuyeux à écrire / lire, donc j'essaie de faire une liste avec une plage. Dans Python 2, il semble que:
some_list = range(1,1000)
aurait fonctionné, mais en Python 3, la plage est similaire à celle xrange
de Python 2?
Quelqu'un peut-il donner un aperçu de cela?
python
python-3.x
list
range
Boathouse
la source
la source
some_list[i] == i+1
donc vous n'avez probablement pas vraiment besoin d'une liste de toute façon.Réponses:
Vous pouvez simplement construire une liste à partir de l'objet range:
C'est ainsi que vous le faites avec les générateurs de python2.x également. En règle générale, vous n'avez probablement pas besoin d'une liste puisque vous pouvez trouver la valeur de
my_list[i]
plus efficacement (i + 1
), et si vous avez juste besoin d'itérer dessus, vous pouvez simplement vous rabattre surrange
.Notez également que sur python2.x,
xrange
est toujours indexable 1 . Cela signifie querange
sur python3.x a également la même propriété 21
print xrange(30)[12]
fonctionne pour python2.x2 L'instruction analogue à 1 dans python3.x est
print(range(30)[12])
et cela fonctionne aussi.la source
list(arg)
est compris dans d'autres langages comme appelant un constructeur de lalist
classe. En fait, c'est aussi le cas Python. Les débats pour savoir si l'objet est rempli pendant la construction (comme dans le cas C ++) ou seulement pendant la première méthode appelée automatiquement (comme dans la__init__()
méthode Python ) ne peuvent pas changer l'idée abstraite de base. Mon point de vue est que le constructeur de liste prend l'itérateur et remplit la liste avec les valeurs renvoyées .'range' object is not callable
Dans Pythons <= 3.4, vous pouvez, comme d'autres l'ont suggéré, utiliser
list(range(10))
pour créer une liste à partir d'une plage (en général, toute itération).Une autre alternative, introduite dans Python
3.5
avec ses généralisations de décompression, consiste à utiliser*
dans un littéral de liste[]
:Bien que cela soit équivalent à
list(r)
, c'est une syntaxe littérale et le fait qu'aucun appel de fonction n'est impliqué lui permet de s'exécuter plus rapidement. C'est aussi moins de caractères, si vous avez besoin de coder le golf :-)la source
[*range(10)]
fonctionne très bien lorsque vous n'avez pas besoin de lerange
pour un autre but que l'initialisation dulist
. Note latérale: Ma partie préférée (d'accord, pas vraiment) des généralisations de déballage est que lesset
s vides ont maintenant une syntaxe littérale{*()}
, ou comme je l'appelle, l'opérateur du singe borgne. ;-)dans Python 3.x, la
range()
fonction a son propre type. donc dans ce cas, vous devez utiliser iteratorlist(range(1000))
la source
list(range(1000))()
La raison pour laquelle Python3 n'a pas de fonction pour obtenir directement une liste à distance est que le concepteur original de Python3 était assez novice en Python2. Il n'a considéré que l'utilisation de la
range()
fonction dans une boucle for, ainsi, la liste ne devrait jamais avoir besoin d'être développée. En fait, très souvent, nous devons utiliser larange()
fonction pour produire une liste et passer dans une fonction.Par conséquent, dans ce cas, Python3 est moins pratique que Python2 car:
xrange()
etrange()
;range()
etlist(range())
Néanmoins, vous pouvez toujours utiliser l'extension de liste de cette manière:
la source
list
, car ce n'est généralement pas la bonne chose à faire. Pour 99 cas d'utilisation sur 100, créer un réellist
est inefficace et inutile, carrange
elle-même agit comme une séquence immuable de presque toutes les manières, parfois plus efficacement pour démarrer (par exemple, les tests de confinement pourint
s sontO(1)
, contreO(n)
pourlist
s). Dans Python 2, les gens avaient tendance à utiliserrange
par défaut, même sixrange
c'était presque toujours la meilleure option; dans Python 3, vous pouvez activer explicitement lelist
, ne pas l'obtenir par accident en utilisant le mauvais nom.Vous ne devriez vraiment pas avoir besoin d'utiliser les nombres 1 à 1 000 dans une liste. Mais si pour une raison quelconque vous avez vraiment besoin de ces chiffres, vous pouvez faire:
Compréhension de la liste en quelques mots:
La compréhension de la liste ci-dessus se traduit par:
Ceci est juste la syntaxe de compréhension de liste, bien qu'à partir de 2.x. Je sais que cela fonctionnera dans python 3, mais je ne suis pas sûr qu'il existe également une syntaxe mise à niveau
La plage commence avec le premier paramètre; mais se termine jusqu'à, sans inclure le deuxième paramètre (lorsqu'il est fourni 2 paramètres; si le premier paramètre est laissé désactivé, il commencera à '0')
la source
list(range(1000))
list()
constructeur avec un itérable . Lelist()
constructeur sait comment créer une nouvelle liste lorsqu'on lui attribue un objet itérable.list(range(1000))
fonctionnera en python3 commelist(xrange(1000))
en python2En fait, si vous voulez 1-1000 (inclus), utilisez la
range(...)
fonction avec les paramètres 1 et 1001:,range(1, 1001)
car larange(start, end)
fonction va du début à (fin-1), inclus.la source
Utilisez Range dans Python 3.
Voici un exemple de fonction qui renvoie entre les nombres de deux nombres
la source
En fait, il s'agit d'une rétro-gradation de Python3 par rapport à Python2. Certes, Python2 qui utilise range () et xrange () est plus pratique que Python3 qui utilise respectivement list (range ()) et range (). La raison en est que le concepteur original de Python3 n'est pas très expérimenté, ils ont uniquement considéré l'utilisation de la fonction range par de nombreux débutants pour itérer sur un grand nombre d'éléments où la mémoire et le processeur sont à la fois inefficaces; mais ils ont négligé l'utilisation de la fonction de plage pour produire une liste de nombres. Maintenant, il est trop tard pour eux de revenir déjà.
Si je devais être le concepteur de Python3, je:
Cela devrait être optimal.
la source