Python İleri Düzey Fonksiyonlar

Python İleri Düzey Fonksiyonlar

Tarhi : 31-01-2022 11:15:12 | Yazar : ÇAĞLAR BOSTANCI

Python İleri Düzey Fonksiyonlar

Merhaba bu konuyu daha iyi kavraya bilmemiz için bir önceki konu olan python gömülü fonksiyonları gözden geçiriniz. Gömülü fonksiyonlardan sonra python’da fonsiyonlar konusu daha da ilerleteceğiz. İlk olarak lambda’yı inceleyeceğiz.

Python Lambda Kullanımı

Lamda ifadesi fonskiyon tanımlamak için kullanılmaktadır. Peki def ifadesine ne oldu diyeceksiniz. Tabi bir şey olmadı def ifadesinu uzun soluklu fonksiyon tanımlamalarında kullanacağız, Lambda ise tek satırda yazamamız gereken fonsiyonlarda kulllanacağız . Anlaşıldığı üzere bu fonskiyon daha pratik bir şekilde fonksiyon tanımlamak için kullanılmaktadır. Aynı zamanda bazı durumlarda parametre yerine anlık fonksiyon tanımlamanız gerekecektir. yani fonksiyon(param1,param2) şeklinde tanımlama esnasında parametre verdiğimiz alana def ile fonksiyon tanımlayamazsınız ama Lambda ile tanımlayabilirsiniz. Şimdi bir tane iki sayıyı toplayan bir fonksiyon yazalım.

Şimdi yukarıta tanımlamış olduğumuz fonksiyonu lambda ile tanımlayalım.

Anlaşılacağı gibi ikinci örneğimizde lambda ile yapmış olduğumuz tanımlama daha kolay.

Lambda tanımlamalarını şimdi bir sayının, verilen bir değer tam olarak bölünüp bölümendiğini yapan bir fonksiyon tanımlayalım.

Şimdi lambda ile kdv’li fiyat hesaplayan programı yazalım.

Örneğimizi geliştirelim bir liste halinde verilen fiyatların kdv’lerini hesaplayalım.

Lambda kullanımının en önemli yanı burası. Yani bir fonsiyona parametre olarak yeni bir fonksiyon tanımlayabilmekteyiz.

İsterseniz yukarıdaki lambda ile tanımlamış olduğumuz fonsiyonu def ile kullanalım.

İsterseniz bir de self link yapma fonksiyonu yapalım. Yani türkçe olarak belirlenen başlıklar url uygun hale getirmek için bir lambda yazalım.

İlk başkışta yukarıdaki fonksiyon anlaşılmaz gibi dursada aslında basit. Aşağıda def ile yazılmış halini yukarıdaki ile karşılatırınız.

Lamda kullanımını bir örnek daha verelim. Bu örneğimizde belirtilen rakam uzunluğunda şifre oluşturan bir fonskiyon yapalım.

Özyinelemeli (Recursive) Fonksiyonlar

Öz yinelemeli fonksiyonlar bütün yazılım dillerinde var. Yani bir fonksiyonu özyilemeli hale getirebilirsiniz. Özyinelemeli fonksiyonların, normal fonksiyonlardan farkı birkez çalıştırıldıktan sonra tekrar tekrar kendini çağırıyor olmasıdır. Şimdi örnek olarak normal bir foksiyon yazalım.

Yukarıdaki fonksiyon gönderilen kişi saysı kadar ekrana merhaba yazmaktadır. Bu fonksiyonu özyinelmeli olarak tasarlaryalım.

Dikkat ederseniz öz yinelemeli fonksiyonumuzda for kullanmadık. Öncelikle gelen değerin 1’den küçük ve eşit olduğunun kontrolünü yapıyor. Eğer değer bir ve küçükse sadece “merhaba” yadırıyoruz. Eğer değer birden büyükse ekrana “merhaba” yazdırıyoruz ve tekrardan fonksiyonumuzu kisiSayısı değerini -1 düşürerek tekrar çağırıyoruz. Bu kullanıma özyinelemeli fonksiyon denmektedir.

Örnekleri çoğaltarak devam edelim. Şimdi yazılan bir mentini bir eksilterek ekrana yazalım.

Bu fonksiyonu terten yazdıralım.

Yukarıdan aşağı tersten yazdıralım

Öz yinelemeli fonksiyonları veritabanından gelen verilerde genel olarak kullanmaktayız. ilerleyen zamanlarda daha da örneklerini göreceğiz.

İç İçe (Nested) Fonksiyonlar

Python nested fonksiyonlar dediğimizde içe içe yazılan fonksiyonlar aklımıza gelmelidir. Kullanımı ve tanımlaması basittir. Şimdi örnek bir tane tanımlayalım.

