DEV Community

Cover image for Python Lambda İfadeleri: Anonim Fonksiyonlar ve Sınırları
Vebende Akademi
Vebende Akademi

Posted on • Edited on

Python Lambda İfadeleri: Anonim Fonksiyonlar ve Sınırları

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
Enter fullscreen mode Exit fullscreen mode

Lambda karşılığı:

kare_al = lambda x: x * x
Enter fullscreen mode Exit fullscreen mode

Kullanımı:

print(kare_al(5))
Enter fullscreen mode Exit fullscreen mode

Çıktı:

25
Enter fullscreen mode Exit fullscreen mode

Burada dikkat edilmesi gereken nokta, fonksiyonun herhangi bir isimle tanımlanmadan oluşturulabilmesidir.


Lambda Sözdizimi

Genel yapı:

lambda parametreler: ifade
Enter fullscreen mode Exit fullscreen mode

Örnek:

lambda x: x + 10
Enter fullscreen mode Exit fullscreen mode

Bu ifade aslında aşağıdaki fonksiyonun kısa halidir:

def fonksiyon(x):
    return x + 10
Enter fullscreen mode Exit fullscreen mode

Birden Fazla Parametre Kullanımı

Lambda fonksiyonları birden fazla parametre alabilir.

topla = lambda a, b: a + b

print(topla(10, 20))
Enter fullscreen mode Exit fullscreen mode

Çıktı:

30
Enter fullscreen mode Exit fullscreen mode

Üç parametre:

hacim = lambda en, boy, yukseklik: en * boy * yukseklik

print(hacim(3, 4, 5))
Enter fullscreen mode Exit fullscreen mode

Çıktı:

60
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

Lambda karşılığı:

cift_mi = lambda sayi: "Çift" if sayi % 2 == 0 else "Tek"

print(cift_mi(8))
print(cift_mi(7))
Enter fullscreen mode Exit fullscreen mode

Çıktı:

Çift
Tek
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Çıktı:

[
 ('Mehmet', 60),
 ('Ali', 75),
 ('Zeynep', 85),
 ('Ayşe', 95)
]
Enter fullscreen mode Exit fullscreen mode

Ters Sıralama

sonuc = sorted(
    ogrenciler,
    key=lambda ogrenci: ogrenci[1],
    reverse=True
)

print(sonuc)
Enter fullscreen mode Exit fullscreen mode

Çıktı:

[
 ('Ayşe', 95),
 ('Zeynep', 85),
 ('Ali', 75),
 ('Mehmet', 60)
]
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Çıktı:

[2, 4, 6, 8, 10]
Enter fullscreen mode Exit fullscreen mode

Metinleri Büyük Harfe Çevirme

isimler = ["ali", "ayşe", "mehmet"]

sonuc = list(
    map(
        lambda isim: isim.upper(),
        isimler
    )
)

print(sonuc)
Enter fullscreen mode Exit fullscreen mode

Çıktı:

['ALI', 'AYŞE', 'MEHMET']
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Çıktı:

[2, 4, 6, 8, 10]
Enter fullscreen mode Exit fullscreen mode

18 Yaş Üstünü Filtreleme

yaslar = [15, 22, 17, 30, 18, 12]

yetiskinler = list(
    filter(
        lambda yas: yas >= 18,
        yaslar
    )
)

print(yetiskinler)
Enter fullscreen mode Exit fullscreen mode

Çıktı:

[22, 30, 18]
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Çıktı:

15
Enter fullscreen mode Exit fullscreen mode

Çarpım Hesaplama

from functools import reduce

sayilar = [1,2,3,4]

sonuc = reduce(
    lambda x, y: x * y,
    sayilar
)

print(sonuc)
Enter fullscreen mode Exit fullscreen mode

Çıktı:

24
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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
    )
)
Enter fullscreen mode Exit fullscreen mode

List comprehension ile:

sonuc = [x * 2 for x in sayilar]
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Lambda içinde:

  • Döngü
  • Atama
  • Çok satırlı işlem
  • try/except

kullanılamaz.


2. Dokümantasyon Zordur

hesapla = lambda x: x * x
Enter fullscreen mode Exit fullscreen mode

yerine

def hesapla(x):
    """
    Sayının karesini döndürür.
    """
    return x * x
Enter fullscreen mode Exit fullscreen mode

daha açıklayıcıdır.


3. Debug İşlemleri Daha Zordur

Bir hata oluştuğunda:

<lambda>
Enter fullscreen mode Exit fullscreen mode

ş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
)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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))
Enter fullscreen mode Exit fullscreen mode

C#:

Func<int, int> kare = x => x * x;

Console.WriteLine(kare(5));
Enter fullscreen mode Exit fullscreen mode

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 def fonksiyonu yazmanız gerekiyordur.

Top comments (0)