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ı
Kavram
Açıklama
Erişim
global
Tüm modülde geçerli değişkenler
Okuma
local
Fonksiyonların içerisindeki yerel değişkenler
Okuma ve Yazma
nonlocal
Modül ile fonksiyon arasında kalan, genellikle iç içe fonksiyonlarda kullanılan değişkenler
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.