ÖRNEKLERLE Python Lambda İşlevleri

İçindekiler:

Anonim

Python'da Lambda İşlevi nedir?

Python programlamasında bir Lambda İşlevi, anonim bir işlev veya adı olmayan bir işlevdir. Birden fazla satırı olmayan küçük ve sınırlı bir işlevdir. Normal bir işlev gibi, bir Lambda işlevi de tek bir ifadeye sahip birden çok argümana sahip olabilir.

Python'da, anonim işlevler oluşturmak için lambda ifadeleri (veya lambda formları) kullanılır. Bunu yapmak için lambda anahtar sözcüğünü kullanacaksınız (tıpkı normal işlevleri tanımlamak için def kullandığınız gibi ). Python'da tanımladığınız her anonim işlevin 3 temel parçası olacaktır:

  • Lambda anahtar sözcüğü.
  • Parametreler (veya bağlı değişkenler) ve
  • İşlev gövdesi.

Bir lambda işlevinin herhangi bir sayıda parametresi olabilir, ancak işlev gövdesi yalnızca bir ifade içerebilir . Dahası, bir lambda tek bir kod satırına yazılır ve ayrıca hemen çağrılabilir. Tüm bunları ilerideki örneklerde eylem halinde göreceksiniz.

Python'da bu Lambda eğitiminde şunları öğreneceksiniz:

  • Sözdizimi ve Örnekler
  • Python yerleşikleriyle lambdaları kullanma
  • filtrede lambdalar ()
  • haritada lambdas ()
  • azaltmada lambdas ()
  • Lambda işlevleri neden (ve neden kullanılmıyor)?
  • Lambdas ve Normal işlevler

Sözdizimi ve Örnekler

Bir lambda işlevi yazmak için biçimsel sözdizimi aşağıda verildiği gibidir:

lambda p1, p2: expression 

Burada p1 ve p2, lambda fonksiyonuna aktarılan parametrelerdir. İhtiyaç duyduğunuz kadar çok veya az parametre ekleyebilirsiniz.

Ancak, normal işlevlerde yaptığımız gibi parametrelerin etrafında parantez kullanmadığımıza dikkat edin. Son kısım (ifade), işleve sağladığınız parametreler üzerinde çalışan herhangi bir geçerli python ifadesidir.

örnek 1

Artık lambdaları bildiğinize göre, bir örnekle deneyelim. Öyleyse, IDLE'nizi açın ve aşağıdakileri yazın:

adder = lambda x, y: x + yprint (adder (1, 2))

İşte çıktı:

3

Kod Açıklama

Burada, lambda fonksiyonunun döndürdüğü sonucu tutacak bir değişken tanımlıyoruz.

1. Anonim bir işlevi tanımlamak için kullanılan lambda anahtar sözcüğü.

2. x ve y, lambda fonksiyonuna aktardığımız parametrelerdir.

3. Bu, geçirdiğimiz 2 parametreyi ekleyen fonksiyonun gövdesidir. Bunun tek bir ifade olduğuna dikkat edin. Bir lambda işlevinin gövdesine birden çok ifade yazamazsınız.

4. Fonksiyonu çağırır ve döndürülen değeri yazdırırız.

Örnek 2

Bu, lambda'nın temellerini ve sözdizimini anlamak için temel bir örnekti. Şimdi bir lambda yazdırmayı deneyelim ve sonucu görelim. Tekrar IDLE'nizi açın ve aşağıdakileri yazın:

#What a lambda returnsstring='some kind of a useless lambda'print(lambda string : print(string))

Şimdi dosyanızı kaydedin ve programı çalıştırmak için F5'e basın. Bu, almanız gereken çıktıdır.

Çıktı:

 at 0x00000185C3BF81E0>

Burada neler oluyor? Daha fazla anlamak için koda bakalım.

Kod Açıklama

  1. Burada, lambdaya parametre olarak ileteceğiniz bir dizge tanımlıyoruz.
  2. Bir print deyimini çağıran ve sonucu yazdıran bir lambda bildiriyoruz.

Ama program neden geçtiğimiz dizeyi yazdırmıyor? Bunun nedeni lambda'nın kendisinin bir işlev nesnesi döndürmesidir. Bu örnekte, lambda yazdırma işlevi tarafından çağrılmıyor , yalnızca işlev nesnesini ve depolandığı bellek konumunu döndürüyor . Konsolda yazdırılan şey budur.

Örnek 3

Ancak, böyle bir program yazarsanız:

#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)

Ve F5'e basarak çalıştırın, böyle bir çıktı göreceksiniz.

Çıktı:

some kind of a useless lambda

Şimdi lambda çağrılıyor ve geçtiğimiz dize konsolda yazdırılıyor. Ama bu garip sözdizimi nedir ve lambda tanımı neden parantez içinde kapsanmaktadır? Şimdi anlayalım.

Kod Açıklama

  1. İşte önceki örnekte tanımladığımız aynı dize.
  2. Bu bölümde, bir lambda tanımlıyoruz ve dizeyi argüman olarak ileterek onu hemen çağırıyoruz. Bu, IIFE olarak adlandırılan bir şeydir ve bu eğitimin ilerleyen bölümlerinde bununla ilgili daha fazla bilgi edineceksiniz.

Örnek 4

Lambdaların ve normal fonksiyonların nasıl çalıştırıldığını anlamak için son bir örneğe bakalım. Öyleyse, IDLE'nizi açın ve yeni bir dosyaya aşağıdakileri yazın:

#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(lambda: printer_one('printer 1 LAMBDA CALL'))guru(lambda: printer_two('printer 2 LAMBDA CALL'))

Şimdi dosyayı kaydedin ve programı çalıştırmak için F5'e basın. Herhangi bir hata yapmadıysanız, çıktı böyle bir şey olmalıdır.

Çıktı:

yazıcı 1 DÜZENLİ ÇAĞRI

yazıcı 2 DÜZENLİ ÇAĞRI

yazıcı 1 LAMBDA CALL

yazıcı 2 LAMBDA CALL

Kod Açıklama

  1. İlk parametre olarak başka bir işlevi ve onu izleyen diğer argümanları alan guru adlı bir işlev.
  2. printer_one, kendisine iletilen parametreyi yazdıran ve onu döndüren basit bir işlevdir.
  3. printer_two, printer_one'a benzer, ancak return ifadesi yoktur.
  4. Bu bölümde, guru işlevini çağırıyoruz ve yazıcı işlevlerini ve bir dizeyi parametre olarak geçiriyoruz.
  5. Bu, dördüncü adımı (yani, guru işlevini çağırmak) ancak lambdaları kullanarak gerçekleştirmek için kullanılan sözdizimidir.

Bir sonraki bölümde, lambda işlevlerini Python'da map (), lower () ve filter () ile nasıl kullanacağınızı öğreneceksiniz .

Python yerleşikleriyle lambdaları kullanma

Lambda işlevleri, Python'daki yerleşik yöntemleri kullanarak işlemleri gerçekleştirmek için zarif ve güçlü bir yol sağlar. Mümkündür çünkü lambdalar hemen çağrılabilir ve bu işlevlere bir argüman olarak aktarılabilir.

Python Lambda'da IIFE

IIFE , hemen çağrılan işlev yürütme anlamına gelir . Bu, bir lambda işlevinin tanımlandığı anda çağrılabilir olduğu anlamına gelir. Bunu bir örnekle anlayalım; IDLE'nizi ateşleyin ve aşağıdakileri yazın:

 (lambda x: x + x)(2) 

İşte çıktı ve kod açıklaması:

Lambdaların bu anında çağrılma yeteneği, onları map () ve lower () gibi işlevler içinde kullanmanıza izin verir. Yararlıdır çünkü bu işlevleri tekrar kullanmak istemeyebilirsiniz.

filtrede lambdalar ()

Filtre işlevi, bir dizi öğeden bazı belirli öğeleri seçmek için kullanılır. Sıra, listeler, kümeler, tupleler vb. Gibi herhangi bir yineleyici olabilir.

Seçilecek elemanlar önceden tanımlanmış bazı kısıtlamalara dayanmaktadır. 2 parametre alır:

  • Filtreleme kısıtlamasını tanımlayan bir işlev
  • Bir dizi (listeler, tuples vb. Gibi herhangi bir yineleyici)

Örneğin,

sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = filter (lambda x: x > 4, sequences)print(list(filtered_result))

İşte çıktı:

[10, 8, 7, 5, 11]

Kod Açıklaması:

1. İlk ifadede, bazı sayılar içeren diziler adı verilen bir liste tanımlıyoruz.

2. Burada, filter () işlevi tarafından döndürülen filtrelenmiş değerleri depolayacak olan filtered_result adında bir değişken tanımlıyoruz.

3. Listenin her bir öğesi üzerinde çalışan ve 4'ten büyükse true döndüren bir lambda işlevi.

4. Filtre işlevi tarafından döndürülen sonucu yazdırın.

haritada lambdas ()

harita işlevi, bir sıradaki her öğeye belirli bir işlemi uygulamak için kullanılır. Filter () gibi, 2 parametre de alır:

  1. Elemanlar üzerinde gerçekleştirilecek operasyonu tanımlayan bir işlev
  2. Bir veya daha fazla dizi

Örneğin, verilen bir listedeki sayıların karelerini yazdıran bir program:

sequences = [10,2,8,7,5,4,3,11,0, 1]filtered_result = map (lambda x: x*x, sequences)print(list(filtered_result))

Çıktı:

 [100, 4, 64, 49, 25, 16, 121, 0, 1]

[KR1]

Kod Açıklaması:

  1. Burada, bazı sayılar içeren diziler adı verilen bir liste tanımlıyoruz.
  2. Eşlenen değerleri saklayacak filtered_result adlı bir değişken bildiriyoruz
  3. Listenin her bir öğesi üzerinde çalışan ve bu sayının karesini döndüren bir lambda işlevi.
  4. Harita işlevi tarafından döndürülen sonucu yazdırın.

azaltmada lambdas ()

Map () gibi azaltma işlevi, bir dizideki her öğeye bir işlem uygulamak için kullanılır. Ancak işleyişi haritadan farklıdır. Bunlar, bir çıktıyı hesaplamak için azaltma () işlevinin izlediği adımlardır:

Adım 1) Sıranın ilk 2 öğesi üzerinde tanımlanan işlemi gerçekleştirin.

Adım 2) Bu sonucu kaydedin

Adım 3) İşlemi kaydedilen sonuçla ve sıradaki bir sonraki öğeyle gerçekleştirin.

Adım 4) Daha fazla öğe kalmayana kadar tekrarlayın.

Ayrıca iki parametre alır:

  1. Gerçekleştirilecek işlemi tanımlayan bir işlev
  2. Bir dizi (listeler, tuples vb. Gibi herhangi bir yineleyici)

Örneğin, bir listedeki tüm öğelerin ürününü döndüren bir program burada:

from functools import reducesequences = [1,2,3,4,5]product = reduce (lambda x, y: x*y, sequences)print(product)

İşte çıktı:

120

Kod Açıklaması:

  1. Functools modülünden içe aktarım azaltma
  2. Burada, bazı sayılar içeren diziler adı verilen bir liste tanımlıyoruz.
  3. İndirgenmiş değeri depolayacak ürün adında bir değişken beyan ederiz
  4. Listenin her bir öğesi üzerinde çalışan bir lambda işlevi. Bu numaranın ürününü önceki sonuca göre döndürecektir.
  5. Azaltma işlevi tarafından döndürülen sonucu yazdırın.

Lambda işlevleri neden (ve neden kullanılmıyor)?

Bir sonraki bölümde göreceğiniz gibi, lambdalar yorumlayıcı düzeyinde normal işlevlerle aynı şekilde ele alınır. Bir bakıma, lambdaların tek bir ifade döndüren fonksiyonlar yazmak için kompakt sözdizimi sağladığını söyleyebilirsiniz.

Bununla birlikte, lambda kullanmanın ne zaman iyi bir fikir olduğunu ve ne zaman kaçınmanız gerektiğini bilmelisiniz. Bu bölümde, python geliştiricilerinin lambda yazarken kullandıkları bazı tasarım ilkelerini öğreneceksiniz.

Python, işlevsel programlama olarak bilinen bir programlama paradigmasını (veya stilini) desteklediğinden, lambdalar için en yaygın kullanım durumlarından biri işlevsel programlamadır.

Başka bir işleve (örneğin haritada, filtrede vb.) Parametre olarak işlev sağlamanıza olanak tanır. Bu gibi durumlarda, lambdaların kullanılması, tek seferlik bir işlev oluşturmanın ve bunu parametre olarak iletmenin zarif bir yolunu sunar.

Ne zaman Lambda kullanmamalısınız?

Bir üretim ortamında asla karmaşık lambda işlevleri yazmamalısınız. Kodunuzu koruyan kodlayıcıların şifresini çözmesi çok zor olacaktır. Kendinizi karmaşık tek satırlık ifadeler yaparken bulursanız, uygun bir işlevi tanımlamak çok daha üstün bir uygulama olacaktır. En iyi uygulama olarak, basit kodun her zaman karmaşık koddan daha iyi olduğunu hatırlamanız gerekir.

Lambdas ve Normal işlevler

