for - range python 3
Python 3 cambia el rango a una lista (6)
Estoy tratando de hacer una lista con los números 1-1000
en ella. Obviamente, sería molesto escribir / leer, así que estoy tratando de hacer una lista con un rango. En Python 2 parece que:
some_list = range(1,1000)
habría funcionado, pero en Python 3 el rango es similar al xrange
de Python 2?
¿Alguien puede dar una idea de esto?
De hecho, esta es una retrogradación de Python3 en comparación con Python2. Ciertamente, Python2 que usa range () y xrange () es más conveniente que Python3 que usa list (range ()) y range () respectivamente. La razón es porque el diseñador original de Python3 no tiene mucha experiencia, solo consideraron el uso de la función de rango por parte de muchos principiantes para iterar sobre una gran cantidad de elementos donde la memoria y la CPU son ineficientes; pero descuidaron el uso de la función de rango para producir una lista de números. Ahora es demasiado tarde para que ellos ya vuelvan.
Si fuera el diseñador de Python3, haré lo siguiente:
- use irange para devolver un iterador de secuencia
- use lrange para devolver una lista de secuencias
- use range para devolver un iterador de secuencia (si el número de elementos es grande, por ejemplo, rango (9999999) o una lista de secuencias (si el número de elementos es pequeño, por ejemplo, rango (10))
Eso debería ser óptimo.
En Pythons <= 3.4 puedes, como otros sugirieron, usar list(range(10))
para hacer una lista de un rango (en general, cualquier iterable).
Otra alternativa, introducida en Python 3.5
con sus generalizaciones de desempaquetado, es usar *
en una lista literal []
:
>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Aunque esto es equivalente a list(r)
, es sintaxis literal y el hecho de que no se trata de una llamada de función permite ejecutarlo más rápido. También es menos personajes, si necesitas codificar el golf :-)
En realidad, si quiere 1-1000 (inclusive), use la función de range(...)
con los parámetros 1 y 1001: range(1, 1001)
, porque la función de range(start, end)
va de inicio a (final 1), inclusive.
Puedes simplemente construir una lista desde el objeto rango:
my_list = list(range(1, 1001))
Así es como lo haces con los generadores en python2.x también. Habitualmente hablando, probablemente no necesites una lista, ya que puedes obtener el valor de my_list[i]
más eficiente ( i + 1
), y si solo necesitas iterar sobre ella, puedes recurrir al range
.
También tenga en cuenta que en python2.x, xrange
todavía es indexable 1 . Esto significa que el range
en python3.x también tiene la misma propiedad 2
1 print xrange(30)[12]
funciona para python2.x
2 La declaración análoga a 1 en python3.x es print(range(30)[12])
y eso también funciona.
Realmente no debería necesitar usar los números 1-1000 en una lista. Pero si por alguna razón realmente necesitas estos números, entonces podrías hacer:
[i for i in range(1, 1001)]
Enumere la comprensión en pocas palabras:
La lista anterior de comprensión se traduce a:
nums = []
for i in range(1, 1001):
nums.append(i)
Esta es solo la sintaxis de comprensión de lista, aunque desde 2.x. Sé que esto funcionará en Python 3, pero no estoy seguro si hay una sintaxis actualizada también
El rango comienza incluyendo el primer parámetro; pero termina Hasta, sin incluir el segundo parámetro (cuando se proporcionan 2 parámetros, si el primer parámetro se deja, comenzará en ''0'')
range(start, end+1)
[start, start+1, .., end]
en Python 3.x, la función range()
tiene su propio tipo. entonces en este caso debes usar el iterador
list(range(1000))