Yukarıdaki kodlarda ilk olarak cikti() fonksiyonunu tanımladık daha sonra bu fonksiyon bize kendi içinde tanımlanmış olan p() fonksiyonunu geri dönderdi. Gelen p() fonsiyonunu fnk adında bir değikene atadık ve bu sayede fnk(“Merhaba Python”) dediğimizde p() fonksiyonu çalışmış ve ekrana vermiş olduğumu mesajı basmıştır.

Bu sayede ne yapmış olduk? Dikkat ederseniz fonksiyonu değişkene aldık bu sayede tanımlanmış olduğumuz p() fonksiyonunu farklı değişkenlerde ve farklı değerler tanımlayabileceğimiz anlamına geliyor. Aynı zamanda burada cikti() fonksiyonumuz bizim kapsayıcı fonksiyon ve içerisinde oluşturduğumuz p() ise iç fonksiyonumuz olmaktadır. fnk değişken tipini ekrana bastığımızda local çıktısnı alacağız. Bu durum cikti() fonksiyonu içerisinde yerel olarak tanımlanan p() fonsiyonu olduğunu göstermektedir.

Dikkat etmemiz gereken diğer bir kavramsa nonlocal tanımlamasıdır. Kapsayıcı içerisinde kullandığımız değişkenler ile iç fonksiyon içerisinde tanımlanan değişkenler farklıdır. Kapsayıcı fonksiyondan kullandığımız değişken global gibi davranmakta iç fonsiyonlardaki değişkenlerse localk değişkenlerdir. Bunu bir örnek ile pekiştirelim.

Anlaşılacağı gibi değişken isimleri aynı olmasına rağmen fosksiyon içerisindeki yerel değişken çalışmıştır. Yine eğer istersek global olarak tanımlanan değişkenleride aşağıdak gibi global nanımlaması ile çalıştırabiliriz.

Kapsayici fonsiyonu içerisindeki değikenleri local iç değişkenlerde de kullanmak istersen nonlocal deyimi kullanılmaktadır. Bu örneklerle pekiştirelim.

Yine örneğimizi artıralım. Kapsayici değişken üzerinden gönderdiğimiz değer iç fonsksiyonlarda kullanalım.

Kapsayıcı değişkenimizdeki gelen değişkeni ekle() fonksiyonumuzda güncellendik. Tabi güncelleme yapabilmemiz için nonlocal olarak tanımlamalıyız.

Anlaşılacağı gibi fonksiyon içerisine belirlemiş olduğumuz değer fonksiyon çalıştıktan sonra kaybolmuyor ve her artır dediğimizde bir atırıyor.

Python Üreteçler

Üreteç ile ilgili ilk örneklerimizi list konusunu işleken vermiştik. Yine hatırlatma adına bir örnek yapalım.

Üreteçlerde en önemli gömülü fonksiyonlardan biri yield foksiyonudur. Python ve diğer yazılım dillerinden oluşturlan fonsiyonlar çalıştırıldıktan sonra return ile geriye değer dönderirir ve görevelerini tamamlarlar. Çalışan fonksiyon ve içerisindeki değişkenler ram’den silinir. Yeild fonksiyonu ise aynı iç içe fonksiyonlarda kullandığımız gibi kaldığı yerden devam etmektedir. Bunu bir örnekle pekiştirelim.

Örnekte kullandığımız yield fonksiyonu şu işe yaramaktadır. Fonksiyo çalıştığında yield fonsiyonunu görünce durur ve sağındaki değişkenin döndürür. Sonra next fonsiyonu ise bir sonraki yield devam etmesi için tekrar harekete geçer diğer bir yield fonksiyonunu görünce durur. Bu hareketliliğin devamını next() fonksiyonu sağlamaktadır. Biz ise while döngüsünde sonsuz döngüyü sağlamak için direk True değerini veriyoruz. Bu sayede fonksiyon ne kadar çağırılırsa sayaç o kadar artırılmaktadır.

Bu fonksiyonu bir örnekle daha da pekiştirelim.

Yukarıdaki fonksiyon içerisinde üç kez yield kullandık. Üçkez next() fonksiyonunu kullandıktan sonra adım adım ilerledi ve dördüncü next() fonksiyonunda hata verdi bunun sebebi ise fonksiyonun sonuna gelinmiş olmasıdır.

Yine iç içe fonskiyon kullanımlarında da iç fonksiyon içerisindeki yield kullanımı için “yield from” tanımlaması yapılmaktadır. Bunu aşağıdaki örenklerle daha da detaylandıralım.

Dış fonksiyonu döngüye soktuğumuzda iç fonksiyondaki yield’lerin çalışması için yield from kullanıldı.

Üreteçlere örnek olarak aşağıdaki koldlarada bakmanızı öneririm. Bu konu buraya kadar faydalı olması temennisiyle BAŞARILAR.