Python Lambda İşlevleri: Söz Dizimi, Gerçek Kullanımlar ve Ne Zaman Kullanılmaması Gerektiği

  1. Ana sayfa
  2. Blog
  3. Yazılım Geliştirme

Yazılım Geliştirme

Python Lambda İşlevleri: Sözdizimi, Gerçek Kullanımlar ve Ne Zaman Kullanılmaması Gerektiği

Lambda, tam ihtiyacınız olan yere, tek bir satıra yazabileceğiniz küçük bir fonksiyondur. Sözdizimini, lambdaların gerçekten yardımcı olduğu yerleri, deneyimli geliştiricileri yakalayan tuzağı ve normal bir işlevin ne zaman daha iyi olduğunu öğrenin.

8 dk okuma
Python lambda fonksiyonları: sözdizimi, gerçek kullanımlar ve ne zaman kullanılmaması gerektiği

Önemli noktalar

  • lambda, tek bir ifadeyle sınırlı, anonim bir işlevdir.
  • En iyi kullanımı kısa bir argümandır, özellikle de sorted, min ve max için key‘dir.
  • Bir listenin anlaşılması genellikle lambda ile map veya filter‘den daha açıktır.
  • Bir isme lambda atarsanız bunun yerine def yazın.

Ürünleri fiyata göre sıralamanız gerekiyor. Sadece “fiyatı kullan” demek için ayrı bir adlandırılmış işlev yazmak çok fazla tören gibi geliyor. Python lambda işlevleri, o küçük mantık parçasını tam olarak kullandığınız yerde satır içi tanımlamanıza olanak tanır.

Lambdalar kullanışlıdır ancak aşırı kullanımı da kolaydır. Bu kılavuz, bunların gerçekten nerede yardımcı olduklarını ve kodun okunmasını nerede zorlaştırdıklarını gösterir. Her örneği Python 3.13’te çalıştırdık ve gösterilen çıktı bu çalıştırmadan geliyor.

Lambda nedir?

Lambda, lambda anahtar sözcüğüyle yazılan, adı olmayan bir işlevdir:

lambda arguments: expression

Herhangi bir sayıda argüman alır ve otomatik olarak tek bir ifadenin değerini döndürür. return anahtar sözcüğü ve ifadelerin tamamı yoktur.

square = lambda x: x * x
print(square(4))                     # 16

print((lambda a, b=10: a + b)(5))    # 15

İkinci satır, varsayılan argümanla bir lambdayı tanımlar ve onu hemen çağırır. Bunu nadiren gerçek kodla yazarsınız, ancak bu lambda’nın sıradan bir işlev nesnesi olduğunu gösterir.

lambda vs def

Bu ikisi aynı şekilde davranan işlevler üretir:

square = lambda x: x * x

def square_def(x):
    return x * x

print(square(4), square_def(4))                 # 16 16
print(square.__name__, square_def.__name__)     # <lambda> square_def

İsimlere bakın. Her lambda yalnızca <lambda> olarak adlandırılır, dolayısıyla hata mesajları ve günlükler hangisinin başarısız olduğunu size söyleyemez. PEP 8 gibi stil kılavuzlarının, bir işleve ad vermek istediğinizde bir def önermesinin ana nedeni budur.

Özellik lambda kesinlikle
İsim İsimsiz Adlandırılmış
Vücut Bir ifade Herhangi bir sayıda ifade
Dönüş Örtülü Açık return
Doküman dizesi ve yazım ipuçları Desteklenmiyor Destekleniyor
Okunabilir geri izlemeler Gösterir <lambda> İsmi gösterir
Şunun için en iyisi: Kısa atılabilir argümanlar Diğer her şey

Anahtarla sıralama: en iyi kullanım

sorted, min ve max gibi işlevler, neyin karşılaştırılacağına karar veren bir key işlevini kabul eder. Lambdaların parladığı yer burası:

products = [("pen", 10), ("bag", 900), ("book", 250)]

sorted(products, key=lambda p: p[1])
# [('pen', 10), ('book', 250), ('bag', 900)]

max(products, key=lambda p: p[1])
# ('bag', 900)

Birkaç şeye göre sıralamak için bir tuple döndürün. Burada insanlar yaşa göre, önce en yaşlı, sonra isme göre sıralanır:

people = [{"name": "Asha", "age": 31}, {"name": "Ben", "age": 25},
          {"name": "Dev", "age": 31}]

[p["name"] for p in sorted(people, key=lambda p: (-p["age"], p["name"]))]
# ['Asha', 'Dev', 'Ben']

Eksi işareti yalnızca sayının sırasını tersine çevirir. Bazen lambdaya hiç ihtiyacınız olmaz çünkü mevcut bir fonksiyon bu işi zaten yapıyor. Varsayılan sıralamayı büyük/küçük harfe duyarlı olmayan bir sıralamayla karşılaştırın:

names = ["Asha", "ben", "Chitra", "dev"]

sorted(names)                  # ['Asha', 'Chitra', 'ben', 'dev']
sorted(names, key=str.lower)   # ['Asha', 'ben', 'Chitra', 'dev']

Varsayılan, tüm büyük harfli sözcükleri ilk sıraya koyar. str.lower‘i geçmek bunu herhangi bir lambda olmadan düzeltir. operator modülü, lambda p: p[1] için itemgetter(1) gibi benzer yardımcılar sunar.

harita ve filtre

map her öğeye bir işlev uygular ve filter doğru döndürdüğü öğeleri korur. Her ikisi de lambdalarla çalışır, ancak her birini bir liste anlayışıyla karşılaştırın:

nums = [1, 2, 3, 4, 5, 6]

list(map(lambda n: n * 10, nums))      # [10, 20, 30, 40, 50, 60]
[n * 10 for n in nums]                 # [10, 20, 30, 40, 50, 60]

list(filter(lambda n: n % 2 == 0, nums))   # [2, 4, 6]
[n for n in nums if n % 2 == 0]            # [2, 4, 6]

Sonuçlar aynıdır ve çoğu Python geliştiricisi, anlamaların okunmasının daha kolay olduğunu düşünmektedir. Ayrıca map ve filter‘nin tembel yineleyiciler döndürdüğüne dikkat edin, dolayısıyla değerleri görmek için list()‘e ihtiyacınız var. Python listesini anlama kılavuzumuz bu stili derinlemesine ele alıyor. map, map(str.strip, lines)‘da olduğu gibi mevcut bir adlandırılmış işlevle hala iyi okunuyor.

azaltmak

functools.reduce öğeleri tek bir değerde birleştirerek devam eden bir sonuç taşır:

from functools import reduce

reduce(lambda acc, n: acc + n, nums, 0)   # 21
sum(nums)                                 # 21

Toplamlar gibi genel işler için sum, max veya any gibi bir yerleşik kullanın. Daha nadir durumlar için reduce‘ü saklayın ve lambda karmaşık görünmeye başlarsa düz bir döngü düşünün.

Lambda’daki koşullar

Bir lambdada if ifadesini kullanamazsınız ancak koşullu bir ifade kullanabilirsiniz:

label = lambda total: "large" if total >= 1000 else "small"

label(1200), label(300)
# ('large', 'small')

Bir şart iyidir. Bunları bir kez iç içe yerleştirmeye başladığınızda, okuyucuların çok çalışması gerekir; bu da sıradan if ifadeleriyle def‘e geçmenin açık bir işaretidir.

İşlevleri döndüren Lambdalar

Bir işlev, çevresinden bir değeri hatırlayan bir lambda oluşturabilir ve döndürebilir:

def multiplier(n):
    return lambda x: x * n

double = multiplier(2)
double(7)   # 14

Bu, JavaScript kapatmaları hakkındaki makalemizde farklı bir dilde açıklandığı gibi kapatmalar nedeniyle işe yarar. Python’un functools.partial argümanları önceden doldurmanın başka bir yolunu sunar.

Geç bağlanma tuzağı

