Python’da lambda fonksiyonu, tek bir ifadeden oluşan, kendisine isim vermeden tanımlanan küçük bir fonksiyondur. Genellikle başka bir fonksiyona argüman olarak verilir; burada argüman, bir fonksiyon çağrılırken fonksiyona gönderilen değerdir. Lambda kullanımı özellikle map, filter, sorted, max ve min gibi fonksiyonlarda kısa işlemleri belirtmek için uygundur.
Lambda yazarken önce parametreler, ardından iki nokta ve tek bir ifade gelir. İfade, çalıştırıldığında bir değer üreten kod parçasıdır. Lambda fonksiyonu bu ifadenin sonucunu otomatik olarak döndürür, bu nedenle gövdesinde ayrıca return yazılmaz.
Python’da lambda nasıl yazılır?
Lambda söz dizimi lambda parametreler: ifade biçimindedir. Parametreler fonksiyonun kullanacağı girdileri, ifade ise bu girdilerle yapılacak işlemi belirtir. Aşağıdaki örnekte sayi parametresine verilen değer kendisiyle çarpılır.
kare = lambda sayi: sayi * sayi
print(kare(4))
Bu kodun çıktısı 16 olur. kare(4) çağrısındaki 4, lambda fonksiyonuna gönderilen argümandır. Lambda içindeki sayi * sayi ifadesi ise 4 sayısının karesini üretir ve bu sonuç otomatik olarak döndürülür.
Aynı işlem, isim verilmiş bir def fonksiyonuyla da yazılabilir:
def kare_def(sayi):
return sayi * sayi
print(kare_def(4))
Bu kod da 16 çıktısını verir. Lambda biçimi kısa bir işlemi tek yerde kullanacağın zaman pratik olabilir. Fonksiyonun içinde birden fazla adım, koşul, döngü veya açıklanması gereken daha karmaşık bir mantık bulunduğunda def ile isimlendirilmiş bir fonksiyon yazmak kodun okunmasını kolaylaştırır.
map ile öğrenci puanlarına nasıl ekleme yapılır?

map fonksiyonu, bir listedeki her eleman için aynı işlemi uygulamak amacıyla kullanılabilir. Aşağıdaki örnekte öğrencilerin ad ve puan bilgilerini sözlüklerden oluşan bir liste içinde tutuyoruz:
ogrenciler = [
{"ad": "Ada", "puan": 70},
{"ad": "Mert", "puan": 83},
{"ad": "Ece", "puan": 91}
]
yeni_puanlar = list(
map(lambda ogrenci: ogrenci["puan"] + 5, ogrenciler)
)
print(yeni_puanlar)
Çıktı [75, 88, 96] olur. Lambda, her öğrenci sözlüğündeki puan değerini alıp 5 artırır. map işleminin sonucunu liste olarak görmek için sonucu list() ile dönüştürüyoruz.
Aynı puan listesini lambda ve map kullanmadan, liste üreteciyle de oluşturabilirsin:
yeni_puanlar = [
ogrenci["puan"] + 5
for ogrenci in ogrenciler
]
print(yeni_puanlar)
Bu kodun çıktısı yine [75, 88, 96] olur. Liste üreteci, işlemi doğrudan okuduğun için bu tür basit dönüşümlerde daha anlaşılır gelebilir. Her iki yöntemde de ogrenciler listesindeki sözlükler değiştirilmez; yalnızca mevcut puanlardan hesaplanan yeni bir liste oluşturulur. Örneğin ilk öğrencinin puanı işlem sonrasında hâlâ 70 olarak kalır.
filter ile belirli puanın üzerindeki öğrenciler nasıl seçilir?
filter ile bir listedeki öğrencileri koşula göre seçebilirsin. Aşağıdaki örnekte lambda, puanı 50'nin kesin olarak üzerinde olan sözlükleri kontrol eder ve list() sonucu yeniden listeye dönüştürür.
ogrenciler = [
{"ad": "Ada", "puan": 72},
{"ad": "Bora", "puan": 50},
{"ad": "Cem", "puan": 85},
{"ad": "Derya", "puan": 43},
{"ad": "Ece", "puan": 85}
]
basarili_ogrenciler = list(
filter(lambda ogrenci: ogrenci["puan"] > 50, ogrenciler)
)
print(basarili_ogrenciler)
Bu kodun çıktısı şöyledir:
[{'ad': 'Ada', 'puan': 72}, {'ad': 'Cem', 'puan': 85}, {'ad': 'Ece', 'puan': 85}]
Buradaki > 50 koşulu, puanın 50'den büyük olmasını ister. Bu nedenle Bora'nın puanı tam olarak 50 olduğu için sonuç listesine eklenmez. 50 puanı da dahil etmek isteseydin >= 50 koşulunu kullanman gerekirdi.
Aynı seçimi liste üreteciyle daha kısa ve okunabilir biçimde yazabilirsin:
basarili_ogrenciler = [
ogrenci for ogrenci in ogrenciler
if ogrenci["puan"] > 50
]
print(basarili_ogrenciler)
İki yaklaşım da aynı sonucu üretir. Koşul basit ve doğrudan olduğunda liste üreteci, özellikle listeyi dönüştürme ya da filtreleme işlemlerinde daha kolay okunabilir.
max ve min içinde key parametresi nasıl kullanılır?

