İsim Vermeye Zahmet Etmediğin Bir Fonksiyon
Python'daki çoğu fonksiyon def ile tanımlanır, ismi vardır ve yeniden kullanılabildiği bir dosyada yaşar. lambda, bunun daha küçük ve isimsiz bir alternatifidir — tam bir fonksiyon tanımlamanın yapılacak işten fazla tören olduğu birkaç durumda kullanışlıdır.
İkisinin görünümü yan yana:
İki fonksiyon, ikisi de tam olarak aynı şeyi yapıyor. Lambda sürümü tek satıra sığıyor çünkü işi temelde bu: geçici bir an için geçici bir fonksiyon.
Söz Dizimi
lambda <parametreler>: <ifade>
<parametreler>, birdef'in kullanacağı parametre listesinin aynısıdır — varsayılanları,*args'ı,**kwargs'ı destekler.<ifade>, değeri geri dönüş değeri olan tek bir ifadedir.
Örnekler:
return anahtar kelimesi yok. İfadenin değeri dolaylı olarak döner.
Tek Sınırlama
Bir lambda yalnızca tek bir ifade içerebilir. İçine deyim koyamazsın:
Ama üçlü ifadeyi kullanabilirsin:
Birden fazla ifadeye ihtiyacın varsa, bu def'e geçmen için bir işarettir.
Lambda'nın Hayatını Gerçekten Kazandığı Yer
Bir değişkene atanan lambda, neredeyse her zaman isimli bir def'ten daha kötüdür:
Bu, def double(x): return x * 2'den kesinlikle daha kötü — okunabilirlik aynı, üstüne lambda sürümü hata ayıklayıcılara stack trace'lerde işe yaramaz <lambda> ismini verir.
Lambda'lar tam olarak bir yerde parlar: yüksek dereceli fonksiyonlara satır içi argüman olarak.
Özel sıralama anahtarları
Klasik durum:
sorted'ın key argümanı, bir öğeyi alıp üzerinden sıralanacak değeri döndüren bir fonksiyon ister. Tek satırlık bir lambda tam yerine oturur — bu kadar ufak bir şey için def kullanmak ağır hissettirirdi.
Bir tuple kullanarak birden fazla alana göre sıralayabilirsin:
min, max, filter, map
Benzer hikaye — hepsi isteğe bağlı bir fonksiyon argümanı kabul eder:
map ve filter için list comprehension genelde daha da nettir:
Bu sebeple çoğu Pythonista map/filter yerine comprehension'a uzanır. lambda, comprehension kısayolunun olmadığı sorted, min ve max için doğal bir seçim olmaya devam eder.
Lambda ve operator
Lambda'nın tek işi "bir anahtar kap" ya da "bir öznitelik kap" ise, Python'un operator modülünde daha hızlı ve daha net alternatifler vardır:
Büyük bir kazanç değil ama operator modülünü zaten içe aktaran kodda biraz daha bildirimsel okunur.
Ne Zaman def'e Geri Dönmeli
Şunlardan herhangi biri doğruysa def yaz:
- Mantık tek bir ifadeye düzgünce sığmıyor.
- İsim okunabilirliğe yardım edeceği için fonksiyona isim vermek istiyorsun.
- Aynı mantığı birden fazla yerde kullanacaksın.
- Fonksiyonun bir docstring'e ihtiyacı var (lambda'lar docstring taşıyamaz).
Unutma: Python satır sayısına göre puanlanmıyor. Üç satırlık isimli bir fonksiyon, mantık önemsiz olmaktan çıktığında neredeyse her zaman tek satırlık bir lambda'dan daha iyi okunur.
Sırada: Decorator'lar
Lambda'lar fonksiyonları değer olarak dolaştırır. Decorator'lar aynı fikri bir adım öteye taşır: herhangi bir fonksiyonu yeniden kullanılabilir davranışla — loglama, süre ölçme, önbelleğe alma, yetkilendirme — sarmana izin verir; hem de üstteki satıra tek bir @ koyarak. Bir sonraki sayfa orası.
Sıkça Sorulan Sorular
Python'da lambda nedir?
lambda, tek satıra yazabildiğin kısa ve anonim bir fonksiyondur. lambda x: x * 2, def double(x): return x * 2 ile eşdeğerdir, sadece ismi yoktur. En çok başka bir fonksiyona argüman olarak küçük bir fonksiyon verirken işe yarar.
Ne zaman def yerine lambda kullanmalıyım?
sorted, max veya filter gibi bir şeye doğrudan geçirdiğin, tek seferlik ve tek ifadelik fonksiyonlar için lambda kullan. Gövdesi tek bir ifadeden uzun olan ya da isim vereceğin her şey için def tercih et. İsimli fonksiyonlar neredeyse her zaman daha nettir.
Lambda'nın sınırları nelerdir?
Bir lambda yalnızca tek bir ifade içerebilir, deyim değil. Atama yok, if blokları yok (ancak a if cond else b üçlü ifadesini kullanabilirsin), çok satırlı mantık yok. Bu sınırlara takılıyorsan def'e geçme vakti.