Python lambda: Anonim Fonksiyon, map, filter ve sıralama
Beceri rehberi

Python lambda: Anonim Fonksiyon, map, filter ve sıralama

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Tek ifadelik küçük fonksiyonları lambda ile nasıl yazacağınızı, map, filter ve sorted ile nasıl birleştireceğinizi ve ne zaman normal def fonksiyonunun daha doğru olduğunu görürsünüz.

Bir bakışta

  1. lambda, adsız ve tek ifadelik küçük bir fonksiyondur. Python belgelerine göre lambda sözdizimsel olarak tek bir ifadeyle sınırlıdır.
  2. Asıl kullanımı, başka bir fonksiyona argüman olarak verilmesidir. sorted, map ve filter gibi işlevler davranışı bir fonksiyon olarak alır.
  3. sorted ve sort, key= ile sıralama ölçütünü lambda'dan alır. Nesneleri bir alanına göre sıralamak lambda'nın en yaygın kullanımıdır.
  4. map dönüştürür, filter eler. İkisi de bir yineleyici verir; listeye çevirmek için list kullanılır.
  5. Karmaşıklaşan lambda yerine def yazın. Ad, docstring ve çok satırlı gövde gerektiğinde lambda okunurluğu bozar.

lambda nedir, nasıl yazılır

Python belgelerine göre küçük anonim fonksiyonlar lambda anahtar sözcüğüyle oluşturulur. lambda önce parametreleri, iki nokta üst üste işaretinden sonra da döndürülecek tek ifadeyi alır; return yazmanız gerekmez, ifadenin sonucu döndürülür.

kare = lambda x: x * x

def kare_def(x): return x * x

İki tanım aynı işi yapar. Belgeler lambda'yı normal bir fonksiyon tanımının sözdizimsel kısayolu olarak niteler ve tek bir ifadeyle sınırlandığını belirtir. Bu sınır önemlidir: lambda içine atama, döngü ya da birden çok satır yazamazsınız.

Birden çok parametre virgülle ayrılır:

topla = lambda a, b: a + b

lambda'nın asıl gücü, ona bir ad vermeden, ihtiyaç duyulan yerde yazılabilmesidir. Yukarıdaki gibi bir değişkene atamak lambda'nın amacını boşa çıkarır; adıyla kullanacaksanız def daha doğru olur.

sorted ve sort ile key kullanımı

lambda'nın en yaygın kullanımı sıralama ölçütünü vermektir. sorted ve liste metodu sort, key parametresiyle her öğeden sıralama değerini çıkaran bir fonksiyon alır. Python belgelerinin örneği, çiftlerden oluşan bir listeyi ikinci öğeye göre sıralamak için lambda kullanır.

urunler = [{'ad': 'Kalem', 'fiyat': a}, {'ad': 'Defter', 'fiyat': b}]

fiyata_gore = sorted(urunler, key=lambda urun: urun['fiyat']) ada_gore = sorted(urunler, key=lambda urun: urun['ad']) ters_sirali = sorted(urunler, key=lambda urun: urun['fiyat'], reverse=True)

sorted yeni bir liste döndürür, orijinali değiştirmez. sort ise listeyi yerinde sıralar ve None döndürür; bu yüzden urunler = urunler.sort(...) yazmayın. İkisi de key ve reverse parametrelerini kabul eder.

Birden fazla ölçüte göre sıralamak için lambda bir demet döndürebilir:

sirali = sorted(kisiler, key=lambda kisi: (kisi['sehir'], kisi['ad']))

Bu, önce şehre göre, aynı şehirdekileri ada göre sıralar.

map ve filter ile liste dönüştürme

map, bir fonksiyonu bir koleksiyonun her öğesine uygular. filter ise fonksiyonun doğru döndürdüğü öğeleri tutar. İkisi de listeyi değil, öğeleri gerektikçe veren bir yineleyici döndürür; sonucu liste olarak görmek istiyorsanız list ile sarmalayın.

sayilar = [a, b, c]

kareler = list(map(lambda x: x * x, sayilar)) buyukler = list(filter(lambda x: x > esik, sayilar)) basi_a_olanlar = list(filter(lambda ad: ad.startswith('A'), adlar))

Bu üç satırda map her sayının karesini, filter eşikten büyük olanları ve ikinci filter harfi A ile başlayan adları verir.

Aynı işleri liste üreteci ile de yazabilirsiniz: [x * x for x in sayilar] ve [x for x in sayilar if x > esik]. Birçok Python geliştiricisi bu yazımı daha okunaklı bulur, özellikle işlem lambda gerektirecek kadar küçük değilse. Önceden tanımlı bir fonksiyonunuz varsa map(fonksiyon, koleksiyon) lambda'ya gerek bırakmadan da kullanılır.

Dış değişkenleri kullanan lambda

lambda, tanımlandığı yerin çevresindeki değişkenleri okuyabilir. Bu sayede aynı kalıptan farklı davranışlı küçük fonksiyonlar üretmek mümkün olur:

def carpan_uret(katsayi): return lambda x: x * katsayi

carpan = carpan_uret(katsayi_degeri) sonuc = carpan(deger)

carpan_uret her çağrıldığında, verilen katsayıyı hatırlayan yeni bir fonksiyon döndürür. Bu kalıp, filtre eşiğini ya da dönüştürme oranını dışarıdan ayarlanabilir yapmak istediğinizde işe yarar.

