Diğer işlevsel dilleri biliyor musunuz? Yani, python'un işlevsel programlamayı nasıl yaptığını öğrenmeye mi çalışıyorsunuz yoksa işlevsel programlama ve python'u araç olarak kullanmayı mı öğrenmeye çalışıyorsunuz?
Ayrıca, liste anlayışlarını anlıyor musunuz?
map(f, sequence)
(*) ile doğrudan eşdeğerdir:
[f(x) for x in sequence]
Aslında, bir map()
zamanlar fazlalık olarak python 3.0'dan kaldırılması planlandığını düşünüyorum (bu olmadı).
map(f, sequence1, sequence2)
çoğunlukla şuna eşdeğerdir:
[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]
(Dizilerin farklı uzunlukta olduğu durumu nasıl ele aldığı konusunda bir fark vardır. Gördüğünüz gibi map()
, dizilerden biri bittiğinde Yok'u doldurur, oysa zip()
en kısa dizi durduğunda durur)
Yani, özel sorunuza hitap etmek için sonucu üretmeye çalışıyorsunuz:
foos[0], bars
foos[1], bars
foos[2], bars
# etc.
Bunu, tek bir bağımsız değişken alan ve bunu yazdıran ve ardından çubuklar yazan bir işlev yazarak yapabilirsiniz:
def maptest(x):
print x, bars
map(maptest, foos)
Alternatif olarak, şuna benzeyen bir liste oluşturabilirsiniz:
[bars, bars, bars, ] # etc.
ve orijinal harita testinizi kullanın:
def maptest(x, y):
print x, y
Bunu yapmanın bir yolu, listeyi önceden açıkça oluşturmaktır:
barses = [bars] * len(foos)
map(maptest, foos, barses)
Alternatif olarak, itertools
modülü içeri çekebilirsiniz . itertools
python'da işlevsel tarzda yavaş değerlendirme programlaması yapmanıza yardımcı olan birçok akıllı işlev içerir. Bu durumda, itertools.repeat
üzerinde yinelediğinizde argümanını sonsuza kadar çıkaracak olanı istiyoruz . Bu son gerçek, eğer yaparsanız:
map(maptest, foos, itertools.repeat(bars))
map()
argümanlardan biri hala çıktı ürettiği sürece devam ettiğinden sonsuz çıktı elde edeceksiniz. Ancak, itertools.imap
tıpkı gibidir map()
, ancak yinelenebilir en kısa durur durmaz durur.
itertools.imap(maptest, foos, itertools.repeat(bars))
Bu yardımcı olur umarım :-)
(*) Python 3.0'da biraz farklıdır. Burada, map () esasen bir üretici ifadesi döndürür.