| You are here: Inicio > Inmersión en Python > Programación Funcional > Revisión de la relación de listas | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
Ya está familiarizado con el uso de listas por comprensión para hacer corresponder una a otra. Hay otra manera de conseguir lo mismo usando la función incorporada map. Funciona muy parecido a filter.
>>> def double(n): ... return n*2 ... >>> li = [1, 2, 3, 5, 9, 10, 256, -3] >>> map(double, li)[2, 4, 6, 10, 18, 20, 512, -6] >>> [double(n) for n in li]
[2, 4, 6, 10, 18, 20, 512, -6] >>> newlist = [] >>> for n in li:
... newlist.append(double(n)) ... >>> newlist [2, 4, 6, 10, 18, 20, 512, -6]
| map toma una función y una lista[19] y devuelve una lista nueva invocando la función sobre cada elemento de la lista, por orden. En este caso la función simplemente multiplica cada elemento por 2. | |
| Podría conseguir lo mismo con una lista por comprensión. Las listas por comprensión se introdujeron por primera vez en Python 2.0; map lleva ahí desde el principio. | |
| Podría usar un bucle for para conseguir lo mismo, si insistiera en pensar como un programador de Visual Basic. |
>>> li = [5, 'a', (2, 'b')] >>> map(double, li)[10, 'aa', (2, 'b', 2, 'b')]
Bien, basta de jugar. Veamos algo de código real.
filenameToModuleName = lambda f: os.path.splitext(f)[0]
moduleNames = map(filenameToModuleName, files) 
| Como vio en Sección 4.7, “Utilización de las funciones lambda”, lambda define una función en línea (inline). Y también vio en Ejemplo 6.17, “Dividir nombres de rutas” que os.path.splitext toma el nombre de un fichero y devuelve una tupla (nombre, extensión). Así que filenameToModuleName es una función que tomará un nombre de fichero y eliminará la extensión para devolver sólo el nombre. | |
| La invocación a map toma cada nombre de fichero listado en files, lo pasa a la función filenameToModuleName, y devuelve una lista de los valores de retorno de cada una de estas invocaciones. En otras palabras, elimina la extensión de fichero de cada nombre y almacena la lista de estos nombres sin extensión en moduleNames. |
Como verá en el resto del capítulo, podemos extender este tipo de forma de pensar centrada en los datos hasta el objetivo final, que es definir y ejecutar una única batería de pruebas que contenga las pruebas de todas esas otras baterías a menor escala.
[19] De nuevo, debería señalar que map puede tomar una lista, una tupla o cualquier objeto que actúe como una secuencia. Vea la nota anterior sobre filter.
<< Revisión del filtrado de listas |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Programación "datocéntrica" >> |