Você conhece outras linguagens funcionais? ou seja, você está tentando aprender como o python faz a programação funcional, ou você está tentando aprender sobre a programação funcional e usando o python como veículo?
Além disso, você entende a compreensão da lista?
map(f, sequence)
é diretamente equivalente (*) a:
[f(x) for x in sequence]
Na verdade, acho que map()
antes a remoção do python 3.0 estava programada como redundante (isso não aconteceu).
map(f, sequence1, sequence2)
é basicamente equivalente a:
[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]
(há uma diferença em como ele lida com o caso em que as seqüências são de comprimento diferente. Como você viu, map()
preenche Nenhum quando uma das seqüências acaba, enquanto zip()
para quando a sequência mais curta é interrompida)
Portanto, para abordar sua pergunta específica, você está tentando produzir o resultado:
foos[0], bars
foos[1], bars
foos[2], bars
# etc.
Você pode fazer isso escrevendo uma função que pega um único argumento e o imprime, seguido por barras:
def maptest(x):
print x, bars
map(maptest, foos)
Como alternativa, você pode criar uma lista parecida com esta:
[bars, bars, bars, ] # etc.
e use seu maptest original:
def maptest(x, y):
print x, y
Uma maneira de fazer isso seria criar explicitamente a lista de antemão:
barses = [bars] * len(foos)
map(maptest, foos, barses)
Como alternativa, você pode puxar o itertools
módulo. itertools
contém muitas funções inteligentes que ajudam a executar a programação de avaliação lenta no estilo funcional em python. Nesse caso, queremos itertools.repeat
, que produzirá seu argumento indefinidamente à medida que você iterar sobre ele. Este último fato significa que se você fizer:
map(maptest, foos, itertools.repeat(bars))
você obterá uma saída sem fim, pois map()
continua enquanto um dos argumentos ainda estiver produzindo saída. No entanto, itertools.imap
é como map()
, mas para assim que o menor iterável para.
itertools.imap(maptest, foos, itertools.repeat(bars))
Espero que isto ajude :-)
(*) É um pouco diferente no python 3.0. Lá, map () essencialmente retorna uma expressão de gerador.