Czy znasz inne języki funkcjonalne? tj. czy próbujesz się nauczyć, jak Python działa w programowaniu funkcjonalnym, czy też próbujesz nauczyć się programowania funkcjonalnego i używać Pythona jako pojazdu?
Czy rozumiesz też listy ze zrozumieniem?
map(f, sequence)
jest bezpośrednio równoważne (*) z:
[f(x) for x in sequence]
W rzeczywistości myślę, że map()
kiedyś był przeznaczony do usunięcia z Pythona 3.0 jako zbędny (tak się nie stało).
map(f, sequence1, sequence2)
jest przeważnie równoważne z:
[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]
(istnieje różnica w sposobie postępowania w przypadku, gdy sekwencje mają różną długość. Jak widzieliście, map()
wypełnia wartość None, gdy skończy się jedna z sekwencji, a zip()
zatrzymuje się, gdy najkrótsza sekwencja się zatrzymuje)
Tak więc, odpowiadając na swoje konkretne pytanie, próbujesz uzyskać wynik:
foos[0], bars
foos[1], bars
foos[2], bars
Możesz to zrobić, pisząc funkcję, która pobiera pojedynczy argument i wyświetla go, po którym następują paski:
def maptest(x):
print x, bars
map(maptest, foos)
Alternatywnie możesz utworzyć listę, która wygląda następująco:
[bars, bars, bars, ]
i użyj swojego oryginalnego testu map:
def maptest(x, y):
print x, y
Jednym ze sposobów na zrobienie tego byłoby wyraźne utworzenie listy wcześniej:
barses = [bars] * len(foos)
map(maptest, foos, barses)
Alternatywnie możesz pobrać itertools
moduł. itertools
zawiera wiele sprytnych funkcji, które pomagają w programowaniu z leniwą oceną w stylu funkcjonalnym w Pythonie. W tym przypadku chcemy itertools.repeat
, aby jego argument był wyświetlany w nieskończoność podczas iteracji. Ten ostatni fakt oznacza, że jeśli:
map(maptest, foos, itertools.repeat(bars))
otrzymasz niekończące się dane wyjściowe, ponieważ map()
trwa tak długo, jak długo jeden z argumentów nadal generuje wynik. Jednak itertools.imap
jest podobny map()
, ale zatrzymuje się, gdy tylko najkrótsze iterowalne zatrzymania.
itertools.imap(maptest, foos, itertools.repeat(bars))
Mam nadzieję że to pomoże :-)
(*) Trochę inaczej jest w Pythonie 3.0. Tam map () zasadniczo zwraca wyrażenie generatora.