Python Dilinde Lambda, Map, Filter ve Reduce
İşler hep Guido van Rossum’un istediği gibi gitseydi, Python dilinde lambda, map, filter ve reduce kavramları olmayacaktı. Ama bazı gruplardan gelen talepler ağır bastı; sonuç olarak lambda, map ve filter Python çekirdeğinde varlıklarını sürdürmeye devam ederken, sadece reduce functools modülüne kaydırıldı.
Rossum’un bu terimlere karşı çıkmasının gerekçeleri şunlardı:
-
- Liste kısaltmaları (list comprehensions) lambda, map, filter ve reduce yerine daha güçlü bir şekilde kullanılabilir.
- Liste kısaltmaları daha açık ve anlaşılırdır.
- Python yaklaşımına aykırı bir şekilde, aynı soruna yönelik birden fazla Python çözüm yöntemi olacaktır.
Liste kısaltmaları for döngülerine kıyasla % 35, map fonksiyonuna kıyasla %45 daha hızlı çalışmaktadır. Dolayısıyla kodlama yaparken bu ayrıntıları da bilmekte yarar var.
lambda Fonksiyonu
1 |
kare = lambda x : x*x |
ile
1 |
def kare(x): return(x*x) |
fonksiyonları aynı işleve sahiptir.
İlkinde anonim bir fonksiyon tanımlayıp, bu fonksiyonu kare değişkenine atıyoruz. Diğerinde ise doğrudan bir fonksiyon tanımlıyoruz.
map Fonksiyonu
map fonksiyonu 2 argüman alır. İlk argüman bir fonksiyon, ikinci argüman ise bir dizilimdir (sequence). map fonksiyonu ilk argüman olarak verilen fonksiyona dizilim elemanlarının her birini argüman olarak atar ve sonuçları bir map nesnesi olarak geri döndürür.
1 2 |
m = map(lambda x: x*x*x, [1,2,3,4,5]) print(list(m)) |
Sonuçlar:
1 |
[1, 8, 27, 64, 125] |
filter Fonksiyonu
Bu fonksiyon da tıpkı map gibi ilk argüman olarak bir fonksiyon, ikinci argüman olarak bir dizilim alır. Ancak geriye sadece, fonksiyona uygulandığında True değer üreten dizilim elemanlarını döndürür.
Aşağıdaki kod satırları 1 ila 20 arasındaki sayılardan 3’e tam olarak bölünenleri geri döndürmektedir.
1 2 3 4 |
liste = list(range(1,21)) f = filter(lambda x: x%3==0, liste) print(liste) print(list(f)) |
Sonuçlar:
1 2 |
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] [3, 6, 9, 12, 15, 18] |
reduce Fonksiyonu
Bu fonksiyon functools modülünde yer alır ve geriye tek bir sonuç döndürür.
Örneğin 1 ile 100 arasındaki sayıların toplamını bulalım:
1 2 3 |
from functools import reduce r = reduce(lambda x+y: x+y, range(1,1001)) print(r) |
Sonuç:
1 |
500500 |
Bir sonraki yazımda liste kısaltmaları (list comprehensions) konusunu ele alacağım.
Ahmet Aksoy
Referanslar: