Fonksiyonel Programlamaya Giriş: Map, Reduce ve Saf Fonksiyon Örnekleri
Fonksiyonel Programlamaya Giriş
Fonksiyonel Programlamaya Giriş: Map, Reduce ve Saf Fonksiyon Örnekleri

Giriş
Fonksiyonel programlama (FP), hesaplamaları saf fonksiyonlar ve yan etkiden kaçınma ilkesi etrafında organize eden bir paradigmadır. Bu yaklaşımda fonksiyonlar birinci sınıf vatandaş olarak kullanılır; yani fonksiyonlar değişkenlere atanabilir, başka fonksiyonlara argüman olarak verilebilir ve fonksiyonlardan döndürülebilir. Kavramın temelleri ve faydaları hakkında genel bir giriş için KodSözlük’teki özet faydalıdır.
Bu yazıda ne öğreneceksiniz?
- Fonksiyonel programlamanın temel kavramları (saf fonksiyon, immutability, yüksek dereceli fonksiyonlar).
- Python örnekleriyle map, filter ve reduce kullanım biçimleri ve kısa açıklamaları.
- Pratik uygulama adımları, dikkat edilmesi gereken noktalar ve başlangıç için kontrol listesi.
Not
Bu rehber genel amaçlı eğitim içindir ve Python örnekleri üzerinden ilerler. Temel tanımlar için kaynaklara bağlantılar sunulmuştur; daha derin teorik ayrıntılar için okuma önerileri en altta yer almaktadır.
Temel Kavramlar
- Saf fonksiyonlar (Pure functions): Aynı girdiler verildiğinde her zaman aynı çıktıyı üretir ve dış dünyada gözlemlenebilir bir yan etki yapmaz. Saf fonksiyonların tanımı ve önemi için bir inceleme: (Pure) Saf Fonksiyon Nedir?.
- Yüksek dereceli fonksiyonlar (Higher-order functions): Bir fonksiyonu argüman olarak alabilen veya fonksiyon döndürebilen fonksiyonlardır. Map, filter ve reduce tipik örneklerdir.
- Immutability (Değiştirilemezlik): Veri yapılarının değiştirilmemesi, yerine yeni veri yapılarının oluşturulması önemlidir; bu, eşzamanlı (concurrent) ve paralel senaryolarda öngörülebilirlik sağlar (KodSözlük).
- Yan etkiler (Side effects): Bir fonksiyonun dış dünyayı değiştirmesi (dosya yazmak, global değişkeni değiştirmek, I/O yapmak) yan etkidir; fonksiyonel yaklaşımlar bu etkileri sınırlamaya çalışır.
Saf Fonksiyonlar: Tanım ve Basit Örnek
Saf fonksiyonların en önemli iki özelliği deterministik olmaları (aynı girdiye aynı çıktı) ve yan etki üretmemeleridir. Bu özellikler birim testlerini, hata ayıklamayı ve paralel çalışmayı kolaylaştırır (kaynak).
def square(x):
return x * x
print(square(3)) # 9
Yukarıdaki square fonksiyonu, aynı girdiye (ör. 3) her zaman aynı sonuç verir ve dışarıda hiçbir durumu değiştirmez; bu yüzden saftır.
Yüksek Dereceli Fonksiyonlar
Yüksek dereceli fonksiyonlar, fonksiyonları argüman olarak alıp döndürebilen yapı taşlarıdır. Python'da map, filter ve reduce gibi fonksiyonlar bu kategoriye girer.
Map, Filter ve Reduce: Python Örnekleri
Etem Keskin'in derlemesi, Python'da map/filter/reduce kullanımını ve pratik uygulamalarını açıklar; aşağıdaki örnekler bu kaynak temel alınarak sadeleştirilmiştir (Etem Keskin).
Map Örneği
Map, her elemana bir dönüşüm uygular ve Python 3'te bir iterator döndürür. Tipik kullanım:
numbers = [1, 2, 3, 4]
squares = list(map(lambda x: x * x, numbers)) # [1, 4, 9, 16]
print(squares)
Alternatif olarak Pythonic olan list comprehension da sık kullanılır: [x * x for x in numbers].
Filter Örneği
Filter, bir koşula göre elemanları seçer:
evens = list(filter(lambda x: x % 2 == 0, numbers)) # [2, 4]
print(evens)
Reduce Örneği
Reduce, sekansın öğelerini ikili bir işlemle tek bir değere indirger. Python'da functools içinden alınır:
from functools import reduce
sum_all = reduce(lambda a, b: a + b, numbers) # 10
product = reduce(lambda a, b: a * b, numbers, 1) # 24
print(sum_all, product)
Not: Bazı toplama/çarpma işlemleri için sum() veya math.prod (Python 3.8+) gibi yerleşik fonksiyonlar daha okunaklı olabilir.
İmmutability (Değiştirilemezlik) ve Yan Etkisizlik
Immutable veri yapıları kullanmak, paylaşılan durumu azaltır ve paralel kodu güvenli hâle getirir. Örnek:
nums = (1, 2, 3)
new_nums = nums + (4,)
print(nums) # (1, 2, 3)
print(new_nums) # (1, 2, 3, 4)
İmmutability performans açısından bazen ekstra kopyalama maliyeti getirebilir; büyük veri kümelerinde uygun veri yapıları veya kütüphaneler tercih edilmelidir.
Pratik Uygulama: Basit Bir Veri Boru Hattı (Pipeline)
Aşağıda dosyadan okuma yerine statik bir listeyle gösterilen küçük bir pipeline örneği var: veriyi parçalayıp dönüştürme, filtreleme ve indirgeme adımları.
def parse_int(s):
return int(s.strip())
texts = ["1", " 2", "3", "4"]
numbers = list(map(parse_int, texts))
evens = list(filter(lambda x: x % 2 == 0, numbers))
from functools import reduce
sum_even = reduce(lambda a, b: a + b, evens, 0)
print(sum_even) # 2 + 4 = 6
Adımların ayrı fonksiyonlara bölünmesi test yazmayı kolaylaştırır ve kodu daha okunaklı kılar.
Ne Zaman Fonksiyonel Yaklaşım Kullanılmalı?
- Veri dönüşümü, boru hattı (pipeline) ve akış tabanlı işlemler yaparken uygundur.
- Paralel veya eşzamanlı yürütmenin önemli olduğu senaryolarda, yan etkiler azaldığında daha güvenli sonuç verir (kaynak).
- Ancak küçük, durumsal (stateful) programlarda veya I/O ağırlıklı kodda pragmatik çözümler (örn. nesne yönelimli yaklaşım) daha uygun olabilir.
Yaygın Tuzaklar ve İpuçları
- Okunabilirlik: Reduce ve derin lambda zincirleri kodun okunabilirliğini düşürebilir; basit durumlarda açık döngüler veya yerleşik fonksiyonlar tercih edin.
- Büyük veri kopyaları: İmmutability yarattığı kopyalama maliyeti nedeniyle bellek kullanımı artabilir; gerekiyorsa generator'lar veya streaming yaklaşımlar kullanın.
- Test yazma: Saf fonksiyonlar birim testi yazmayı kolaylaştırır; önce küçük saf fonksiyonlar yazıp sonra bunları bileştirin.
Hızlı Başlangıç Kontrol Listesi
- Fonksiyonları küçük ve tek sorumluluklu yazın.
- Saf fonksiyonlar yazmaya çalışın; yan etkileri ayrı katmanlara izole edin.
- Map/filter/reduce yerine uygun olduğunda list comprehension ve yerleşik fonksiyonları değerlendirin.
- İmmutability için tuple veya kopyalayarak yeni yapı oluşturma yöntemlerini kullanın.
- Birim testleri yazın; saf fonksiyonlar için testler basittir.
Kaynaklar ve ileri okuma
- Fonksiyonel Programlama Nedir? — KodSözlük (temel kavramlar ve faydalar).
- (Pure) Saf Fonksiyon Nedir? — Medium (saf fonksiyon tanımı ve örnekler).
- Python'da Map, Filter ve Reduce — Etem Keskin (Python örnekleri ve açıklamalar).
Sonuç
Fonksiyonel programlama; saf fonksiyonlar, yüksek dereceli fonksiyonlar ve immutability gibi kavramlarla daha öngörülebilir ve test edilebilir kod yazmayı teşvik eder. Python gibi dillerde map, filter ve reduce ile bu yaklaşımı deneyip küçük adımlarla projelerinize uygulayabilirsiniz. İleri seviye kullanımda paralel işleme ve yan etki kontrolü gibi avantajlar elde etmek mümkündür; ancak okunabilirlik ve performans dengelerini göz önünde bulundurmak önemlidir.