¿Conoces otros lenguajes funcionales? es decir, ¿estás tratando de aprender cómo Python hace la programación funcional, o estás tratando de aprender acerca de la programación funcional y usar Python como vehículo?
Además, ¿entiendes las comprensiones de listas?
map(f, sequence)
es directamente equivalente (*) a:
[f(x) for x in sequence]
De hecho, creo que map()
una vez se programó la eliminación de Python 3.0 como redundante (eso no sucedió).
map(f, sequence1, sequence2)
es mayormente equivalente a:
[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]
(hay una diferencia en cómo maneja el caso en el que las secuencias son de diferente longitud. Como viste, completa map()
None cuando una de las secuencias se agota, mientras que se zip()
detiene cuando se detiene la secuencia más corta)
Entonces, para abordar su pregunta específica, está tratando de producir el resultado:
foos[0], bars
foos[1], bars
foos[2], bars
# etc.
Puede hacer esto escribiendo una función que tome un solo argumento y lo imprima, seguido de barras:
def maptest(x):
print x, bars
map(maptest, foos)
Alternativamente, puede crear una lista que se vea así:
[bars, bars, bars, ] # etc.
y usa tu prueba de mapa original:
def maptest(x, y):
print x, y
Una forma de hacerlo sería crear explícitamente la lista de antemano:
barses = [bars] * len(foos)
map(maptest, foos, barses)
Alternativamente, puede tirar del itertools
módulo. itertools
contiene muchas funciones inteligentes que lo ayudan a realizar una programación de evaluación perezosa de estilo funcional en python. En este caso, queremos itertools.repeat
, que generará su argumento de forma indefinida a medida que lo repita. Este último hecho significa que si haces:
map(maptest, foos, itertools.repeat(bars))
obtendrá una salida infinita, ya que map()
continúa mientras uno de los argumentos siga produciendo. Sin embargo, itertools.imap
es igual map()
, pero se detiene tan pronto como se detiene el iterativo más corto.
itertools.imap(maptest, foos, itertools.repeat(bars))
Espero que esto ayude :-)
(*) Es un poco diferente en python 3.0. Allí, map () esencialmente devuelve una expresión generadora.