SORU
23 Mart 2009, PAZARTESİ


Nasıl python harita ve diğer işlevsel araçlar Kullanmak için

Bu/python fonksiyonel programlama anlamaya öğrenmeye çalışıyorum n00bish, ama oldukça. Aşağıdaki kodu:

foos = [1.0,2.0,3.0,4.0,5.0]
bars = [1,2,3]

def maptest(foo, bar):
    print foo, bar

map(maptest, foos, bars)

üretir:

1.0 1
2.0 2
3.0 3
4.0 None
5.0 None

S. python göster veya diğer işlevsel araçlar döngüler vb olmadan aşağıdaki üretiminde kullanmak için bir yoldur.

1.0 [1,2,3]
2.0 [1,2,3]
3.0 [1,2,3]
4.0 [1,2,3]
5.0 [1,2,3]

Sadece bir yan not nasıl eğer foo ve bar arasında bir bağımlılık varsa uygulama değişecek. örneğin

foos = [1.0,2.0,3.0,4.0,5.0]
bars = [1,2,3,4,5]

ve yazdırma:

1.0 [2,3,4,5]
2.0 [1,3,4,5]
3.0 [1,2,4,5]
...

**P. S: bu saf bir şekilde kullanarak, döngüler ve/veya jeneratörleri nasıl biliyorum, ama aynı işlevsel araçları kullanarak elde etmek için nasıl öğrenmek istiyorum. Bir ifade veya barlar için başka bir filtre göster maptest içinde DAHİLİ olarak maptest uygulamak için ekleme sadece bir durum mu? **

CEVAP
23 Mart 2009, PAZARTESİ


Diğer işlevsel dil bilir misin? yani python fonksiyonel programlama mı öğrenmek için mi çalışıyorsun, yoksa fonksiyonel programlama araç olarak python kullanmayı öğrenmek için çalışıyorsunuz?

Ayrıca, liste üreteçleri anlıyor musun?

map(f, sequence)

doğrudan karşılığı ( * ):

[f(x) for x in sequence]

Aslında map() bir kez gereksiz (bu olmadı) olarak python 3.0 kaldırılması için aday olduğunu düşünüyorum.

map(f, sequence1, sequence2)

çoğunlukla eşdeğer

[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]

(dizileri farklı uzunlukta olması durumunda işler nasıl bir fark var. , map() dizilerden birini bittiğinde Hiçbiri doldurur, en kısa sıra durduğunda zip() durur ise) gördüğünüz gibi

Yani, belirli bir sorunuza cevap vermek için, sonuç üretmek için çalışıyoruz:

foos[0], bars
foos[1], bars
foos[2], bars
# etc.

Tek bir argüman alır ve onu yazdıran bir fonksiyon yazarak bunu, parmaklıklar ardından.

def maptest(x):
     print x, bars
map(maptest, foos)

Alternatif olarak, bu gibi görünen bir liste oluşturabilir:

[bars, bars, bars, ] # etc.

ve özgün maptest kullanın:

def maptest(x, y):
    print x, y

Bunu yapmanın bir yolu explicitely için listeye önceden inşa:

barses = [bars] * len(foos)
map(maptest, foos, barses)

Alternatif olarak, itertools modülünde çekmek olabilir. itertools fonksiyonel tarzı tembel-değerlendirme yapmanıza yardımcı birçok akıllı fonksiyonları python programlama içerir. Bu durumda, üzerinde yineleme gibi bağımsız, süresiz çıkış itertools.repeat, istiyoruz. Bu son aslında eğer bunu yaparsanız anlamına gelir:

map(maptest, foos, itertools.repeat(bars))

map() argümanlardan biri hala çıkış üretmek olduğu sürece devam ediyor bu yana sonsuz çıktı. Ancak, 38* *map() ama keser kesmez en kısa iterable durur gibi.

itertools.imap(maptest, foos, itertools.repeat(bars))

Umarım bu yardımcı olur :-)

(*) Python 3.0 biraz farklı. Map() yok aslında döner jeneratör bir ifade.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • disneychannel

    disneychanne

    19 ŞUBAT 2006
  • SHAYTARDS

    SHAYTARDS

    1 EKİM 2008
  • Chaîne de TheMoustic

    Chaîne de T

    5 Kasım 2006