Merhaba, bu içerikte sizlerle Python’da fonksiyon yapılarını inceleyeceğiz.Daha önce bir yazılım diliyle uğraştıysanız ve fonksiyon yapısını biliyorsanız bu parağrafı geçebilirsiniz. Yeni başlayan ardaşlar için “Fonksiyon nedir?” sorusunu yanıtlayalım. Yazmış olduğunuz bir kodu program içersinde veya diğer projelerinizde kullanmanız gerekebilir. Yazılan kod yapısını tekrardan yazmak yerine bir kez fonsiyon haline getirdiğinizde bir iki adımda onca kodu tekrardan çalıştırabilirsiniz. Bu temel yapıs nedeniyle fonksiyonlar programcılıkta olmazsa olmazlardandır. Daha basit bir örnekle bir otomobil fabrikasında bazı makinaların bazı işleri sürekli olarak yapıyor olmasını fark etmişsinizdir. Bir demir sacın banda yerleştirilmesiyle başlayan bu üretim işlemi bu makinalar sayesinde daha hızlı ve çok sayıda araç üretmemizi sağlamaktadır. Bu fabrikadaki makinaların ne yapacağını ve nasıl yapacağını onlara birkez söylüyorsunuz ve olarda bıkmadan usanmadan sizin söylediklerinizi yaparak ürünü ortaya çıkarıyorlar. Bu hikayede fonksiyon yapsı ile ilişkili olan kısım oto harekatları yapan makinaların bir serfer programlanıyor olup daha sonraki araç üretimlerinde sürekli aynı şekilde çalışıyor olmalarıdır. Bizde bir fonksiyon tanımlaması yaparak sürekli yapacağımız işleri tek satırda binlerce kodu çalıştıracağız.
Şimdi sizlerle bir fonksiyon tanımlayalım.
1 2 3 4 5 6 7 8 9 10 | def yaz(): print("Merhaba PYTHON") yaz() ###################Ekran Çıktısı########################### #Merhaba PYTHON ###################Ekran Çıktısı########################### |
Yukarıda bir kez def ile yaz fonsiyonunu tanımladık. Bu fonksiyonda yapılması gereken kodları bir satır içeri girerek yazdık. Tekrar fonksiyonumuzun çalışmasını için yaz() fonksiyonunu tekrardan çağırdık. Artık programın her hangi bir yerinde yaz() fonksiyonunu çağırdığımızda ekrana bir selamlama mesajı verecektir
Şimdide bir ürünün kdvli fiyatını hesaplayan kodu yazalım.
1 2 3 4 5 6 7 8 | def kdv(): print(100+(100*0.18)) kdv() ###################Ekran Çıktısı########################### #118.0 ###################Ekran Çıktısı########################### |
Yukarıdaki örnekte 100 liralık bir ürünün 0.18 kdv oranı ile hesaplamasını yaptık. Peki bütün ürünlerimiz 100 lira mı? Hayır. Tabi vergi oranlarıda bazı ürünlere göre değişmektedir. İşte bu gibi durumların önüne geçmek için fonksiyonumuza dışarıdan parametre gönderelim. Yani fiyatı ve kdv oranını verelim o bize hesaplamayı yapsın.
1 2 3 4 5 6 7 8 9 10 11 | def kdv(fiyat,kdv): tutar=fiyat+(fiyat*kdv) print("{} liralık ürünün {} kdv'li fiyatı {} liradır.".format(fiyat,kdv,tutar)) kdv(100,0.18) kdv(1000,0.08) ###################Ekran Çıktısı########################### #100 liralık ürünün 0.18 kdv'li fiyatı 118.0 liradır. #1000 liralık ürünün 0.08 kdv'li fiyatı 1080.0 liradır. ###################Ekran Çıktısı########################### |
Yukarıdaki örnekte kdv(fiyat,kdv)
fonksiyonumuza iki tane değişken tanımladık ve bunları bir birinden ayrımak için “,” virgül kullandık. Bu sayede istediğimiz
fiyatın, belirlenen kdv oranında hesaplanıp ekrana çıktı vermesini sağladık.
Programı yazarken daha da işleri kolaylaştırmak için bazen varsayılan değerler vermemiz gereke bilir. Örneğin temel gıdalarda 0.8 vergi oranı kullanılırken özel tüketim ürünlerinde 0.18 vergi oranı kullanılmaktadır. Biz fonksiyonumuza varsayılan olarak 0.08 değerini tanımlayalım ve istediğimizde o oranı değiştirelim.
1 2 3 4 5 6 7 8 9 10 11 | def kdv(fiyat,kdv=0.08): tutar=fiyat+(fiyat*kdv) print("{} liralık ürünün {} kdv'li fiyatı {} liradır.".format(fiyat,kdv,tutar)) kdv(100) kdv(128,0.18) ###################Ekran Çıktısı########################### #100 liralık ürünün 0.08 kdv'li fiyatı 108.0 liradır. #128 liralık ürünün 0.18 kdv'li fiyatı 151.04 liradır. ###################Ekran Çıktısı########################### |
Yukarıdaki öreneğimizde kdv fonksiyonumuzun ikinci parametresine varsayılan olarak 0.08 kdv değerini tanımladık. Bu sayede kdv(100) şeklinde tek parametre vererek çağırdığımızda varsayılan kdv oranı olan 0.08 üzerinden hesaplayacaktır. Yine ikinci örneğimizde ise kdv oranını 0.18 olarak belirledik.
Program yazarken bazen fonsiyonlara parametre göndermeyi unutuyoruz. Bu gibi durumlarda sistem ölümcül hatalar vermektedir. Bunların önüne geçmek için parametre varsayılanı olarak None değeri ataması yaparak değer kontrolü yapabilir ve kullanıcıya uyarı mesajı verebiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def kdv(fiyat=None,kdv=0.08): if fiyat==None: print("Lütefen bir fiyat değerin gönderiniz."); else: tutar=fiyat+(fiyat*kdv) print("{} liralık ürünün {} kdv'li fiyatı {} liradır.".format(fiyat,kdv,tutar)) kdv() kdv(100) ###################Ekran Çıktısı########################### #Lütefen bir fiyat değerin gönderiniz. #100 liralık ürünün 0.08 kdv'li fiyatı 108.0 liradır. ###################Ekran Çıktısı########################### |
Yukarıdaki örnekte ilk kdv fonksiyonu çağırımında bir parametre göndermedik ve sistem bize bir mesaj yazdı. Daha sonra kdv fonksiyonuna parametre gönderimi sağladık ve bu sayede fonksiyon sorunsuz çalıştır. Burda dikkat edilmesi gereken husus sistemin ilk fonsiyon kullanımında ölümcül hatay düşmeyip ikinci fonksiyonu çalıştırabiliyor olmasıdır.
Tabi müşteriler bir mağzadan bir tane ürün almıyor. Yani birden fazla ürünün kdv oranını hesaplamamız gerekebilir. Şimdi kaç adet olduğunu bilmeden gönderdiğmiz ürün fiyatlarını kdv’li fiyatların hesaplatalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def kdv(*fiyat,kdv=0.08): tutar=0; for i in fiyat: tutar+=i+(i*kdv) print("{} adet ürünün {} kdv'li fiyatı toplamı {} liradır.".format(len(fiyat),kdv,tutar)) kdv(100,100,300) kdv(100,100,300,500,kdv=0.18) ###################Ekran Çıktısı########################### #3 adet ürünün 0.08 kdv'li fiyatı toplamı 540.0 liradır. #4 adet ürünün 0.18 kdv'li fiyatı toplamı 1180.0 liradır. ###################Ekran Çıktısı########################### |
Burda dikkat edilmesi gereken husus kdv(*fiyat,kdv=0.08)
fonksiyonu tanımlanırken “*fiyat” parametresinde kullanılan * işaretidir. Bu 256 adede
kadar parametre gönderebileceğimiz anlamına gelir. Bizde ilk örnektede üç adet ürün fiyatı gönderiyoruz ve var sayılan kdv oranı üzerinden hesaplatıyoruz. Sonraki
örneğimizde ise parametre sayısını bir artırıyoruz ve yanı zamanda kdv=0.18 parametresine kdv oranını değiştirerek atıyoruz ve bu sayede son kdv oranından dört adet
ürünün hesaplamasını yapıyoruz.
Fonksiyon tanımlamalarında bazen parametre isimlerinide dinamik olarak belirleyebilirsiniz. Aşağıdaki öreneği iyice inceleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def kdv(**fiyat): ozelKdv=0.18 temelKdv=0.8 tutar=0 for i in fiyat['ozelTuketim']: tutar+=i+(i*ozelKdv) for i in fiyat['temelTuketim']: tutar+=i+(i*temelKdv) print("Temel Gıda adet {} Özel Tüketim Adet {} Toplam {}".format(len(fiyat['temelTuketim']),len(fiyat['ozelTuketim']),tutar)) print(fiyat) kdv(ozelTuketim=[100,100,25],temelTuketim=[500,200]) ###################Ekran Çıktısı########################### #Temel Gıda adet 2 Özel Tüketim Adet 3 Toplam 1525.5 #{'ozelTuketim': [100, 100, 25], 'temelTuketim': [500, 200]} ###################Ekran Çıktısı########################### |
Bu öreneğizde ana parametremizi **fiyat şeklinde tanımlıyoruz. Bu tanımlama aslında paramatre isimleri ile parametre değerlerini bize bir dizi olarak göndermektedir. Bizde bu listeyi istediğimiz gibi değerlentirmekteyiz.
Fonksiyonların diğer önemli bir özelliğide geriye değer göndermesidir. Yani şuana kadar yapmış olduğumuz fonksyonlarda işlem sonrası ekrana çıktı verdik. Bu çıktıyı fonksiyon içerisinde değilde fonksiyon işlemi bitidikten sonra ana kod bloğunda vermek istersek ne olacak? Aşağıdaki kodlamamız bu na bir örnek teşkil edecektir.
1 2 3 4 5 6 7 8 9 | def kdv(fiyat,kdv=0.08): return fiyat+(fiyat*kdv) print("Kdv'li toplam fiyatı : {}".format(kdv(1000))) ###################Ekran Çıktısı########################### #Kdv'li toplam fiyatı : 1080.0 ###################Ekran Çıktısı########################### |
Yukarıdaki örnekte kdv() fonksiyonumuz içerisinde return
kodu fonksiyon içerisinde hesaplamanın sonucunu geriye göndermiştir. Bu geriye gönderilen
değeri print parametresiyle ekrana basmaktayız.
Fonksiyonlarda dikkat edilmesi gerekn diğer husus global değişkenlerdir. Fonsiyon dışında kullanılan değişkenlere global değişken denmektedir. Bu değişkenler fonksyion içerisinde rahatlıkla kullanılmaktadır.
1 2 3 4 5 6 7 8 9 10 11 | kdvOrani=0.08 def kdv(fiyat): return fiyat+(fiyat*kdvOrani) print("Kdv'li toplam fiyatı : {}".format(kdv(100))) ###################Ekran Çıktısı########################### #Kdv'li toplam fiyatı : 108.0 ###################Ekran Çıktısı########################### |
Yukarıdaki örneğimizden de anlaşılacağı gibi fonksiyon dışında tanımlamış olduğumuz kdvOrani
adlı değişkenimizi kdv()
fonksiyonumuz içerisinde de kullanmış olduk.
Bazende fonsiyon içersindeki bir değişkeni fonksiyon dışında da kullamak isteye bilirsiniz. İşte bu gibi durumlarda yapmanız gereken fonsiyon içerisindeki
değişkeni global degisken
şeklinde tanımlamanız gerekmektedir.
1 2 3 4 5 6 7 8 9 10 | def kdv(fiyat,kdvOrani=0.08): global tutar tutar=fiyat+(fiyat*kdvOrani) kdv(100) print("Kdv'li toplam fiyatı : {}".format(tutar)) ###################Ekran Çıktısı########################### #Kdv'li toplam fiyatı : 108.0 ###################Ekran Çıktısı########################### |
Yukarıdaki örneğimizde kdv() fonksiyonu içerisinde kullanmış oldğumuz tutar değişkenini global olarak tanımlayarak fonsiyon dışında da kullanabildik.
Python Yield Kullanımı
Python yield, oluşturulan bir fonskiyondan geriye dönecek değerleri adım adım göndermek için kullanılır. Return değeri tek seferde değer dönerken yield bunun tam aksini yapar.
1 2 3 4 5 6 7 | def func_2(num): import random #random sınıfını dahil ettik (rasgele sayı üretmek için) for i in range(num):#fonksiyona girilen sayı kader bir range() ile döngü sağladık. return random.randint(0,1000) #retrun ile sayıyı geriye dönderdik. print(func_2(10)) #Ekran Çıktısı #400 |
Yukarıda yapmış olduğumuz fonskiyonda return ilk döngüde çekilen sayıyı döndürdükten sonra işlem duruyor. Bunu birde yield ile yapalım.
1 2 3 4 5 6 7 8 9 | def func_2(num): import random #random sınıfını dahil ettik (rasgele sayı üretmek için) for i in range(num):#fonksiyona girilen sayı kader bir range() ile döngü sağladık. yield random.randint(0,1000) #retrun ile sayıyı geriye dönderdik. print(func_2(10)) print(*func_2(10)) #Ekran Çıktısı #<generator object func_2 at 0x000001E4F4059620> #202 47 553 418 153 331 971 477 49 855 |
Bu fonksiyon değerlerini adım adım döndürmesi için yield kullanıyoruz. Dönen değer ekrana bastığımızda generator bir değer basıyor. Liste mantığında önüne *
işareti eklediğimizde değerlerimizi alıyoruz. Aşağıdaki örneği daha sade ve next()
metodu ile yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def func_3(): yield 1 yield 2 yield 3 yield 4 sayi=func_3() print(next(sayi)) print(next(sayi)) print(next(sayi)) print(next(sayi)) #Ekran Çıktısı #1 #2 #3 #4 |
Fonksiyonumuzu bir kere çalıştırıp sayi
adında değişkenimize alıyoruz daha sonra next()
metodu ile ekrana
tek tek basıyoruz.
Python fonsiyonlar konusunda sizlerle paylacaklarım bu kadar. Faydalı olması umuduyla BAŞARILAR.