Sayfalar

23 Ocak 2012 Pazartesi

Python'da map, filter ve reduce Fonksiyonları

Bu yazıda listelerle kullanıldığında çok yararlı olan üç fonksiyondan bahsedicem:
filter(), map() ve reduce()

filter(function, dizi) dizideki her eleman için için function(eleman) değerinin true olduğu bir dizi döndürür.
Dizi string veya tuple tipindeyse sonuç da aynı tipte olur; aksi halde sonuç list tipindedir. Örneğin 2 ve 3'e bölünmeyen
bir sayı dizisini hesaplamak için:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

map(function, dizi) dizideki her bir eleman için function(eleman) fonksiyonunu çağırır ve dönen değerlerin bir listesini
döndürür. Örneğin, birkaç sayının küpünü hesaplamak için:

>>> def cube(x): return x*x*x
...
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

Birden fazla dizi de kullanılabilir. Bu durumda fonksiyonun aynı sayıda parametreye sahip olması gerekir. Fonksiyon dizilerdeki
elemanlar karşılıklı olacak şekilde çağırılır. Eğer dizilerden biri daha kısaysa None değeri kullanılır. Örneğin:

>>> seq = range(8)
>>> def add(x, y): return x+y
...
>>> map(add, seq, seq)
[0, 2, 4, 6, 8, 10, 12, 14]

reduce(function, dizi) function ikili fonksiyonunun önce dizinin ilk iki elemanı ile çağrılır. Sonra çıkan sonuç ve bir sonraki eleman ve bu şekilde devam eder. En son tek bir sonuç üretilir. Örneğin 1'den 10'a kadar olan sayıların toplamını hesaplamak için:

>>> def add(x,y): return x+y
...
>>> reduce(add, range(1, 11))
55

Dizide sadece bir eleman varsa onun değeri döndürülür. Eğer dizi boşsa hata oluşur.

Başlangıç değeri olarak bir üçüncü parametre eklenebilir. Bu durumda dizi boş ise başlangıç değeri döndürülür ve fonksiyon önce başlangıç değeri ve dizinin ilk elemanı ile çağrılır. inin ilk iki elemanı ile çağrılır. Sonra çıkan sonuç ve bir sonraki eleman ve bu şekilde devam eder. Örneğin:

>>> def sum(seq):
...     def add(x,y): return x+y
...     return reduce(add, seq, 0)
...
>>> sum(range(1, 11))
55
>>> sum([])
0


şekilde devam ederek çağrılmasıyla tek bir sonuç döndür.