defgreet(name):"""This function greets to the person passed in as parameter"""print("Hello, "+ name +". Good morning!")
>>>print(greet.__doc__)This function greets to the person passed into the name paramete
💎 Fonksiyon Parametreleri
Fonksiyonlar tanımlandığı vakit varsayılan atamalar yapılır.
Bu yüzden zaman hesaplama gibi işlemleri burada yapmanız mantıklı olmayacak, zaman farkı 0 olarak gelecektir.
defgreet(name,msg="Good morning!"):""" This function greets to the person with the provided message. If message is not provided, it defaults to "Good morning!" """print("Hello",name +', '+ msg)greet("Kate")# Varsayılan parametreyi kullanmagreet("Bruce","How do you do?")# Sıralı parametre vermegreet("Bruce", msg="Naber")# İşaretleyerek paremetre verme
# * ön eki ile ile kaç tane isim gelirse o kadar kullanıyoruz.defgreet(*names):"""This function greets all the person in the names tuple."""# names is a tuple with argumentsfor name in names:print("Hello",name)greet("Monica","Luke","Steve","John")
🧱 Fonksiyon Türleri
defcalc_factorial(x):"""This is a recursive function to find the factorial of an integer"""if x ==1:return1else:return (x *calc_factorial(x-1))num =4print("The factorial of", num, "is", calc_factorial(num))
calc_factorial(4)# 1st call with 44*calc_factorial(3)# 2nd call with 34*3*calc_factorial(2)# 3rd call with 24*3*2*calc_factorial(1)# 4th call with 14*3*2*1# return from 4th call as number=14*3*2# return from 3rd call4*6# return from 2nd call24# return from 1st call
💚 Özyineleyen Fonksiyonların Avantajları
Özyineleyen fonksiyonlar kodun daha temiz ve zarif gözükmesini sağlar
Karmaşık bir görev alt görevlere ayrılarak rahat çözülebilir
İç içe döngülere göre daha iyidir
💔 Özyineleyen Fonksiyonların Zararları
Bazı durumlarda anlaşılabilmesi zordur
Uzun tekrarlarda çok fazla vakit ve zaman harcarlar
Hata ayıklama oldukça zordur
double =lambdax: x *2# lambda fonksiyondefdouble(x): # Fonksiyonreturn x *2
Python ile fonksiyon içinde fonksiyon tanımlamak mümkündür.
İç içe fonksiyonlarda parametreler ortak kullanılır
Kodların derlenme yapısı yukarıdan aşağı olduğu için fonksiyonlar yukarıda (önceden) tanımlanmadan kullanılamaz.
deffunc1(param):# func2() bu alanda kullanılamazdeffunc2():# Parametreler ortak kullanıldığından ek olarak almasına gerek yokturprint("2.", param)print(param)func2()# Bu alanda ekrana '2.Selam' basarfunc1("Selam")
🤯 Karmaşık İç İçe Fonksiyon
deffoo():bar()defbar():foo()
Objelerin ve sınıfların alt fonksiyonlarını dir(<obj>) metodu ile görüntüleyebiliriz.
dir("X")# String metodlarını listelerdir([])# List metodlarını listelerdir(<class>)# Class metodlarını listeler
🤯 Global, Local ve Nonlocal Kavramları
x =5# Global değişkendeffunc1(param): x =4# Nonlocal değişkendeffunc11(): x =1# Local değişken# print(param)# Otomatik olarak üst fonksiyonun parametresini ele alır# print(param)# param = 5# Yukarıdaki işlemde param'a atama yapıldığından `local param` olarak tanımlanır.# Print içindeki param tanımlanmadan kullanılmaktadır, bu sebeple `print(param)` komutu çalışmaz hata verir.# param tanımlanmadan kullanıldı (`nonlocal param` olarak yazılması lazım)print(x)# Python otomatik olarak `global x` deyimini kullanır# x'i global değişkenlerde arar ve ekrana '5' basar# print(x)# x = 3# Yukarıdaki işlemde x'e atama yapıldığından `local x` olarak tanımlanır.# Print içindeki x tanımlanmadan kullanılmaktadır, bu sebeple `print(x)` komutu çalışmaz hata verir.# x tanımlanmadan kullanıldı (`global x` olarak yazılması lazım)global xprint(x) x =3print(x)
x =5defxDegistir(): x =3# Yerel x değişkenine 3 değeri atanır, evrensel x değişmez.defglobalXDegistir():global x x =4# Evrensel x değişir
defscope_test():defdo_local(): spam ="local spam"defdo_nonlocal():nonlocal spam spam ="nonlocal spam"defdo_global():global spam spam ="global spam" spam ="test spam"do_local()print("After local assignment:", spam)do_nonlocal()print("After nonlocal assignment:", spam)do_global()print("After global assignment:", spam)scope_test()print("In global scope:", spam)# After local assignment: test spam# After nonlocal assignment: nonlocal spam# After global assignment: nonlocal spam# In global scope: global spa
🏃♂️ Fonksiyonlarda Hız
Fonksiyonlarda işlem yapılma hızı, manuel (kod satırı olarak) işlem yapılmasından daha hızlıdır.
~%80 daha hızlı çalıştığını script üzerinden görebilirsiniz
Bu değer bilgisayar donanımınıza göre değişiklik gösterecektir
Hafızayı (memorial) kullanan fonksiyonlar tekrarlı (recursive) fonksiyonlardan daha hızlıdır.
from time import time# Obje uzunluğuRANGE =1000# Toplam test sayısıTEST_RANGE =10000# Fonksiyonun yavaş kaldığı testlerin sayısıfunc_slow_count =0# Objeyi oluşturmadata1 = [i for i inrange(RANGE)]data2 = [i for i inrange(RANGE)]data3 = [i for i inrange(RANGE)]avg_func_speed =0for test inrange(TEST_RANGE): first_time =time()# Normal işleme data = []for test2 inrange(len(data1)): data.append(data1[test2])for test2 inrange(len(data2)): data.append(data2[test2])for test2 inrange(len(data3)): data.append(data3[test2]) normal_time =time()- first_time# Fonksiyon ile işlemedeffdata(data1,data2,data3): data = []for test2 inrange(len(data1)): data.append(data1[test2])for test2 inrange(len(data2)): data.append(data2[test2])for test2 inrange(len(data3)): data.append(data3[test2])return data data = [i for i inrange(RANGE)] first_time =time()# Fonksiyon ile veri atama fdata =fdata(data1, data2, data3) func_time =time()- first_timeif normal_time - func_time <0: func_slow_count +=1 avg_func_speed = ( avg_func_speed * test + (normal_time / func_time -1) *100 ) / (test +1)print("Fonksiyon işlemi normalden %" + "%.2f daha hızlı, testlerde " % avg_func_speed + "%" + "%.2f ihtimalle yavaş kalmıştır." %
(func_slow_count *100/ TEST_RANGE))
# Colab çıktılarıFonksiyon işlemi normalden %47.32 daha hızlı, testlerde %0.09 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %46.86 daha hızlı, testlerde %0.21 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %52.29 daha hızlı, testlerde %0.31 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %48.02 daha hızlı, testlerde %0.41 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %46.89 daha hızlı, testlerde %0.53 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %46.73 daha hızlı, testlerde %0.68 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %47.21 daha hızlı, testlerde %0.86 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %47.02 daha hızlı, testlerde %1.09 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %47.60 daha hızlı, testlerde %1.27 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %52.76 daha hızlı, testlerde %1.41 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %48.76 daha hızlı, testlerde %1.74 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %46.28 daha hızlı, testlerde %1.90 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %46.94 daha hızlı, testlerde %2.11 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %46.21 daha hızlı, testlerde %2.25 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %46.50 daha hızlı, testlerde %2.39 ihtimalle yavaş kalmıştır.Fonksiyon işlemi normalden %52.01 daha hızlı, testlerde %2.49 ihtimalle yavaş kalmıştır.