Connaissez-vous d'autres langages fonctionnels ? En d'autres termes, essayez-vous d'apprendre comment python fait de la programmation fonctionnelle, ou essayez-vous d'apprendre la programmation fonctionnelle en utilisant python comme véhicule ?
De plus, comprenez-vous les compréhensions de listes ?
map(f, sequence)
est directement équivalent (*) à :
[f(x) for x in sequence]
En fait, je pense map()
devait être supprimé de python 3.0 en raison de sa redondance (ce qui ne s'est pas produit).
map(f, sequence1, sequence2)
est en grande partie équivalent à :
[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]
(il y a une différence dans la façon dont il traite le cas où les séquences sont de longueur différente. Comme vous l'avez vu, map()
remplit None quand une des séquences s'épuise, alors que zip()
s'arrête lorsque la séquence la plus courte s'arrête)
Donc, pour répondre à votre question spécifique, vous essayez de produire le résultat :
foos[0], bars
foos[1], bars
foos[2], bars
# etc.
Vous pouvez le faire en écrivant une fonction qui prend un seul argument et l'imprime, suivi de barres :
def maptest(x):
print x, bars
map(maptest, foos)
Vous pouvez également créer une liste qui ressemble à ceci :
[bars, bars, bars, ] # etc.
et utiliser votre maptest original :
def maptest(x, y):
print x, y
Une façon d'y parvenir serait d'établir explicitement la liste au préalable :
barses = [bars] * len(foos)
map(maptest, foos, barses)
Alternativement, vous pouvez tirer dans le itertools
module. itertools
contient de nombreuses fonctions astucieuses qui vous permettent de faire de la programmation paresseuse de style fonctionnel en python. Dans ce cas, nous voulons itertools.repeat
qui affichera indéfiniment son argument au fur et à mesure que vous l'itérerez. Ce dernier fait signifie que si vous faites :
map(maptest, foos, itertools.repeat(bars))
vous obtiendrez une sortie sans fin, puisque map()
continue tant que l'un des arguments produit encore des résultats. Cependant, itertools.imap
c'est comme map()
mais s'arrête dès que l'itérable le plus court s'arrête.
itertools.imap(maptest, foos, itertools.repeat(bars))
J'espère que cela vous aidera :-)
(*) C'est un peu différent dans python 3.0. Là-bas, map() renvoie essentiellement une expression génératrice.