Bu bölümle birlikte decorator fonksiyonların mantığını anlamaya çalışacağız. Decoratorları daha iyi anlamak için fonksiyonlara biraz daha derinlemesine bakmaya çalışalım.
Fonksiyonlara argüman göndermenin esnek bir şekilde yapıldığını biliyoruz. İsterseniz ilk olarak yıldızlı argümanları hatırlamaya çalışalım.
def fonksiyon(*args): # İstediğimiz sayıda argüman gönderebiliyoruz.
print(args)
for i in args:
print(i)
fonksiyon(1,2,3)
(1, 2, 3) 1 2 3
fonksiyon(1,2,3,4,5)
(1, 2, 3, 4, 5) 1 2 3 4 5
def fonksiyon(isim,*args):
print("İsim:",isim)
for i in args:
print(i)
fonksiyon("Murat",1,2,3,4,5,6,7,8)
İsim: Murat 1 2 3 4 5 6 7 8
Şimdi de yeni öğreneceğimiz keyword argümanlara bakalım.
def fonksiyon(**kwargs):
print(kwargs)
fonksiyon(isim = "Murat", soyisim = "Coşkun", numara = 12345)
{'isim': 'Murat', 'soyisim': 'Coşkun', 'numara': 12345}
Dikkat ederseniz 2 yıldız koyarak keyword argümanlar ile (anahtar kelimeli argümanlar) fonksiyonumuzu tanımladık ve argümanlara isim vererek fonksiyonumuzu çağırdığımızda isimleri anahtar kelime , argüman değerlerini değer olarak alarak fonksiyonumuz sözlük oluşturdu. İşte keyword argümanlar bu şekilde kullanılabiliyor.
def fonksiyon(**kwargs):
for i,j in kwargs.items():
print("Argüman İsmi:",i,"Argüman Değeri:",j)
fonksiyon(isim = "Murat", soyisim = "Coşkun", numara = 12345)
Argüman İsmi: isim Argüman Değeri: Murat Argüman İsmi: soyisim Argüman Değeri: Coşkun Argüman İsmi: numara Argüman Değeri: 12345
Şimdi de *args ve **kwargs argümanlarını beraber kullanalım.
def fonksiyon(*args,**kwargs):
for i in args:
print("Argümanlar:",i)
print("------------------------------")
for i ,j in kwargs.items():
print("Argüman İsmi:",i,"Argüman Değeri:",j)
fonksiyon(1,2,3,4,5,6,7,isim = "Murat",soyisim = "Coşkun", numara = 12345)
Argümanlar: 1 Argümanlar: 2 Argümanlar: 3 Argümanlar: 4 Argümanlar: 5 Argümanlar: 6 Argümanlar: 7 ------------------------------ Argüman İsmi: isim Argüman Değeri: Murat Argüman İsmi: soyisim Argüman Değeri: Coşkun Argüman İsmi: numara Argüman Değeri: 12345
Pythonda fonksiyonlar da birer obje oldukları için hem bir tane değişkene atanabilirler, hem de başka bir fonksiyonun içinde tanımlanabilirler. Şimdi bunlara bakmaya başlayalım.
def selamla(isim):
print("Selam",isim)
selamla("Ayşe")
Selam Ayşe
# Bir tane değişkene atıyoruz.
merhaba = selamla
merhaba # Obje tipi fonksiyon oldu.
<function __main__.selamla>
selamla # Obje tipi fonksiyon
<function __main__.selamla>
merhaba("Ayşe") # Fonksiyon olduğu için artık bu isimle de kullanabilirim.
Selam Ayşe
del selamla # Selamla fonksiyonunu siliyorum.
selamla
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-36-476cfa688e53> in <module>() ----> 1 selamla NameError: name 'selamla' is not defined
merhaba("Kemal") # selamla objesi silinmesine rağmen merhaba objesi silinmedi.
Selam Kemal
Şimdi de isterseniz iç içe fonksiyon tanımlamayı öğrenelim.
def fonksiyon():
def fonksiyon2():
print("Küçük fonksiyondan Merhaba")
print("Büyük fonksiyondan Merhaba")
fonksiyon2() # Tanımladığım fonksiyonu kullanabilirim.
fonksiyon()
Büyük fonksiyondan Merhaba Küçük fonksiyondan Merhaba
fonksiyon2() # Lokal bir değişken olduğu için fonksiyon() çağrısından sonra yok oldu.
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-45-3ffe6a5f72a1> in <module>() ----> 1 fonksiyon2() # Lokal bir değişken olduğu için fonksiyon() çağrısından sonra yok oldu. NameError: name 'fonksiyon2' is not defined
def fonksiyon(*args): # args : (1,2,3,4,5,6)
def topla(args): # (1,2,3,4,5,6)
toplam = 0
for i in args:
toplam += i
return toplam
print(topla(args))
fonksiyon(1,2,3,4,5,6)
21
İşte bu kadar ! Bir sonraki dersimizde fonksiyonlara devam edeceğiz.