Daha önce belirtildiği gibi, lambdalar [vV4] [J5] sadece kendilerine bağlı bir tanımlayıcıya sahip olmayan fonksiyonlardır. Daha basit bir deyişle, isimleri olmayan işlevlerdir (dolayısıyla anonimdir). Python'da lambdalar ve normal işlevler arasındaki farkı gösteren bir tablo.

Lambdas

Normal Fonksiyonlar

Sözdizimi:

lambda x : x + x 

Sözdizimi:

def (x) :return x + x

Lambda işlevlerinin vücutlarında yalnızca bir ifadesi olabilir.

Normal işlevlerin vücutlarında birden çok ifade ve ifade bulunabilir.

Lambdaların kendileriyle ilişkilendirilmiş bir adı yoktur. Bu yüzden anonim işlevler olarak da bilinirler.

Normal işlevlerin bir adı ve imzası olmalıdır.

Lambdalar, gövde otomatik olarak döndürüldüğünden bir dönüş ifadesi içermez.

Değer döndürmesi gereken işlevler bir return ifadesi içermelidir.

Farklılıkların açıklaması?

Lambda ile normal işlev arasındaki temel fark, lambda işlevinin yalnızca tek bir ifadeyi değerlendirip bir işlev nesnesi vermesidir. Sonuç olarak, lambda fonksiyonunun sonucunu isimlendirebilir ve önceki örnekte yaptığımız gibi programımızda kullanabiliriz.

Yukarıdaki örnek için normal bir işlev şöyle görünecektir:

def adder (x, y):return x + yprint (adder (1, 2))

Burada, çağırdığımızda sonucu döndüren fonksiyon için bir isim tanımlamalıyız . Bir lambda işlevi, her zaman varsayılan olarak döndürülen tek bir ifadeye sahip olacağından, bir dönüş ifadesi içermez. Hemen çağrılabileceği için bir lambda atamanıza bile gerek yoktur (sonraki bölüme bakın). Aşağıdaki örnekte göreceğiniz gibi, lambdalar, onları Python'un yerleşik işlevleriyle kullandığımızda özellikle güçlü hale gelir.

Bununla birlikte, lambdaların tek bir ifade döndüren bir işlevden (yukarıdaki gibi) ne kadar farklı olduğunu hala merak ediyor olabilirsiniz. Tercüman düzeyinde, çok fazla fark yoktur. Şaşırtıcı gelebilir, ancak Python'da tanımladığınız herhangi bir lambda işlevi yorumlayıcı tarafından normal bir işlev olarak ele alınır.

Diyagramda görebileceğiniz gibi, iki tanım bayt koduna dönüştürüldüğünde python yorumlayıcısı tarafından aynı şekilde ele alınır. Şimdi, bir işlevi lambda olarak adlandıramazsınız çünkü Python tarafından rezerve edilmiştir, ancak başka herhangi bir işlev adı aynı bayt kodunu [KR6] verecektir.

Özet

  • Anonim işlevler olarak da bilinen Lambdalar, bir ada (yani bir tanımlayıcıya) ihtiyaç duymayan küçük, kısıtlanmış işlevlerdir.
  • Python'daki her lambda işlevinin 3 temel parçası vardır:
  • Lambda anahtar sözcüğü.
  • Parametreler (veya bağlı değişkenler) ve
  • İşlev gövdesi.
  • Lambda yazmak için sözdizimi şöyledir: lambda parametresi: ifade
  • Lambdaların herhangi bir sayıda parametresi olabilir, ancak ayraç içine alınmazlar
  • Bir lambda, varsayılan olarak döndürülen işlev gövdesinde yalnızca 1 ifadeye sahip olabilir.
  • Bayt kodu seviyesinde, lambdaların ve normal işlevlerin yorumlayıcı tarafından nasıl ele alındığı arasında çok fazla fark yoktur.
  • Lambdalar, bu sözdizimi aracılığıyla IIFE'yi destekler: (lambda parametresi: ifade) (bağımsız değişken)
  • Lambdalar genellikle aşağıdaki python yerleşikleriyle kullanılır:
  • Filtre: filtre (lambda parametresi: ifade, yinelenebilir sıra)
  • Harita: harita (lambda parametresi: ifade, yinelenebilir diziler)
  • Azalt: azalt (lambda parametre1, parametre2: ifade, yinelenebilir sıra)
  • Bir üretim ortamında karmaşık lambda işlevleri yazmayın çünkü bu, kod bakımcıları için zor olacaktır.

[J5] Bir tablo ekledim, ancak farklılıkları anlamak için açıklama gerekli.