Anexando a la función de rango

EDIT : Gracias por sus respuestas amables sobre cómo lograr lo que estoy tratando de hacer, pero la pregunta es ¿POR QUÉ el rango ()? Append () devuelve Ninguno si lo intenta en un paso, y POR QUÉ funciona si dos paso el procedimiento.

Estoy tratando de crear una lista numérica pero con un giro. No quiero un par de números al principio de mi lista:

mlist = [0, 5, 6, 7, ...] 

Así que pensé en hacer lo siguiente:

  mlist = range(5,n+1).append(0) 

pero falla silenciosamente porque el type(mlist) es igual a NoneType ? (relacionado: type(range(5,10) evalúa para list Type)

Si bash hacerlo en dos pasos, por ejemplo:

 >>> mlist = range(5,10) #and then >>> mlist.append(0) >>> mlist [5, 6, 7, 8, 9, 10, 0] 

¿Qué esta pasando?

list.append() altera la lista en su lugar y devuelve None . Al asignar, asignó ese valor de retorno a mlist , no a la lista que quería construir. Este es un lenguaje estándar de Python; los métodos que alteran el objeto mutable nunca devuelven el objeto alterado, siempre None .

Separa los dos pasos:

 mlist = range(5, n + 1) mlist.append(0) 

Esto agrega [0] al final ; Si necesita el 0 al inicio, use:

 mlist = [0] + range(5, n + 1) 

o puede usar list.insert() , nuevamente como una llamada separada:

 mlist = range(5, n + 1) mlist.insert(0, 0) 

pero este último tiene que cambiar todos los elementos un paso y crear una nueva lista por concatenación es la opción más rápida para listas más cortas, la inserción gana en listas más largas:

 >>> from timeit import timeit >>> def concat(n): ... mlist = [0] + range(5, n) ... >>> def insert(n): ... mlist = range(5, n) ... mlist.insert(0, 0) ... >>> timeit('concat(10)', 'from __main__ import concat') 1.2668070793151855 >>> timeit('insert(10)', 'from __main__ import insert') 1.4820878505706787 >>> timeit('concat(1000)', 'from __main__ import concat') 23.53221583366394 >>> timeit('insert(1000)', 'from __main__ import insert') 15.84601092338562 

Existen múltiples opciones, pero la más simple podría ser:

 >>> mlist = [0] + range(5,10) >>> mlist [0, 5, 6, 7, 8, 9] 

Para insertar un elemento al principio, use list.insert con 0 (índice 0):

 >>> mlist = range(5,10) >>> mlist.insert(0, 0) # the first 0: index, the second 0: the item to insert >>> mlist [0, 5, 6, 7, 8, 9] 

Respuesta a EDITAR :

La mayoría de los métodos que cambian la secuencia / asignación en su lugar devuelven None . Tan solo llame al método y no reasigne el valor de retorno a la variable.

Consulte ¿Por qué list.sort () no devuelve la lista ordenada? de las preguntas frecuentes de Python.

EDIT: Gracias por sus respuestas amables sobre cómo lograr lo que estoy tratando de hacer, pero la pregunta es ¿POR QUÉ el rango ()? Append () devuelve Ninguno si lo intenta en un paso, y POR QUÉ funciona si dos paso el procedimiento.

En pocas palabras, a GvR no le gustó, de la lista de correo de desarrolladores de Python :

Me gustaría explicar una vez más por qué estoy tan convencido de que la clase () no debería devolver “yo”.

Esto proviene de un estilo de encoding (popular en varios otros idiomas, creo que especialmente Lisp se deleita en él) donde una serie de efectos secundarios en un solo objeto se puede encadenar así:

x.compress (). chop (y) .sort (z)

que seria lo mismo que

x.compress ()
x.chop (y)
x.sort (z)

Encuentro que el encadenamiento es una amenaza para la legibilidad; requiere que el lector esté familiarizado con cada uno de los métodos. La segunda forma deja claro que cada una de estas llamadas actúa sobre el mismo objeto, por lo que incluso si no conoce muy bien la clase y sus métodos, puede comprender que la segunda y la tercera llamada se aplican a x (y que todas las llamadas se hacen por sus efectos secundarios, y no a otra cosa.

Me gustaría reservar el encadenamiento para las operaciones que devuelven valores nuevos, como las operaciones de procesamiento de cadenas:

y = x.rstrip (“\ n”). split (“:”). lower ()

Hay algunos módulos de biblioteca estándar que fomentan el encadenamiento de llamadas de efectos secundarios (pstat viene a la mente). No debería haber nuevos; pstat se deslizó a través de mi filtro cuando estaba débil.