Menu

Python Lambda: Anonim Fonksiyonlar, sort key ve map/filter

Lambda nedir, ne işe yarar, hayatını gerçekten kazandığı birkaç yer — ve ne zaman yerine isimli bir fonksiyon yazmalısın.

İ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:

main.py
Output
Click Run to see the output here.

İ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>, bir def'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:

main.py
Output
Click Run to see the output here.

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:

main.py
Output
Click Run to see the output here.

Ama üçlü ifadeyi kullanabilirsin:

main.py
Output
Click Run to see the output here.

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:

main.py
Output
Click Run to see the output here.

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:

main.py
Output
Click Run to see the output here.

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:

main.py
Output
Click Run to see the output here.

min, max, filter, map

Benzer hikaye — hepsi isteğe bağlı bir fonksiyon argümanı kabul eder:

main.py
Output
Click Run to see the output here.

map ve filter için list comprehension genelde daha da nettir:

main.py
Output
Click Run to see the output here.

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:

main.py
Output
Click Run to see the output here.

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:

  1. Mantık tek bir ifadeye düzgünce sığmıyor.
  2. İsim okunabilirliğe yardım edeceği için fonksiyona isim vermek istiyorsun.
  3. Aynı mantığı birden fazla yerde kullanacaksın.
  4. 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.

Coddy ile kodlamayı öğren

BAŞLA