Tarihçe
Yüksek düzey fonksiyonlar kavramı işlevsel programlamadan gelmekte ve Python'da en başından beri mevcuttur. Daha soyut, esnek ve özlü kodlar yazmayı sağlar.
Sorun
Birçok kişi fonksiyonların birinci sınıf nesne olarak olanaklarını küçümsemektedir. Fonksiyonların yanlış bir şekilde iletilmesi veya döndürülmesi, hatalı çağrılar veya kod okunabilirliğinin kaybolması gibi hatalar ortaya çıkmaktadır.
Çözüm
Python'da fonksiyon tam bir nesnedir. Bir fonksiyonu argüman olarak iletmek, başka fonksiyonlardan döndürmek ve koleksiyonlarda saklamak mümkündür. İşte buna yüksek düzey fonksiyon denir. Bu, genel sarıcılar, geri çağırmalar, dekoratörler ve diğer birçok modelin uygulanmasını sağlar.
Kod örneği:
def apply_function(func, value): return func(value) def square(x): return x * x result = apply_function(square, 5) # 25 dönecek
Anahtar özellikler:
Yüksek düzey fonksiyonlar sadece fonksiyonları değil, aynı zamanda verileri de döndürebilir mi?
Evet, yüksek düzey fonksiyon, bir fonksiyonu argüman olarak alan ve/veya bir fonksiyonu döndüren herhangi bir fonksiyondur. Döndürülen değerle ilgili bir kısıtlama yoktur.
Yerleşik map fonksiyonu, bir jeneratör nesnesi mi yoksa bir liste mi döndürür? (Python 3+)
Python 3'te map, bir jeneratör nesnesi döndürür, bir liste değil. Liste almak için açıkça list(map(...)) ile sarmak gerekir.
squared = map(lambda x: x**2, [1,2,3]) result = list(squared) # Artık [1, 4, 9] alacağız
Fonksiyonları değişkenlere atamak ve koleksiyonlarda saklamak mümkün mü?
Evet, fonksiyonlar değişkenlere atanabilir, listelerde, sözlüklerde saklanabilir ve argümanlar aracılığıyla değerler olarak geçirilebilir. Bunlar, Python'daki sıradan nesnelerdir.
def greet(): print('Hello') a = greet a() # greet'i çağıracaktır
Yüksek düzey fonksiyonlar olmadan birkaç fonksiyon için günlük tutmaya çalışmak, her bir işleyicide kodun tekrarına ve hatalara yol açtı.
Artılar:
Eksiler:
Evrensel bir günlükleyici dekoratörü tanıttık - tüm fonksiyonlar tutarlı bir şekilde güncellenmeye başladı, kod daha temiz hale geldi.
Artılar:
Eksiler: