
Bir kodu farklı işler için tekrar tekrar kopyalayıp yapıştırıyorsak, sürekli kod tekrarına neden oluyorsak kendi fonksiyonumuzu yazma zamanımız gelmiştir.
Aynı kodu tekrar tekrar yazıyorsanız mantıklı olan bu kodu otomatikleştirmektir.
Mesela sürekli olarak kıyma yaptığımızı düşünelim. Bunun için her seferinde tekrar tekrar kıyma makinesi yapmayız; makineyi 1 defa yapar ve sürekli olarak bunu kullanırız. Ne zaman kıyma yapma ihtiyacı duyarsak makineyi çağırırız ve ona alacağı değerleri(parça et, yağ vb) verip, bir çıktı bekleriz (kıyma)
Şimdi bu kıyma makinesi fonksiyonunu python dili kullanarak yazalım.
Python da fonksiyon tanımlamak için def ifadesi kullanılır. Aşağıda kiymaci adında 1 paremetre alan ve “kiyma” değerini döndüren bir fonksiyon tanımlanmıştır.
def kiymaci(et): return "kiyma"
Yazılımsal bir örnek vermek gerekirse:
Mesela sürekli olarak email adresinin doğruluğunu kontrol etmemiz gerekiyor. Bu kontrolü birçok yerde yapmamız gerekiyor. Bunun için her defasında email kontrol yazılımını tekrar tekrar yazmak yerine kodlarımızı fonksiyon halinde 1 defa yazıp daha sonra istediğimiz kadar istediğimiz yerde kullanabiliriz.
Bunun için öncelikle fonksiyonumuza bir isim vermemiz gerekiyor. Burada fonksiyonumuzun ismi email_kontrol olsun.
Aşağıda email_kontrol() adında boş bir fonksiyon tanımladım. Fonksiyon için boş olduğu için hata vermemesi için içine pass kodunu ekledim.
def email_kontrol(): pass
Bizim email_kontrol() fonksiyonumuz bir email kontrol edeceği için bir email değeri alması gerekiyor. Bunun için fonksiyonumuzu 1 değer alacak şekile getirelim.
def email_kontrol(email): pass
Şimdi de aldığı email değerini kontrol edecek kodlarımızı yazalım
import re def email_kontrol(email): regex = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$' if(re.search(regex,email)): print("Geçerli Eposta Adresi") else: print("Hatalı Eposta Adresi")
Burada ilerde göreceğimiz düzenli ifadeler ile bir değerin email olup olmadığını anlayabiliyoruz. Fonksiyonu şu şekilde çalıştırıyoruz.
email_kontrol("bilgi@ahmetkadak.com")
Bu kodu çalıştırdığımızda ekrana “Geçerli Eposta Adresi” yazacaktır.
Yukarıdaki fonksiyon geriye bir değer döndürmeyen, sadece verilen görevi yapan bir fonksiyondur. Verilen görev ekrana eposta hatalı mı değil mi yazmasıdır. Her fonksiyonun bir görevi vardır. Bazı fonksiyonlar görevini yaptıktan sonra geriye değer döndürmezler(print() veya yukaridaki bizim email_kontrol() fonksiyonları gibi). Ancak bazı fonksiyonlar da geriye değer döndürürler(sqrt() veya yukarıda bizim yazdığımız kiymaci() fonksiyonu gibi)
Şimdi yukarıdaki email_kontrol() fonksiyonunu geriye boolean bir değer döndürecek şekilde tekrar düzenleyelim.
Bir fonksiyonun geriye değer döndürmesini istiyorsan return ifadesini kullanırız.
import re def email_kontrol(email): regex = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$' if(re.search(regex,email)): return True #geriye True değerini döndürüyor else: return False #geriye False değerini döndürüyor donus_degeri=email_kontrol("bilgi@ahmetkadak.com") if(donus_degeri==True): print("Girmiş olduğunuz eposta doğru.") else: print("Girmiş olduğunuz eposta yanlış")
Kodlara baktığımızda email_kontrol fonksiyonundan dönen değer(True veya False) donus_degeri değişkenine aktarılmıştır. Dönüş değeri Eğer True ise ekrana eposta doğru, dönüş değeri eğer yanlış ise eposta yanlış uyarısı veriliyor.
Fonksiyonların Birden Fazla Parametre Alması
İki sayıyı toplayıp bize sonucu döndüren bir fonksiyon yapacağımızı düşünelim. Bu durumda yukardaki gibi tek bir değer değil de 2 değer girmemiz gerekecektir. Fonksiyonları istediğimiz kadar değer girilecek şekilde yazabiliriz.
def topla(sayi1,sayi2): sonuc=sayi1+sayi2 return sonuc print(topla(45,22))
Veya bu şekilde isimlendirilmiş şekilde de yazabiliriz.
print(topla(sayi1=45,sayi2=22))
“Siz de 3 sayıyı çarpıp geriye döndüren bir fonksiyon yazabilir misiniz?“
Fonksiyonlara Varsayılan Değer Tanımlama
Bazen fonksiyonlara varsayılan bir değer atamamız gerekebilir. Mesela bir sayının üssünü alma ile ilgili bir fonksiyon tanımladığımızı düşünelim.
def ussunu_al(sayi, us_degeri): return sayi**us_degeri
Fonksiyonumuzun test edersek
print(ussunu_al(5,2)) #25 değerini verir
Şöyle bir şey düşünelim. Biz bazen ussunu_al(6,3), ussunu_al(7,4) gibi değerler kullansak da genellikle bir sayının karesini alıyoruz. Her defasında tekrar tekrar ussunu_al(5,2), ussunu_al(8,2), ussunu_al(9,2) yazmak istemiyoruz. Bunun için 2 değerini aşağıdaki gibi varsayılan olarak verebiliriz.
def ussunu_al(sayi, us_degeri=2): return sayi**us_degeri print(ussunu_al(5)) #25 çıktı
ussunu_al(5) yazmamıza rağmen sonuç yine 25 oldu. Burada herhangi bir değer vermediğimiz zaman varsayılan olanı alır. Ancak bir değer verirsek yine verdiğimiz değeri alır.
Fonksiyona Sonsuz Sayıda Parametre Vermek
Diyelim ki girilen sayıları toplayan bir fonksiyon yapıtınız. Ancak kaç adet sayı girileceğini bilmiyorsunuz. Bazen 3 değer bazen 8 değer alabilir. Bu gibi durumlarda fonksiyonumuzu aşağıdaki gibi tanımlarız
def topla(*sayi): sonuc=0 for x in sayi: sonuc+=x return sonuc print(topla(4,6,7,8,4,3,2,3))
Fonksiyonun birden fazla değer alması için yukarıdaki gibi değerin önüne * koyarız. Böyle durumlarda fonksiyon birden fazla değer alabilir. Birden fazla gelen değer demet(tuple) veri tipinde olduğu için ve bunların sayısını bilmediğimiz için for döngüsü ile gelen değerlere ulaşırız.,
İsimlendirilmiş Sonsuz Sayıda Değer Tanımlama
Bazı durumlarda hem isimlendirilmiş hem de sayısını bilmediğimiz kadar değer almamız gerekebilir. Bu durumda aşağıdaki gibi bir tanımlama yapılır.
def notlar(**ogrenci): for adi,notu in ogrenci.items(): print("{} isimli öğrencinin notu {} dır.".format(adi,notu)) notlar(ahmet=44,ayse=78,ali=66)
Fonksiyon tanımlarken fonksiyon parametresinin önüne ** koyduğumuz zaman isimlendirilmiş parametre tanımlamış oluyoruz. İsimlendirilmiş parametreler sözlük veri tipi olarak gelirler. Bu nedenle for döngüsü kullanırken items() parametresini kullandık.
Birden Fazla Değer Döndüren Fonksiyonlar
Python programlama dilinin bize sağladığı esnekliklerden diğeri de fonksiyonlarımızda birden fazla değer döndürebilmemizdir.
Aşağıdaki girilen 3 sayının ayrı ayrı karesini alıp geriye demet tipinde döndüren bir fonksiyon örneği görüyorsunuz.
def karesini_al(a,b,c): sonuc=(a**2,b**2,c**2) return sonuc print(karesini_al(5,3,6))
Ekran çıktısı

Bugün size python da fonksiyonlar konusunu anlatmaya çalıştım. Anlamadığınız yer varsa yorum kısmından bana sorabilirsiniz.
Kodlamayla Kalın!