Bu, sonunda neredeyse herkesi yakalar. Her birinin kendi numarasını döndürmesini bekleyerek bir döngüde üç lambda oluşturduk:

funcs = [lambda: i for i in range(3)]
[f() for f in funcs]

# [2, 2, 2]

Üçü de 2 değerini döndürür. Bir lambda, oluşturulduğunda i‘nin değerini yakalamaz. Değişkeni çağrıldığında arar ve o zamana kadar döngü biter, i‘ü 2’de bırakır. Varsayılan çözüm, değeri varsayılan argüman olarak yakalamaktır, çünkü varsayılanlar tanım zamanında değerlendirilir:

funcs = [lambda i=i: i for i in range(3)]
[f() for f in funcs]

# [0, 1, 2]

Bir döngü içindeki def aynı şekilde davrandığından, bu lambdalara özgü değildir. Lambda’larda daha sık görülür, çünkü bunlar genellikle düğme geri çağırmaları eklenirken olduğu gibi döngüler halinde oluşturulur.

İpucu: Öğe başına bir işleve ihtiyacınız varsa, çok sayıda işleve ihtiyacınız olup olmadığını düşünün. Genellikle öğeyi argüman olarak alan tek bir işlev daha nettir ve tuzağı tamamen önler.

Küçük işlevlerin arama tabloları

Lambdalar, adları küçük işlemlerle eşleştiren bir sözlüğe tam olarak uyar:

ops = {
    "add": lambda a, b: a + b,
    "sub": lambda a, b: a - b,
}

ops["sub"](10, 3)   # 7

Bu, uzun bir if ve elif zincirinin yerini alabilir. Python sözlüğü kılavuzu daha fazla sözlük modelini kapsamaktadır ve operator modülü zaten operator.add ve operator.sub‘yı sağlamaktadır.

Lambdaların sınırları

  • Yalnızca bir ifade. = ile atama yok, döngü yok ve try blok yok.
  • İfade yok. Testimizin de doğruladığı gibi, lambda x: return x‘yi yazmak SyntaxError ile başarısız oluyor.
  • Doküman dizisi veya tür ipucu yok. Araçlar ve okuyucular daha az yardım alıyor.
  • Daha zor hata ayıklama. Hatalar, yararlı bir ad yerine <lambda>‘yi gösterir.

Lambdalar elbette yine de istisnalar ortaya çıkarabilir. Bunların ele alınması, Python istisna işleme‘de anlatıldığı gibi herhangi bir işlevle aynı şekilde yapılır.

Lambda ne zaman kullanılmamalıdır?

Durum Daha iyi seçim
Bir isme atamak kesinlikle
Mantık birden fazla satıra ihtiyaç duyar kesinlikle
Listeyi dönüştürme veya filtreleme Bir liste anlayışı
Maksimumun toplanması veya bulunması sum, max, min
Bir öğeyi veya özelliği alma operator.itemgetter veya attrgetter
Aynı lambda birkaç yerde görünüyor Test edebileceğiniz adlandırılmış bir işlev

Bu son nokta önemli. Yeniden kullanılmaya değer mantık test edilmeye değerdir ve pytest eğiticimizin gösterdiği gibi adlandırılmış bir işlevin test edilmesi çok daha kolaydır.

Son sözler

İyi bir lambda bir bakışta okunabilecek kadar kısadır ve genellikle bir argüman olarak bir kez kullanılır. Sıralama anahtarları klasik bir örnektir. Kendi kodunuzu kontrol etmek için = lambda‘i arayın ve bunları adlandırılmış işlevlere dönüştürün. Daha sonra herhangi bir map veya filter‘e lambda ile bakın ve bir anlamanın daha iyi okunup okunmadığını görün.

Sık sorulan sorular

Python’da lambda işlevi nedir?

Lambda anahtar sözcüğüyle oluşturulan küçük, anonim bir işlevdir. Argümanları alır ve bir isim veya return ifadesi olmadan tek bir ifadenin değerini döndürür.

Bir Python lambda’nın birden fazla satırı olabilir mi?

