Python programlama dilinin esnekliği, fonksiyonları çağırma biçimindeki çeşitliliğinden da kaynaklanıyor. Bu çeşitlilik, fonksiyon tanımlarında *args ve **kwargs parametrelerini kullanmamızdan geçiyor. Peki nedir bu *args ve **kwargs? Nasıl kullanılır? Yazının devamında bu iki önemli fonksiyon yapısını inceleyeceğiz.
Python’da fonksiyonlar, belirli bir işlem gerçekleştiren kod bloklarıdır. Çoğu zaman bu işlemler belirli giriş verileri gerektirir ve bu verileri fonksiyon çağrılırken fonksiyon ismi ve parantez işaretleri arasına yazarız. Ancak bazı durumlarda, verdiğimiz verilerin sayısı ve türü önceden belirlenemez. Bu gibi durumlarda, Python *args ve **kwargs kullanarak istediğimiz kadar ve tipteki veriyi fonksiyona alabiliyoruz.
Python Fonksiyonları
Python’da bir fonksiyon, belirli bir işlemi yerine getiren değişkenler, ifadeler ve komutlardan oluşan kod bloklarıdır. Bu kod blokları, daha sonra çağrılarak kullanılır. Python’da çok sayıda yerleşik fonksiyon bulunmaktadır ancak kullanıcılar kendi fonksiyonlarını da tanımlayabilir.
Python’da bir fonksiyonu tanımlamak için def anahtar kelimesini kullanırız. Ardından, fonksiyonun ismini ve parantez içinde gerekli olan değişkenleri yazarız. Fonksiyonun gövdesi ise dört boşluk girintisi ile başlar.
Python’da tanımladığımız basit bir fonksiyona bakalım:
def merhaba_dunya():
print("Merhaba dünya!")
Yukarıdaki kodda, merhaba_dunya adında bir fonksiyon tanımlıyoruz. Bu fonksiyon çağırıldığında “Merhaba dünya!” ifadesini ekrana yazdırıyor. Fonksiyonu çağırmak için ise adı ve ardından parantez işaretleri kullanıyoruz.
merhaba_dunya()
Python Argümanları
Fonksiyonlar belirli argümanlar gerektirebilir. Örneğin toplama işlemi yapan bir fonksiyonda iki sayı argümanı gereklidir. Bu durumda argümanlar zorunludur. Zorunlu argümanlar, fonksiyon tanımında yazılır ve fonksiyon çağrılırken sırası ile belirtilir.
Python’da argümanları şu şekilde tanımlayabiliriz:
- – Değişken sayıdaki argümanlar için *args
- – Anahtar kelime argümanları için **kwargs
*args Nedir?
*args, Python’da değişken sayıda argüman almak için kullanılır. Bir fonksiyonda *args kullandığımızda, o fonksiyon çağrıldığında gönderilen tüm argümanlar bir demet (tuple) içinde tutulur.
*args parametresinin kullanımı oldukça basittir. Fonksiyon tanımında *args yazmamız yeterlidir. args yerine istediğimiz herhangi bir isim verebiliriz ancak genel olarak args ismi tercih edilir.
Aşağıdaki örnekte, topla adında bir fonksiyon tanımlıyoruz. Bu fonksiyon, gönderilen tüm argümanların toplamını hesaplıyor:
def topla(*args):
toplam = sum(args)
return toplam
toplam(3,4)
Yukarıdaki kodda, topla fonksiyonu tanımlıyoruz. Fonksiyonun içinde sum() metodunu kullanarak gönderilen tüm argümanların toplamını hesaplıyoruz. Sonuç olarak toplam(3,4) ifadesi 7 sonucunu döndürüyor.
*args ile Parametre Almanın Avantajları
- – Kullanıcı tarafından gönderilen parametre sayısının bilinmediği durumlarda kullanılır.
- – Esneklik sağlar: Kullanıcı istediği kadar parametre gönderebilir.
- – Okunabilirliği artırır: Kod okunabilirliği artar çünkü parametreler açıkça belirtilmiştir.
**kwargs Nedir?
**kwargs, anahtar kelime argümanlarını almak için kullanılır. Anahtar kelime argümanları, her zaman bir isim-değer çifti şeklinde gönderilir. kwargs yerine istediğimiz başka bir isim verebiliriz ancak genel olarak kwargs ismi tercih edilir.
Aşağıdaki örnekte, kişiselBilgiler adında bir fonksiyon tanımlıyoruz:
def kişiselBilgiler(**kwargs):
for anahtar_değer in kwargs.items():
print(anahtar_değer)
kis_bilg = {'isim': 'Mert', 'soyisim': 'Erdoğdu', 'yaş': 23}
kis_bilg = kişiselBilgiler(**kis_bilg)
Yukarıdaki kodda, kişiselBilgiler adlı bir fonksiyon tanımlıyoruz. Bu fonksiyonda **kwargs kullanarak anahtar kelime argümanlarını alıyoruz. items() metodu sayesinde anahtar ve değerleri ayrı ayrı döndürüyoruz.
Ayrıca, kısi_bilg adlı bir sözlük oluşturuyoruz ve kişiselBilgiler() fonksiyonunu çağırırken **kwargs parametresine kısi_bilg sözlüğünü unpack ederek gönderiyoruz.
**kwargs ile Parametre Almanın Avantajları
- – Anahtar kelime argümanlarıyla birlikte değerleri gönderme esnekliği sağlar:
- – Belirli parametreler için varsayılan değerler belirleme imkanı sunar:
- – Okunabilirliği artırır: Anahtar kelime- değer çiftleri açıkça belirtilir.
*args ve **kwargs Kullanımı Birlikte
Bazı durumlarda hem *args hem de **kwargs parametrelerini aynı anda kullanmak isteyebiliriz. Bu durumda fonksiyonun tanımında *args ve **kwargs parametrelerini arka arkaya yazmamız yeterlidir. args ve kwargs isimlerini istediğimiz gibi değiştirebiliriz.
Aşağıdaki örnekte, hem *args hem de **kwargs parametrelerini kullanan bir fonksiyon tanımlıyoruz:
def yeni_fonksiyon(*args, **kwargs):
print(args)
print(kwargs)
yeni_fonksiyon(1, 2, 3, dördüncü=4, beşinci=5)
Yukarıdaki kodda yeni_fonksiyon adlı bir fonksiyon tanımlıyoruz. Bu fonksiyonda *args ile gelen tüm pozitif değerler args değişkeninde tutulurken **kwargs ile gelen anahtar kelime argümanları kwargs değişkeninde tutuluyor. Fonksiyonu çağırdığımızda ise args değişkeni (1, 2, 3) değerini döndürürken kwargs değişkeni {‘dördüncü’: 4, ‘beşinci’: 5} sözlüğünü döndürüyor.
*args ve **kwargs Kullanmanın Avantajları Nelerdir?
- – Esneklik: İstediğiniz kadar parametre geçme özgürlüğü sağlar:
- – Okunabilirlik: Okunabilirliği artırır çünkü parametreler açıkça belirtilmiştir:
- – Varsayılan değerler: Belirli parametreler için varsayılan değerler belirleme imkanı sunar:
- – Kod tekrarını azaltır: Aynı türdeki çok sayıda argümanı ayrı ayrı belirtme zorunluluğunu ortadan kaldırır:
- – Gelecekteki değişikliklere uyum sağlar: Yeni özellikler eklemek için kodu değiştirmeden yeni parametreleri kullanabilme imkanı sunar.
*args ve **kwargs Arasındaki Fark Nedir?
- – *args: Değişken sayıdaki pozisyonel (sırasal) argümanları alır:
- – **kwargs: Anahtar kelime argümanlarını alır (isim-değer çiftleri şeklinde).
*args ve **kwargs Kullanmadan Önce Neler Yapmalıyız?
- – Kullanım Amacını Anlamak: *args ve **kwargs kullanmadan önce bu yapıları neden kullanmak istediğimizi netleştirmeliyiz:
- – Fonksiyon Yapısını Planlamak: Fonksiyonumuzun genel yapısını ve hangi türdeki argümanlara ihtiyaç duyduğunu planlamalıyız:
- – Dökümantasyon Oluşturmak: Fonksiyonumuzun nasıl çalıştığını açıklayan bir dökümantasyon oluşturmalıyız:
- – Varsayılan Değerleri Belirlemek: Gerekiyorsa varsayılan değerler belirlemeliyiz.
Kullanıcıdan Girdi Alırken *args ve **kwargs Kullanmalı Mıyız?
Kullanıcıdan girdi alırken *args veya **kwargs kullanımının gerekliliği kullanım senaryosuna bağlıdır:
- – Kullanıcıdan sabit sayıda veri alacaksak normal input() yöntemini tercih edelim:
- – Belirsiz sayıda veri alacaksak *args veya **kwargs kullanımını düşünelim.