Python Lambda İfadeleri: Anonim Fonksiyonlar ve Sınırları
Python programlama dilinde kod yazarken bazen yalnızca bir kez kullanılacak küçük fonksiyonlara ihtiyaç duyarız. Bu tür durumlarda klasik def anahtar kelimesiyle fonksiyon tanımlamak yerine daha kısa ve pratik bir yöntem olan lambda ifadeleri kullanılabilir.
Lambda ifadeleri Python'ın fonksiyonel programlama yaklaşımını destekleyen güçlü araçlarından biridir. Ancak birçok geliştirici lambda kullanımında aşırıya kaçmakta veya okunabilirliği düşüren yapılar oluşturmaktadır. Bu nedenle lambda ifadelerinin ne zaman kullanılacağını ve ne zaman kullanılmaması gerektiğini anlamak oldukça önemlidir.
Lambda Nedir?
Lambda, isimsiz (anonymous) fonksiyon oluşturmak için kullanılan özel bir ifadedir.
Normal fonksiyon:
def kare_al(x):
return x * x
Lambda karşılığı:
kare_al = lambda x: x * x
Kullanımı:
print(kare_al(5))
Çıktı:
25
Burada dikkat edilmesi gereken nokta, fonksiyonun herhangi bir isimle tanımlanmadan oluşturulabilmesidir.
Lambda Sözdizimi
Genel yapı:
lambda parametreler: ifade
Örnek:
lambda x: x + 10
Bu ifade aslında aşağıdaki fonksiyonun kısa halidir:
def fonksiyon(x):
return x + 10
Birden Fazla Parametre Kullanımı
Lambda fonksiyonları birden fazla parametre alabilir.
topla = lambda a, b: a + b
print(topla(10, 20))
Çıktı:
30
Üç parametre:
hacim = lambda en, boy, yukseklik: en * boy * yukseklik
print(hacim(3, 4, 5))
Çıktı:
60
Lambda ile Koşullu İfadeler
Lambda içerisinde tek satırlık koşullar kullanılabilir.
Normal fonksiyon:
def cift_mi(sayi):
if sayi % 2 == 0:
return "Çift"
else:
return "Tek"
Lambda karşılığı:
cift_mi = lambda sayi: "Çift" if sayi % 2 == 0 else "Tek"
print(cift_mi(8))
print(cift_mi(7))
Çıktı:
Çift
Tek
Lambda ve sorted()
Lambda'nın en yaygın kullanım alanlarından biri sıralama işlemleridir.
Basit Liste Sıralama
sayilar = [5, 2, 8, 1, 9]
sirali = sorted(sayilar)
print(sirali)
Karmaşık Veri Yapılarını Sıralama
Öğrencileri nota göre sıralayalım:
ogrenciler = [
("Ali", 75),
("Ayşe", 95),
("Mehmet", 60),
("Zeynep", 85)
]
sonuc = sorted(
ogrenciler,
key=lambda ogrenci: ogrenci[1]
)
print(sonuc)
Çıktı:
[
('Mehmet', 60),
('Ali', 75),
('Zeynep', 85),
('Ayşe', 95)
]
Ters Sıralama
sonuc = sorted(
ogrenciler,
key=lambda ogrenci: ogrenci[1],
reverse=True
)
print(sonuc)
Çıktı:
[
('Ayşe', 95),
('Zeynep', 85),
('Ali', 75),
('Mehmet', 60)
]
Lambda ve map()
map() fonksiyonu bir koleksiyonun tüm elemanlarına belirli bir işlemi uygular.
Örnek:
sayilar = [1, 2, 3, 4, 5]
sonuc = list(
map(
lambda x: x * 2,
sayilar
)
)
print(sonuc)
Çıktı:
[2, 4, 6, 8, 10]
Metinleri Büyük Harfe Çevirme
isimler = ["ali", "ayşe", "mehmet"]
sonuc = list(
map(
lambda isim: isim.upper(),
isimler
)
)
print(sonuc)
Çıktı:
['ALI', 'AYŞE', 'MEHMET']
Lambda ve filter()
Belirli bir koşulu sağlayan elemanları filtrelemek için kullanılır.
sayilar = [1,2,3,4,5,6,7,8,9,10]
ciftler = list(
filter(
lambda x: x % 2 == 0,
sayilar
)
)
print(ciftler)
Çıktı:
[2, 4, 6, 8, 10]
18 Yaş Üstünü Filtreleme
yaslar = [15, 22, 17, 30, 18, 12]
yetiskinler = list(
filter(
lambda yas: yas >= 18,
yaslar
)
)
print(yetiskinler)
Çıktı:
[22, 30, 18]
Lambda ve reduce()
reduce() fonksiyonu koleksiyon elemanlarını tek bir sonuca indirger.
from functools import reduce
sayilar = [1,2,3,4,5]
toplam = reduce(
lambda x, y: x + y,
sayilar
)
print(toplam)
Çıktı:
15
Çarpım Hesaplama
from functools import reduce
sayilar = [1,2,3,4]
sonuc = reduce(
lambda x, y: x * y,
sayilar
)
print(sonuc)
Çıktı:
24
Lambda ve Dictionary İşlemleri
Sözlüklerde belirli alanlara göre sıralama yapmak oldukça yaygındır.
urunler = [
{"ad": "Laptop", "fiyat": 45000},
{"ad": "Tablet", "fiyat": 12000},
{"ad": "Telefon", "fiyat": 30000}
]
sonuc = sorted(
urunler,
key=lambda urun: urun["fiyat"]
)
print(sonuc)
Lambda ve Çoklu Anahtar Sıralama
kisiler = [
("Ali", "Yazılım"),
("Ayşe", "Muhasebe"),
("Ali", "Finans"),
("Mehmet", "Yazılım")
]
sonuc = sorted(
kisiler,
key=lambda x: (x[0], x[1])
)
print(sonuc)
Burada önce isim, sonra departman baz alınmaktadır.
Lambda ve List Comprehension Karşılaştırması
Lambda ile:
sonuc = list(
map(
lambda x: x * 2,
sayilar
)
)
List comprehension ile:
sonuc = [x * 2 for x in sayilar]
Python topluluğu genellikle ikinci yaklaşımı daha okunabilir bulmaktadır.
Lambda'nın Sınırları
Lambda ifadelerinin bazı önemli kısıtları vardır.
1. Sadece Tek İfade Kullanılabilir
Geçersiz:
lambda x:
y = x * 2
return y
Lambda içinde:
- Döngü
- Atama
- Çok satırlı işlem
- try/except
kullanılamaz.
2. Dokümantasyon Zordur
hesapla = lambda x: x * x
yerine
def hesapla(x):
"""
Sayının karesini döndürür.
"""
return x * x
daha açıklayıcıdır.
3. Debug İşlemleri Daha Zordur
Bir hata oluştuğunda:
<lambda>
şeklinde görünür.
Normal fonksiyonlarda ise fonksiyon ismi görünür.
4. Okunabilirlik Problemleri
Kötü örnek:
sonuc = lambda a,b,c,d,e: (
a+b if a>b else c*d if d>e else e
)
Bunu anlamak oldukça zordur.
Daha doğru yaklaşım:
def hesapla(a, b, c, d, e):
if a > b:
return a + b
if d > e:
return c * d
return e
Python Geliştiricileri İçin Genel Kural
Aşağıdaki durumlarda lambda kullanın:
- Basit dönüşümler
- map()
- filter()
- sorted()
- key parametreleri
- Kısa callback işlemleri
Aşağıdaki durumlarda normal fonksiyon kullanın:
- Birden fazla işlem varsa
- Karmaşık iş kuralları varsa
- Hata yönetimi gerekiyorsa
- Test edilebilirlik önemliyse
- Dokümantasyon gerekiyorsa
Python ve C# Karşılaştırması
Python:
kare = lambda x: x * x
print(kare(5))
C#:
Func<int, int> kare = x => x * x;
Console.WriteLine(kare(5));
Python lambda ve C# lambda ifadeleri benzer görünse de C# tarafında LINQ ekosistemi ile çok daha yoğun kullanılmaktadır.
Sonuç
Lambda ifadeleri Python'un en zarif özelliklerinden biridir. Özellikle sorted(), map(), filter() ve reduce() gibi fonksiyonlarla birlikte kullanıldığında kod miktarını ciddi şekilde azaltabilir. Ancak lambda'nın amacı küçük ve tek satırlık işlemler gerçekleştirmektir. Kod büyümeye başladığında veya iş mantığı karmaşıklaştığında normal fonksiyonlara geçmek okunabilirlik, bakım kolaylığı ve hata ayıklama açısından çok daha doğru bir yaklaşım olacaktır.
Deneyimli Python geliştiricilerinin genel yaklaşımı şu şekildedir:
Eğer lambda ifadesini açıklamak zorunda kalıyorsanız, büyük ihtimalle normal bir
deffonksiyonu yazmanız gerekiyordur.
Top comments (0)