Bu bölüme kadar kullanılan fonksiyonlardan bazıları şunlardır: print( ), input( ), int( ) ve len( ) Fonksiyonlar, matematikteki fonksiyonlarla aynı işlevi görürler. y=f(x)=x*x gibi bir fonksiyon tanımlandığında verilen değeri kendisiyle çarpar. Bu görece kolay bir işlemdir. Bir sayının karesini hesaplamak gerektiğinde, formülü tekrar yazmak yerine bu fonksiyon kullanılabilir. Fonksiyonlar; kodları tekrar yazmayı ortadan kaldırmak, kodları daha iyi organize etmek sonrasında bu kodları rahat bir şekilde kullanmak için oluşturulur. Python’da ve diğer programlama dillerinde birçok fonksiyon çeşitli kütüphanelerde veya varsayılan olarak tanımlı gelir. Bu sayede en temel işlemler için bile satırlarca kodu tekrarlamaya gerek kalmaz.
Fonksiyonların görevi, karmaşık işlemleri bir araya toplayarak bu işlemleri tek adımda yapmayı sağlamaktır. Fonksiyonları kullanarak bir veya birkaç adımdan oluşan işlemleri tek bir yapı altında toplamak mümkündür.
Fonksiyonun Adı | Parametreler - Argümanlar |
---|---|
(“Sultan”, “Murat”, sep=“ ”, end=“”) | |
input | (“Argüman”) |
Her fonksiyonun bir adı (print, input, len vb.) ve işlevini yerine getirmesi için kullanabileceği parametre adı verilen yapıları vardır. Parametreler fonksiyonda tanımlı özellik ve girdileri belirtir. Bir fonksiyonu kullanırken (çağırırken) bu parametrelere verilen değerlere “argüman” denir. Aşağıda print( ) fonksiyonu ve parametrelerinin kullanımına örnek verilmiştir. “end” ve “sep” birer parametredir. Fonksiyonlarda bazı parametreler zorunludur ve bir argüman (değer) girmek gerekir. Ancak yine bazı parametreler fonksiyon içinde ön tanımlı olarak bir değer/boş (None) veya seçmeli olarak belirlenmiştir. Bu parametrelere değer vermek gerekmez. Bunlar, isteğe bağlıdır ve kullanılmayacak özellikler için argüman girmeye gerek yoktur.
Örnek 1
Aşağıdaki örnekte print ( ) fonksiyonun “end” ve “sep” argümanlarıyla birlikte kullanımı gösterilmiştir:
print ('Merhaba', 'Mars', sep=' ', end='\n') #parametreleri kullanarak
print ('Merhaba')
print ('Merhaba',' ', 'Mars') #parametreleri kullanmadan
print ('Merhaba')
>>> Merhaba Mars
>>> Merhaba
>>> Merhaba Mars
>>> Merhaba
Temel fonksiyonlar, Python içinde hazır olarak yer alan fonksiyonlardır. Bu fonksiyonlar tanımlı olduğu için sadece fonksiyonadı( ) yazarak kullanabilmektedir. Bir fonksiyon def fonksiyonAdi(parametre1, parametre2,..):şeklinde tanımlanır. Fonksiyon içindeki kodlar girinti şeklinde blok yapısında yazılır. Fonksiyon yapısı dışında o fonksiyonu kullanmak için fonksiyonAdi(argüman1, argüman2) şeklinde parametre değerleri verilerek kullanılır. Örneğin, girilen bir sayının çift bir sayı olup olmadığını bulan bir fonksiyon yazabilirsiniz. Fonksiyon bir parametreden oluşacak ve bir sayı değeri alacaktır.
Örnek 2
Bir sayının çift olup olmadığını ekrana yazan bir fonksiyon.
Hatırlatma: Bir sayının 2’ye bölümünden kalan yoksa o sayı çifttir varsa tektir.
def sayiCiftMi (sayi):
if sayi%2==0:
print('Sayı çifttir')
else: ('Sayı tektir')
Bir fonksiyonu oluşturduktan sonra print( ) fonksiyonunda kullandığınız şekilde parametrelere uygun argümanları girip çağırabilirsiniz.
10)
sayiCiftMi(
>>> Sayı çifttir
Fonksiyonun adı ve parametrelerine değerleri yazılarak fonksiyon kullanılabilir. Fonksiyon çağrıldığında verilen argümanlara göre işlem yapar. Örnekteki fonksiyon 10 sayısını kontrol ederek sonucu “Sayı çifttir” şeklinde ekrana yazdırır.
Örnek 3
Başka bir fonksiyon tanımlayabilirsiniz. Tanımlanan fonksiyon bir metni istenildiği kadar alt alta yazdırır. Bu fonksiyonda yazdırılacak metin ve yazdırılma sayısı olmak üzere iki adet parametre olacaktır.
def yazdir(metin,kacKere):
for i in range (1, (kacKere+1)):
print (metin, end='\n')
#Fonksiyon çağırma
'Merhaba', 5)
yazdir(
>>> Merhaba
>>> Merhaba
>>> Merhaba
>>> Merhaba
>>> Merhaba
Aynı fonksiyon için parametreleri kullanıcıdan alabilirsiniz.
=input('Yazdırılacak metni giriniz: ')
yazdirilacakMetin=int(input('Metin kaç kez yazdırılacak: '))
yazdirmaSayisi
yazdir(yazdirilacakMetin, yazdirmaSayisi)
>>> Yazdırılacak metni giriniz: Kara Murat
>>> Metin kaç kez yazdırılacak: 4
>>> Kara Murat
>>> Kara Murat
>>> Kara Murat
>>> Kara Murat
Örnek 4
Bir sayının asal bir sayı olup olmadığını bulan bir fonksiyon yazabilirsiniz. Fonksiyon, sayı asal ise “True”; değilse “False” değerini döndürecektir.
NOT
“for” döngüsünde sayının yarısına kadar bakmamızın nedeni bir sayının kendi değerinin yarısından önce böleni yok ise sonrasında da olmayacağı kuralıdır.
def asalMi(sayi):
=2 # tüm sayılar 1'e bölüneceğinden 2 ile başlattık
sayacwhile sayac<=int(sayi/2):
if sayi%sayac==0:
return False
+=1
sayacreturn True
#Fonksiyonu çağırma
113)
asalMi(
>>> True
Örnek 5
Verilen sayının faktöriyelini bulan bir fonksiyon tanımlayabilirsiniz. Bir sayının faktöriyeli kendisinden başlayarak 1’e kadar olan tüm sayıların çarpımıdır. 3!=321)
def faktoriyelAl(sayi):
=1
sonucif (sayi==0 or sayi==1):
print('sonuç= ', 1)
elif sayi>1:
for i in range(1, sayi+1, 1):
*=i
sonucprint ('sonuc=', sonuc)
else: print ('0 veya daha büyük sayısal bir değer girmelisiniz')
Yukarıda tanımlanan fonksiyonu çağırmak için kullanıcıdan argüman almanız gerekmektedir.
int(input('Faktöriyeli alınacak sayıyı giriniz: ')))
faktoriyelAl(>>> Faktöriyeli alınacak sayıyı giriniz: 5
>>> sonuc= 120
“faktoriyelAl” olarak tanımlanan fonksiyon “sayi” parametresiyle çalışmaktadır. Argüman olarak bir sayı verildiğinde sayının faktöriyelini hesaplamaktadır. Fonksiyonlar yaptıkları işlemlere göre farklı parametre türlerini kullanır.
Örnek 6
Döngülerde örnek olarak verilen ağaç çizme kodlarını bir fonksiyon hâline getirebilirsiniz.
def agacCiz(agacinYuksekligi, karakter='*'):
=agacinYuksekligi
bfor i in range(1,agacinYuksekligi+1):
print(b*' ',(2*i-1)*karakter)
-=1 b
Şimdi, fonksiyonu kullanıcıdan aldığınız parametrelerle çağırabilirsiniz.
=int(input("Ağacın yüksekliği kaç satır olsun? : "))
agacYuksekligi=input("Ağaç için bir sembol veya karakter girin? : ")
agacKarakteriif agacKarakteri!='' and agacYuksekligi>=1:
0])
agacCiz(agacYuksekligi, agacKarakteri[elif agacKarakteri=='' and agacYuksekligi>=1:
agacCiz(agacYuksekligi)else: print('Hatalı giriş')
>>> Ağacın yüksekliği kaç satır olsun? : 10
>>> Ağaç için bir sembol veya karakter giriniz :
>>> *
***
*****
*******
*********
***********
*************
***************
*****************
*******************
Yukarıda bir “agacCiz” fonksiyonu tanımlanmıştır. Bu fonksiyonun “agacinyuksekligi” ve karakter adlarında iki adet parametresi bulunmaktadır. “agacinYuksekligi” ağacın satır sayısını belirten bir parametredir. Bu parametreye bir argüman (değer) verilmezse fonksiyon hata verir. Böyle parametrelere “zorunlu parametre” denir. Karakter parametresi ise parametre olarak tanımlanırken bir değerle birlikte tanımlanmıştır, bu değer parametrenin varsayılan değeridir. Varsayılan değer olarak “None” boş değer verilebilir. Zorunlu parametreler dışında fonksiyonlarda kullanılan diğer parametreler için varsayılan değerler tanımlanabilir. Eğer kullanıcı karakter olarak bir giriş yapmazsa yani boş bırakırsa fonksiyon ağacı varsayılan olarak “*” karakterini kullanarak oluşturur.
Python’da fonksiyonlardan bazıları sadece bir işlevi yerine getirir ve görevi orada biter. Ama bazı fonksiyonlar bir değer döndürür. “int( )” fonksiyonu verilen argümanı sayıya çevirerek döndürür. Yukarıdaki örneklerde “faktoriyelAl” ve “agacCiz” fonksiyonları bir değer döndürmemektedir. Değer döndüren fonksiyonlarda “return” ifadesi yer alır. Bir fonksiyonun sadece ekrana yazı yazdırması değer döndürdüğü anlamına gelmez. Eğer bir fonksiyonun çıktısı uygun bir değişkene atanabiliyorsa bu fonksiyon değer döndüren bir fonksiyondur.
Örnek 7
Örnekte kullanılan faktoriyelAl() fonksiyonunu değer döndüren bir fonksiyon hâline getirebilirsiniz.
def faktoriyelAl(sayi):
=1
sonucif (sayi==0 or sayi==1):
=1
sonucelif sayi>1:
for i in range(1, sayi+1, 1):
*=i
sonucelse: sonuc=-1 #hatalı bir işlem olduğunu anlamak için -1 değerini veriyoruz
return sonuc
Değer döndüren fonksiyonu aşağıdaki gibi çağırabilirsiniz.
=faktoriyelAl(5)
sonucumuz#fonksiyonu bir değişkene atayabiliyoruz.
if sonucumuz!=-1: # bir hata olup olmadığını kontrol edelim
print(sonucumuz)
else:print('Bir hata oluştu')
>>> 120
Kendi tanımladığınız fonksiyonların içinde temel fonksiyonları ya da tanımladığınız başka fonksiyonları da kullanabilirsiniz
Örnek 8
Kullanıcıdan liste olarak aldığı sayıların ortalamasını bulan bir fonksiyon tanımlayabilir ve bunun içinde len( ) fonksiyonunu çağırabilirsiniz.
def ortalamaBul(sayilar):
=0
sayilarinToplami=0
sayilarinOrtalamasifor i in range(len(sayilar)):
+=sayilar[i]
sayilarinToplami=sayilarinToplami/len(sayilar)
sayilarinOrtalamasireturn sayilarinOrtalamasi
Sayıları kullanıcıdan alarak fonksiyonunuzu çağırabilirsiniz.
=int(input('Kaç adet sayının ortalamasını alacaksınız: '))
sayiAdedi=[]
sayilarimfor i in range(0,sayiAdedi):
print (i+1, '. sayıyı giriniz?')
# indis sıfırdan başladığı için +1 kullandık
=int(input())
sayi
sayilarim.append(sayi)
ortalamaBul(sayilarim)
>>> Kaç adet sayının ortalamasını alacaksınız: 4
>>> 1 . sayıyı giriniz?
>>> 10
>>> 2 . sayıyı giriniz?
>>> 20
>>> 3 . sayıyı giriniz?
>>> 30
>>> 4 . sayıyı giriniz?
>>> 40
>>> 25.0
NOT
Fonksiyonlar bir fonksiyon da dâhil olmak üzere değer olarak her türlü veri tipini döndürebilirler.
Python’da blok yapısından ve girintilerden söz etmiştik. Python’da tanımlanan ve değer atanan değişkenler tanımlandıkları blok içinde geçerlidir. Bir değişken aynı düzeydeki veya daha içerideki girintilerde de değerini korur.
Örnek 9
for i in range (1,3):
print ('i değişkenin değeri=', i)
print ('i değişkenin son değeri=', i)
>>> i değişkenin değeri= 1
>>> i değişkenin değeri= 2
>>> i değişkenin son değeri= 2
“for” bloğu en dışta yer aldığı için i değeri onunla aynı hizada ve daha içerideki girintilerde tanınmakta ve değerini korumaktadır. Ancak sadece iç girintideki bir blokta değer atanan değişken dış bloklarda tanımsızdır. Bu tür değişkenlere yani kendi bloğu ve daha içerideki girintilerde tanınan değişkenlere yerel değişken denir. Bu özellik program yazarken dikkat edilmesi gereken bir durumdur.
Örnek 10
“if” bloğu içinde tanımlanan bir değişkene erişebilirsiniz.
=35
yasif yas ==35:
='yolun yarısı'
degerprint (deger)
>>> yolun yarısı
Örnek 11
Şart sağlanmazsa “if” bloğunun içindeki kodlar çalışmayacaktır. Örnekte bunu deneyebilirsiniz.
=34
yasif yas ==35:
='yolun yarısı'
deger2print (deger2)
>>> NameError Traceback (most recent call last)
>>> <ipython-input-126-3f455a188ff0> in <module>()
2 if yas ==35:
3 deger2='yolun yarısı'
----> 4 print (deger2)
Hata mesajında deger2 adında bir değişkenin tanımlı olmadığı ifade edilmektedir. En dışta tanımlanan (girintisiz) değişkenler global değişkenlerdir. Global değişkenler ilk değerlerini tüm alt bloklara taşırlar.
Örnek 12
Alt bloklarda (iç girintide) aynı değişkene farklı bir değer atanabilir.
=34 # global bir değişken
yas=True
dogumGunuMuif dogumGunuMu==True:
+=1 #yerelde aynı değişken 1 artırılmıştır.
yasprint ('Nice yıllara! Yaş:', yas)
>>> Nice yıllara! Yaş: 35
Örnek 13
if koşulu sağlanamazsa bloğun içindeki kodlar atlanır. Global değişken olarak tanımlanan yas2 değerini korur.
=34 # global bir değişken
yas2=False
dogumGunuMuif dogumGunuMu==True:
+=1 #yerelde aynı değişken 1 artırılmıştır.
yas2print ('Nice yıllara! Yaş:', yas2)
print ('Yaşınız: ', yas2)
>>> Yaşınız: 34
Örnek 14
Aynı şekilde fonksiyonlar içinde tanımlanmış değişkenler yerel (lokal) değişkenler olduğu için fonksiyon çağrılmazsa hata ile karşılaşılır.
def toplamBul (sayiListesi):
=0
toplamfor i in range (len(sayiListesi)):
+=sayiListesi[i]
toplareturn topla
print (topla)
>>> NameError Traceback (most recent call last)
<ipython-input-132-e72b6ce4bac6> in <module>()
----> 1 print (topla)
NameError: name 'topla' is not defined
Örnek 15
Programınızda global bir değişken yazarak işlemi tekrarlayabilirsiniz. topla=0
def toplamBul (sayiListesi):
=0
toplafor i in range (len(sayiListesi)):
+=sayiListesi[i]
toplareturn topla
Fonksiyonu tanımlanmasına rağmen global değişkene atanan değer ekrana yazdırılabilir.
print (topla)
>>> 0
Şimdi de fonksiyonunuzu çağırabilirsiniz.
1, 2, 3, 4, 5])
toplamBul([
>>> 15
Değişkene atanan yeni değer yani fonksiyonun sonucu görülmektedir.