*args ve **kwargs ile Esnek Fonksiyonlar
Bir fonksiyonu yazarken bazen kaç parametre alacağını önceden bilemezsin. args ve kwargs bunu çözer. İlki sınırsız pozisyonel argüman, ikincisi sınırsız anahtar argüman kabul etmeni sağlar.
args, fonksiyona istediğin kadar değer geçebilmeni sağlar. Fonksiyon içinde bu değerler bir demet (tuple) olarak toplanır. Örneğin bir hesap makinesi yap, kaç sayı ekleyeceğini bilemiyorsun.
1def topla(*sayilar):2return sum(sayilar)34print(topla(5, 10)) # 155print(topla(5, 10, 15, 20)) # 50Gördüğün gibi aynı fonksiyona 2 ya da 4 sayı geçebilirsin. sayilar içinde hepsi toplanır.
kwargs ise anahtar-değer çiftleri (keyword arguments) kabul eder. Fonksiyon içinde bunlar bir sözlük (dictionary) olur. Mesela bir kişi profili oluştur, her seferinde farklı bilgiler ver.
1def profil_yap(**bilgiler):2for anahtar, deger in bilgiler.items():3print(f"{anahtar}: {deger}")45profil_yap(ad="Ali", yas=28, sehir="İstanbul")6# Çıktı:7# ad: Ali8# yas: 289# sehir: İstanbulÇoğu zaman ikisini aynı fonksiyonda kullanırsın. Sıra önemli: önce normal parametreler, sonra args, en sonda kwargs.
1def rapor_yaz(baslik, *satirlar, **ayarlar):2print(f"=== {baslik} ===")3for satir in satirlar:4print(satir)5print(f"Yazı tipi: {ayarlar.get('font', 'Arial')}")6print(f"Boyut: {ayarlar.get('boyut', 12)}")78rapor_yaz(9"Aylık Rapor",10"Satış arttı",11"Maliyetler düştü",12"Müşteri memnuniyeti yüksek",13font="Times",14boyut=1415)16# Çıktı:17# === Aylık Rapor ===18# Satış arttı19# Maliyetler düştü20# Müşteri memnuniyeti yüksek21# Yazı tipi: Times22# Boyut: 14Bu yaklaşım çok esnek. Fonksiyonu yazarken tüm ihtimalleri önceden düşüp parametre listelemek zorunda kalmazsın. Kullanıcı ne kadar bilgi vermek isterse versin, fonksiyon bunu işler.
Pratik bir tavsiye: *args ve kwargs kullanırken, fonksiyonun ne beklediğini docstring'de açıkla. Böylece kodu okuyan kişi karışmaz.
0 yorum