Yine de bu tür kullanımda dikkatli olun: lambda dış değişkeni tanım anında değil, çağrıldığı anda okur. Değişken arada değişirse lambda'nın verdiği sonuç da değişir. Bir döngüde birkaç lambda üretiyorsanız hepsi döngünün son değerini görebilir. Bunu önlemek için değeri varsayılan parametre olarak verin ya da def kullanın.

Sıralama anahtarı olarak kullanılan lambda'lar çoğunlukla dış değişkene ihtiyaç duymaz; dış değişken gerekiyorsa bu davranış hata ayıklamayı zorlaştırabilir, o yüzden gereksiz yere kullanmayın.

lambda mı def mi

lambda küçük bir kolaylıktır, her yerde def'in yerini almaz. Ölçüt basittir: işlem tek ifadeyse, bir kez ve yerinde kullanılacaksa lambda; adı, açıklaması ya da birden çok satırı gerekiyorsa def.

lambda'ya geçmeden önce kendinize şunu sorun: bu fonksiyonu başka bir yerde de kullanacak mıyım? Cevap evet ise ona bir ad verin ve def ile tanımlayın. Hata mesajlarında lambda'lar adsız göründüğü için ayıklama da zorlaşır.

Karmaşık ifadelerde lambda içine iç içe koşul ve hesaplamalar sıkıştırmak okunmaz kod üretir. Tek satıra sığıyor ama anlaşılmıyorsa lambda'dan vazgeçin.

Bir ayrıntı daha: bir döngüde lambda tanımlayıp sonra çağırıyorsanız, lambda'nın döngü değişkenini tanım anında değil çağrıldığı anda okuduğunu unutmayın. Bu, sık rastlanan şaşırtıcı sonuçlara yol açar; gerekiyorsa değişkeni varsayılan parametre olarak verin ya da def kullanın.

Şekil 1

Küçük ve tek seferlikse lambda, değilse def

Yazdığınız fonksiyon nasıl kullanılacak?
  1. Tek ifade, tek yerde, başka fonksiyona argüman olaraklambdasorted, map, filter için uygun.
  2. Birden çok yerde ya da adıyla çağrılacakdefAd, docstring ve test edilebilirlik kazanırsınız.
  3. Birden çok satır, döngü ya da atama gerekiyordeflambda yalnız tek ifade kabul eder.
  4. Yalnızca dönüştürme ve eleme yapılıyorliste üreteciÇoğu zaman map ve filter'dan okunaklıdır.
Kaynak: sayfa içeriğiMindset Institute

Sık yapılan hatalar

  • lambda'ya bir değişken adı vermek: bu def'in daha okunaklı yaptığı işi gereksiz yere lambda ile yapmaktır.
  • lambda içinde birden çok ifade yazmaya çalışmak: yalnız tek ifade kabul eder, atama ve döngü yazılamaz.
  • sort sonucunu bir değişkene atamak: sort listeyi yerinde sıralar ve None döndürür.
  • map ve filter sonucunu liste sanmak: yineleyici bir kez gezilir; tekrar kullanmak için list ile listeye çevirin.
  • Aşırı sıkıştırmak: tek satırda üç dönüşüm yapan lambda yazılır ama kimse okuyamaz.
  • Döngü içinde lambda üretip değişkenin sonradan değiştiğini fark etmemek.

Bu beceriyi Mindset programlarında nerede çalışırsınız

Python ile Programlama Eğitimi, Fonksiyonlar modülünde fonksiyon yazımını ve ardından veri yapılarını işler; lambda, map ve filter bu temelin üzerine oturur. Veri sıralama ve dönüştürme işi yapan analistler ve otomasyon betikleri yazanlar için lambda, günlük kodda sık karşılaşılan bir kalıptır.

İlgili Mindset programı

Python ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

lambda ile def arasındaki fark nedir?

İşlevsel olarak ikisi de fonksiyon üretir. Python belgelerine göre lambda normal fonksiyon tanımının sözdizimsel kısayoludur ve tek ifadeyle sınırlıdır. def bir ad, docstring ve çok satırlı gövde verir. Küçük ve tek seferlik işlerde lambda, geri kalanında def seçilir.

lambda içinde if kullanılabilir mi?

Deyim olarak if kullanılamaz, ama tek satırlık koşullu ifade kullanılır: lambda x: 'yüksek' if x > esik else 'düşük'. Koşul karmaşıklaşırsa ya da birden çok dal gerekirse lambda yerine adı ve docstring'i olan bir def fonksiyonu yazın.

map ve filter yerine liste üreteci kullanabilir miyim?

Evet, çoğu durumda. Liste üreteci aynı dönüştürme ve eleme işini lambda olmadan, genellikle daha okunaklı yazar. Elinizde hazır bir fonksiyon varsa map(fonksiyon, koleksiyon) de temiz bir seçenektir; yeni bir lambda yazmak yerine mevcut fonksiyonu kullanın.

sorted ile sort arasında hangisini kullanmalıyım?

Orijinal listeyi korumak istiyorsanız sorted, bellekte yerinde sıralamak ve orijinali değiştirmek istiyorsanız sort kullanın. sorted her yinelenebilir nesneyle çalışır; sort yalnız listelerde vardır ve None döndürür, bu yüzden sonucunu bir değişkene atamayın.

Python lambda ile Excel LAMBDA aynı şey mi?

Hayır. Aynı sözcüğü paylaşsalar da Python lambda'sı bir programlama dili özelliğidir; Excel LAMBDA ise elektronik tabloda özel fonksiyon tanımlamak için kullanılır. İki yapının sözdizimi, kapsamı ve kullanım alanı farklıdır, birini diğerine çevirmeye çalışmayın.

Python lambda Kullanımı: map, filter ve sorted