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")
# Değerlerin kopyalanmasıdefincrease(a):return a +2a =5b =increase(a)# 7print(a)# 5
classHome: name:str age:intdef__init__(self,name:str,age:int): self.name = name self.age = agedefmake_older(home: Home): home.age +=1defnew_home(home: Home): home =Home(home.name, home.age +1)myhome =Home("Any", 10)# Değişkenlerin kopyası aktarılsa dahi içerikleri aynı olduğu için # değiştirilebilirlermake_older(myhome)myhome.age # 11# Değişkenlerin kopyası aktarıldığı için home değerininin kopyası değiştirilmekte, # aslı kalmaktadırnew_home(myhome)myhome.age # 11
# Parametre varsayılan değeri olarak list atanıyordefappend_to(element,to=[]): to.append(element)return to# list içerisine 12 değeri ekleniyormy_list =append_to(12)print(my_list)# [12]# Yine aynı list içerisine 42 ekleniyor ve artık 12,42 değeri oluşuyor# Parametre değerleri tek seferlik atandığından [] objesinin adresi to # değişkenine atanır, list her değiştiğinde to içeriği de değişir halde # olacaktırmy_other_list =append_to(42)print(my_other_list)# [12, 42]
♿ Erişebilirlik
🙄 Python üzerinde private ve public yapısı derleyici tarafından kontrol edilmez
⚖️ Kodun anlaşılabilirliği artırmak için programcılar tarafından belirlenen kurallardır
🌫️ __ ile başlayan fonksiyonlar private olarak algılanır, sınıf dışında önerilerde gözükmezler
🌃 _ ile başlayan fonksiyonlar dosya içinde public dosya dışında private olarak ifade edilir (interval)
🧱 Türler
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
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
🏃♂️ Hız Hakkında
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..
💠 Dahili ve Harici Fonksiyonlar
Dahili fonksiyonlar, python ile gelen hazır fonksiyonlardır ve direkt olarak kullanılabilirler
Harici fonksiyonları kullanmadan önce import <paket> ile paketi dahil etmeniz lazım
Fonksiyonların kullanımı <paket>.<fonksiyon> şeklindedir