Döngüler konusunu işlerken hatırlarsanız kendini tekrar eden kodların kötü bir programcılık örneği olduğundan bahsetmiştik. İşte bu tür durumlarda farklı noktalarda, farklı şekillerde işlenerek çalışan kodları kullanabilmek için fonksiyonları kullanıyoruz.
Aslında fonksiyon tanımına alışkın olmanız gerekiyor şayet ilk sayfalardan itibaren pek çok kez fonksiyonları kullandık. print(), input(), type() gibi pek çok fonksiyon gördük. Ancak bu fonksiyonlar Python ile gelen "gömülü" fonksiyonlardır. Biz bu sayfada kendi fonksiyonlarımızı tanımlayıp kullanacağız.
Python da fonksiyon tanımlamak için def
parçacığından yararlanılır. Hemen bir fonksiyon oluşturalım.
>>> def selamla():
... print("Merhaba Dünya!")
Evet, Python ile fonksiyon tanımlamak işte bu kadar kolay. Fonksiyonu çağırmakta bir o kadar kolay.
>>> selamla()
>>> Merhaba Dünya!
Evet, fonksiyon tanımlarken başına def ifadesini eklemek yeterli. Çağırırken de fonksiyonu direk çağırıyoruz. Artık biz her selamla() dediğimizde ekrana Merhaba Dünya! yazısı düşecektir. Bu bizim fonksiyonları anlamamız için yeterli bir örnektir ancak bu fonksiyonlar argüman alarak kullanıcı ile etkileşime girebilirler, buda fonksiyonları daha da güçlü hale getirmektedir.
Hatırlarsanız print() fonksiyonu argüman olarak aldığı değeri ekrana bastırırdı.
>>> print("Öylesine Bir Satır İşte")
>>> "Öylesine Bir Satır İşte"
Tanımladığımız fonksiyonun argüman almasını istersek, tanımlarken değişkenleri parantez içerisine almamız gerekiyor.
>>> def selamla(isim):
... print("Merhaba {}".format(isim))
>>> selamla("yunus emre")
>>> "Merhaba yunus emre"
Bu şekilde kullanıcıdan veri almaya devam edebilirsiniz.
>>> def selamla(isim, tarih):
... print("Merhaba {}, {} tarihinde görüşebilir miyiz?".format(isim, tarih)
>>> selamla("emre", "12 07 2019")
>>> "Merhaba emre, 12 07 2019 tarihinde görüşebilir miyiz?"
Ancak bu verimsiz bir yöntemdir. Şayet fonksiyonların asıl amacı elinde ki veriyi işleyerek geriye bir sonuç döndürmesi dir. Fonksiyonun sonuç döndermesi için return
komutu kullanılır. Hadi toplama işlemi yapan bir fonksiyon yazalım!
>>> def topla(x, y):
... toplam = x + y
... return toplam
Fonksiyonumuzu tanımladık, x ve y olarak 2 değişken aldık. Bunları toplayıp toplam değişkenine aktardık ve return diyerek geri dönderdik.
>>> sonuc = topla(5,2)
>>> print(sonuc)
>>> 7
Evet fonksiyonumuz işlemi yaparak geriye 7 sonucunu dönderdi. Bizde bu sonucu sonuc değişkenine aktardık.
Eğer farkı anlamadıysanız şöyle küçük bir örnek gösterelim ve farkı anlayın.
>>> def topla(x, y):
... sonuc = x + y
... print(sonuc)
>>> sonuc = topla(5,7)
>>> 7
>>> print(sonuc)
>>> None
Dikkat ettiniz mi 5. satırda fonksiyon ile toplama yapıp sonuc değişkenine aktarır aktarmaz ekrana 7 değerini bastı. Oysa biz değişkeni ekrana basıtr demedik! Fonksiyon içerisinde ki print() devreye girdi ve ekrana bastırdı. Fonksiyondan geriye bir şey dönmediği için sonuc değişkenine bir değer eklenmedi.
Bu yüzden fonksiyonun ürettiği sonucu bir değişkene aktararak kullanmak istiyorsanız return ile değer döndürmeniz gerekmekte.
Tanımladığınız fonksiyonların aldığı argümanları varsayılan değerlere eşitleyebiliriz. Yani eğer kullanıcı fonksiyona bir argüman göndermese bile yada eksik gönderirse varsayılan değeri alarak fonksiyon işlemine devam edebilir.
>>> def daireCevre(r, pi = 3.14):
... return 2*pi*r
Burada bir dairenin alanını hesaplayan basit bir program yazdık. Kullanıcıdan dairenin yarı çapını argüman olarak aldık. Pi sayısını ise kullanıcının girmediği durumlarda 3.14 olarak aldık. Eğer kullanıcı 2. argümanı girerse girdiği argüman olarak alacaktır pi sayısını. Burada biz 2. argümana varsayılan değeri girdik, kullanıcı girmese de olur. Ama ilk argümanı yani yarı çapı girmek zorunda yoksa program hata verecektir.
>>> print(daireCevre(5)) # pi değeri varsayılan olarak 3.14 değerini aldı.
>>> 31.4
>>> print(daireCevre(5, 3)) # pi değerini girdiğimiz için pi 3 aldı.
>>> 30
Tabi ki her zaman argümanların sıralamasına uymak zorunda değiliz, değişkenlerin ismini belirterek istediğimiz sıralamada da yapabiliriz.
>>> print(daireCevre(pi = 3, r = 5))
>>> 30
Matematik derslerinde denklemin köklerini hesaplamak için kullandığımız bir yöntem vardı, hatırladınız mı? Evet diskriminant. Hadi burada denklemin köklerini diskriminant yöntemi ile hesaplayan programımızı yazalım.
def diskriminant(a, b, c):
diskriminant = (b**2)-4*a*c
if diskriminant > 0:
x1=(-b+(diskriminant**0.5))/2*a
x2=(-b-(diskriminant**0.5))/2*a
print (x1, "ve", x2, "olmak üzere iki reel kökü vardır.")
elif diskriminant == 0:
x1 = (-b+(diskriminant**0.5))/2*a
print(x1, "olmak üzere eşit iki kökü vardır.")
else:
print("Reel kökü yoktur.")
diskriminant(sayiBir, SayiIki, SayiUc)