max ve min fonksiyonlarında key parametresi, karşılaştırmanın hangi değere göre yapılacağını belirler. Öğrenci sözlüklerini puanlarına göre karşılaştırmak için key=lambda ogrenci: ogrenci["puan"] yazabilirsin.
en_yuksek_puanli = max(
ogrenciler,
key=lambda ogrenci: ogrenci["puan"]
)
print(en_yuksek_puanli)
Çıktı, en yüksek puana sahip ilk öğrenci sözlüğüdür:
{'ad': 'Cem', 'puan': 85}
En yüksek puanı bulup bu puana sahip tüm öğrencileri liste üreteciyle seçmek istersen iki aşamalı ilerleyebilirsin:
en_yuksek_puan = max(ogrenci["puan"] for ogrenci in ogrenciler)
en_yuksekler = [
ogrenci for ogrenci in ogrenciler
if ogrenci["puan"] == en_yuksek_puan
]
print(en_yuksekler)
Bu kodun çıktısında 85 puanlı iki öğrenci de yer alır:
[{'ad': 'Cem', 'puan': 85}, {'ad': 'Ece', 'puan': 85}]
max eşit puanlar olduğunda listenin ilk eşleşmesini döndürür. Liste üreteci ise eşit olan tüm öğrencileri bulur. En düşük puanı bulmak için aynı ölçütü min ile kullanabilirsin:
en_dusuk_puanli = min(
ogrenciler,
key=lambda ogrenci: ogrenci["puan"]
)
print(en_dusuk_puanli)
Çıktı şöyledir:
{'ad': 'Derya', 'puan': 43}
Liste boş olduğunda max ve min karşılaştıracak bir değer bulamaz ve hata verir. Bu nedenle bu fonksiyonları kullanmadan önce listenin boş olma ihtimalini kontrol etmek gerekir.
Lambda ne zaman def ile değiştirilmelidir?
Lambda, gövdesi tek bir ifadeyle anlatılabildiğinde uygundur; birden fazla işlem adımı, ara değişken veya açıklama gerektiğinde aynı mantığı def ile yazmak daha okunaklıdır. Lambda gövdesi tek bir ifade içerir ve bu ifadenin sonucu otomatik olarak döndürülür.
Bu nedenle lambda içinde return kullanamazsın. lambda x: return x * 2 yazımı söz dizimi hatasına yol açar. Olağan atama deyimleri de lambda gövdesine yazılamaz. Örneğin deger = x * 2 bir deyimdir ve lambda içinde bu biçimde kullanılamaz.
Parantezler, uzun bir ifadenin fiziksel olarak birden fazla satıra yayılmasına izin verebilir. Ancak bu durum lambda içine birden fazla işlem adımı ekleyebileceğin anlamına gelmez.
sonuc = (lambda x: (
(x + 1) * 2
))(4)
print(sonuc)
Bu örnekte ifade birkaç satıra yayılmış olsa da yapılan işlem tek bir hesaplamadır ve çıktı 10 olur. Ara değişken oluşturmak, koşulları ayrı ayrı kontrol etmek veya birkaç deyimi sırayla çalıştırmak gerektiğinde def daha uygun bir yapı sunar.
Bir lambda ifadesini doğrudan bir ada bağlamak yerine def kullanmak, PEP 8 kodlama stili rehberinde de önerilir. İsimlendirilmiş ve tekrar kullanılacak bir fonksiyon için aşağıdaki biçim, hem hata mesajlarında hem de kodu okuyan kişi açısından daha açıklayıcıdır:
def puani_artir(puan):
return puan + 5
Lambda kullanımı, özellikle map, filter veya sorted gibi bir fonksiyona kısa süreli bir işlem vermen gerektiğinde anlamlıdır. İşlem kendi başına isim taşımalı, farklı yerlerde kullanılmalı veya açıklama gerektirecek kadar uzamalıysa def tercih edebilirsin.
Lambda kullanırken sık yapılan hatalar nelerdir?
Lambda kullanırken en sık yapılan hatalar, tek ifadeli yapıyı çok fazla büyütmek, içine return yazmak ve map ile filter sonuçlarını doğrudan liste sanmaktır. Bu hatalar kısa örneklerle kolayca fark edilebilir.
map ve filter çağrıları doğrudan yazdırıldığında elemanların kendisi yerine bu işlemleri temsil eden nesne gösterilebilir. Çıktıda görülebilen adres benzeri bölüm değişebileceği için onu sabit bir sonuç olarak değerlendirmemelisin. Elemanları görmek için sonucu list() ile listeye dönüştürebilirsin.
puanlar = [60, 75, 90]
artirilmis = map(lambda puan: puan + 5, puanlar)
print(list(artirilmis))
Bu kodun çıktısı [65, 80, 95] olur. Benzer biçimde filter sonucunu da list() ile görüntüleyebilirsin. Lambda içine return yazmak yerine döndürmek istediğin ifadeyi doğrudan gövdeye yerleştirmen gerekir.
Bir fonksiyonun adı olacaksa ve aynı işlem tekrar kullanılacaksa def yapısına geçmek kodun okunabilirliğini destekler. Lambda ifadesini büyütmek, kısa yazma amacıyla başladığın kodu takip edilmesi zor bir yapıya dönüştürebilir.
Yazdığın lambda veya onu kullanan işlem için şu kontrolleri uygulayabilirsin:
- İfade farklı ve beklenen girdilerle çalışıyor mu?
- Boş bir liste verildiğinde sonuç nasıl oluşuyor?
- Sıfır, negatif sayı veya eşik değere eşit bir değer doğru işleniyor mu?
mapya dafiltersonucu gerekiyorsalist()ile görüntüleniyor mu?
Python konularındaki temel bilgini ölçmek için ücretsiz Python bilgi testini çözerek lambda, fonksiyonlar ve diğer temel yapıların kullanımını kısa sorularla sınayabilirsin.
Sık Sorulan Sorular
Lambda birden fazla parametre alabilir mi?
Evet, lambda birden fazla parametre alabilir; parametreler virgülle ayrılır. Örneğin lambda a, b: a + b ifadesi iki değeri alıp toplamlarını döndürür.
Lambda içinde koşullu ifade kullanılabilir mi?
Evet, lambda içinde koşullu ifade kullanılabilir. Örneğin lambda puan: "Geçti" if puan >= 50 else "Kaldı" ifadesi puana göre iki farklı sonuç üretir.
map ve filter sonuçları neden doğrudan liste olarak görünmez?
map ve filter sonuçları doğrudan liste olarak görünmez çünkü bu çağrılar işlenebilir nesneler üretir. Elemanları liste biçiminde görmek için sonucu list() ile dönüştürmen gerekir.
Lambda, kısa ve tek adımlı işlemlerde okunaklı bir seçenek sunar. İşlem büyüdüğünde veya tekrar kullanılacak bir fonksiyona dönüştüğünde def kullanmak kodun anlaşılmasını kolaylaştırır.