El mutador métodos de contenedores mutables de Python (tales como el método de listas .reverse
) casi invariablemente volver None
- unos pocos retorno un valor útil, por ejemplo, el método .pop
devuelve el elemento reventado, pero el concepto clave para retener es que ninguno de esos mutadores devuelve el contenedor mutado: más bien, el contenedor muta en el lugar y el valor de retorno del método del mutador es que no es ese contenedor. (Esta es una aplicación del principio de diseño CQS, no tan fanático como, por ejemplo, en Eiffel, el lenguaje ideado por Bertrand Meyer, que también inventó CQS, pero eso es solo porque en Python "la practicidad supera a la pureza, cfr import this
; . -)
construcción de una lista es a menudo más costosos que sólo la construcción de un iterador, para el caso abrumadoramente común donde lo único que quiere hacer es bucle en el resultado, por lo tanto, muebles empotrados como reversed
(y todo el bloques de construcción maravillosos en el módulo itertools
) iteradores de retorno, listas.
Pero, ¿y si usted por lo tanto tiene una n iterador x
pero realmente necesita la lista equivalente y
? Un pedazo de pastel: solo hazlo y = list(x)
. Para hacer una nueva instancia del tipo list
, llame al tipo list
- ¡esta es una idea general de Python que es aún más crucial de conservar que las cosas bastante importantes que señalé en los dos primeros párrafos!-)
Por lo tanto, el código para su problema específico es realmente muy fácil de armar basado en las nociones cruciales en los párrafos anteriores:
[list(reversed(row)) for row in figure]
Tenga en cuenta que estoy usando una lista por comprensión, no map
: como regla general, map
deberían utilizarse sólo como una optimización de último recurso cuando hay sin necesidad de un lambda
para construirlo (si un lambda
participa luego un listcomp, además de ser más claros, como de costumbre , también tiende a ser más rápido de todos modos! -).
Una vez que usted es un "maestro en Python", si su perfilado te dice que este código es un cuello de botella, a continuación, puede saber para probar alternativas tales como
[row[::-1] for row in figure]
aplicar un corte en rodajas a paso negativo (también conocido como "Martian Smiley") para hacer copias invertidas de las filas, sabiendo que generalmente es más rápido que el enfoque list(reversed(row))
. Pero, a menos que su código deba ser mantenido solo por usted o por alguien al menos tan hábil en Python, es una posición defendible usar el enfoque más simple de "código de los primeros principios", excepto cuando el perfil le dice que presione el pedal . (Personalmente, creo que el "Smiley marciano" es lo suficientemente importante como para evitar aplicar esta buena filosofía general a este caso de uso específico, pero, ¡oye, las personas razonables podrían diferir en este punto específico! -).
+1 para la superación del sesgo personal :: - 1 – intuited
+1 para "Martian Smiley" –