Hayır. Lambda tek bir ifadeyle sınırlıdır. Bunu parantez içindeki satırlara bölebilirsiniz, ancak yine de ifadeler içeremez, bu nedenle daha karmaşık mantık için def’i kullanın.

Lambda’da if else kullanabilir miyim?

Lambda x: “büyük”, eğer x > 10 değilse “küçük” gibi koşullu bir ifade kullanabilirsiniz. Blok içeren bir if ifadesine izin verilmez.

Lambdalar normal işlevlerden daha hızlı mıdır?

Anlamlı bir şekilde değil. Her ikisi de aynı türde işlev nesnesi oluşturur. Performans için değil, okunabilirlik için bunlar arasından seçim yapın.

Haritayı lambda ile mi yoksa liste anlayışıyla mı kullanmalıyım?

Çoğu Python geliştiricisi okunabilirlik için liste kavramayı tercih eder. Map(str.strip,lines) gibi adlandırılmış bir fonksiyonunuz zaten varsa, harita mantıklıdır.

Öğrenmeye devam et

Stack Quora ile çalışın

Test, WordPress veya SEO konusunda yardıma mı ihtiyacınız var?

Ekiplerin daha iyi yazılımlar sunmasına ve sitelerini büyütmesine yardımcı oluyoruz. Bize ne üzerinde çalıştığınızı söyleyin, biz de bir sonraki adım için net bir öneride bulunalım.

Okumaya devam et

Daha fazla kılavuz test, yapay zeka ve modern geliştirme

Bu makaleyi beğendiniz mi? Bir konu seçin ve doğrudan en yeni eğitimlerimize geçin.

Yapay zekâ

Yapay Zeka Halüsinasyonları Açıklandı: Dil Modelleri Neden İşleri Düzeltiyor ve Nasıl Azaltılabilir?

Yapay zeka halüsinasyonları açıkladı: ne olduklarını, dil modellerinin bunları neden ürettiğini, yaygın türlerini, temellendirme ve yönlendirmelerle…

Makaleyi okuyun →
DevOps

Açıklanan Ortam Değişkenleri: .env Dosyaları, Sırlar ve Yapılandırma Doğru Yapıldı

Çalıştırdığımız Python örnekleriyle açıklanan ortam değişkenleri: bunları okumak ve ayarlamak, neden her değerin bir dize olduğu, .env dosyaları, sü…

Makaleyi okuyun →
Yazılım geliştirme

API Hız Sınırlamasının Açıklaması: Algoritmalar, Başlıklar ve 429 Hatalarının Ele Alınması

API hızı sınırlaması, çalıştırdığımız bir simülasyonla açıklanmıştır: belirteç kümesi, sabit pencere, kayan pencere, 429 yanıt, hız sınırı başlıklar…

Makaleyi okuyun →
Test otomasyonu

Python'da alay etme: Unittest.mock, patch ve Testleri Yalan Yapan Hatalar

Unittest.mock ile Python'da alay etme, test edildi: Sahte ve dönüş_değeri, yan_etki, bir adın kullanıldığı yerde yama uygulama, spesifikasyon ve oto…

Makaleyi okuyun →
Yazılım testi

Kod Kapsamının Açıklaması: Hat ve Şube Kapsamı ve %100'ün Gerçek Anlamı

Kod kapsamı gerçek bir kapsama.py çalışmasıyla açıklanmıştır: hat, şube ve durum kapsamı, bir raporun okunması, %100 kapsamın neden hâlâ hataları ka…

Makaleyi okuyun →
Veritabanları ve SQL

SQL'de DELETE vs TRUNCATE vs DROP: Farklılıklar, Geri Alma ve Her Biri Ne Zaman Kullanılmalı

DELETE vs TRUNCATE vs DROP test edilmiş SQL ile açıklandı: her birinin neyi kaldırdığı, geri aldığı, tetiklediği, kimlik sıfırlaması, hızı ve Postgr…

Makaleyi okuyun →
Veritabanları ve SQL

Açıklanan SQL Görünümleri: Örneklerle Tuzakları Oluşturun, Kullanın ve Önleyin

Çalıştırdığımız sorgularla açıklanan SQL görünümleri: görünüm oluşturma, canlı sonuçlar, sütunları gizleme, performans, güncellenebilir ve gerçekleş…

Makaleyi okuyun →
Yazılım geliştirme

TypeScript Arayüzü ve Tür: Gerçek Farklılıklar, Derleyiciyle Test Edildi

TypeScript arayüzü ve türü, gerçek derleyiciyle kontrol edildi: her ikisinin de yapabileceği, yalnızca birinin yapabileceği, bildirim birleştirme, g…

Makaleyi okuyun →
Yazılım geliştirme

Python *args ve **kwargs'ın Açıklaması: Açık Örneklerle Esnek Fonksiyonlar

Python *args ve **kwargs çalıştırdığımız kodla açıklanmıştır: paketleme ve paketten çıkarma, parametre sırası, yalnızca anahtar kelime ve yalnızca k…

Makaleyi okuyun →
Yazılım geliştirme

Python Lambda İşlevleri: Söz Dizimi, Gerçek Kullanımlar ve Ne Zaman Kullanılmaması Gerektiği

Çalıştırdığımız kodla açıklanan Python lambda işlevleri: sözdizimi, anahtarla sıralama, harita ve filtre, kapatmalar, geç bağlama tuzağı ve normal b…

Makaleyi okuyun →
Yapay zekâ

Yapay Zeka Ajanları Nelerdir? Çalıştırabileceğiniz Basit Bir Aracı Döngüsüyle Nasıl Çalışırlar?

Yapay zeka ajanları nedir? Aracı döngüsüne, araçlara, belleğe ve korkuluklara ilişkin basit bir kılavuz, çalıştırdığımız küçük bir Python döngüsü, g…

Makaleyi okuyun →
DevOps

İzleme ve Gözlemlenebilirlik: Günlükler, Metrikler ve İzlerle Gerçek Fark

İzleme ve gözlemlenebilirliğin açıklanması: bilinen ve bilinmeyen arızalar, günlükler, ölçümler ve izler, ödeme olayının gözden geçirilmesi, altın s…

Makaleyi okuyun →
DevOps

Docker Birimleri ve Bağlama Bağlantıları: Konteyner Verilerini Doğru Şekilde Kalıcılaştırın

Docker birimleri ile bağlama bağlamaları arasındaki karşılaştırma açıklandı: kapsayıcı verilerinin neden kaybolduğu, adlandırılmış birimler, bağlama…

Makaleyi okuyun →
Test otomasyonu

TDD ve BDD: Temel Farklılıklar, Her İki Şekilde Geliştirilmiş Bir Özellik ve Her Birinin Ne Zaman Kullanılacağı

TDD ve BDD, her iki yönde de oluşturulmuş bir indirim özelliğiyle açıklandı: çalıştırdığımız kodla kırmızı-yeşil-refactor, Verilen-Ne Zaman-O Zaman …

Makaleyi okuyun →
Yazılım geliştirme

Git merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır

Git merge vs rebase; gerçek log çıktısı, karşılaştırma tablosu, rebase'in altın kuralı ve güvenli bir ekip iş akışıyla anlatılıyor.

Makaleyi okuyun →
Yazılım geliştirme

Python Liste Üreteci (List Comprehension): Sözdizimi, Örnekler ve Kaçınılacak Durumlar

Python list comprehension anlatımı: sözdizimi, filtreleme, if-else, iç içe döngüler, ölçülmüş süreler ve düz for döngüsünün daha iyi olduğu durumlar.

Makaleyi okuyun →
Veritabanları ve SQL

SQL JOIN Örneklerle Açıklama (Inner, Left, Right, Full)

SQL JOIN'leri örnek tablolar ve sorgularla adım adım öğrenin: INNER, LEFT, RIGHT, FULL, CROSS ve SELF; yaygın hatalar ve performans ipuçları.

Makaleyi okuyun →