python dersleri

Python Fonksiyonlar *args ve **kwargs Yapısı

Merhaba Arkadaşlar,
Mobilhanem.com da Python Eğitimi Serisinin bu dersinde Python Fonksiyonlar *args ve **kwargs Yapısı ile birlikteyiz. Bu derste Python da fonksiyonlar için çok önemli bir yapı olan *args ve **kwargs yapılarının ne olduğunu ve nasıl kullanıldığını örnek uygulamalar ile anlatacağım.

*args ve **kwargs Nedir?

Bu yapılar, fonksiyon kullanırken bazen dışardan alacağımız parametre sayısını bilmiyorsak veya parametre sayısı değişkenlik gösteriyorsa kullanılır. Böylelikle fonksiyonumuza dinamiklik kazandırmış oluyoruz. Hemen bir örnekle gösterelim; örneğin girilen sayıları toplayan bir fonksiyon yazalım.

def topla(sayi1,sayi2):
    print(sum([sayi1,sayi2]))

topla(5,3)

Çok güzel fonksiyon çalışıyor peki bir sayı daha ekleyelim bu sefer  üç adet sayıyı toplasın.

def topla(sayi1,sayi2):
    print(sum([sayi1,sayi2]))


topla(5,3,7)
TypeError: topla() takes 2 positional arguments but 3 were given

Evet hata aldık çünkü biz fonksiyonu yazarken iki adet parametre alabileceğini belirttik o zaman düzeltelim.

def topla(sayi1,sayi2,sayi3):
    print(sum([sayi1,sayi2,sayi3]))


topla(5,3,7)

Bu şekilde düzeltmiş olduk. Bu doğru bir kullanım değil çünkü ben tekrar iki sayıyı tek toplamak istediğimde yine fonksiyonu değiştirmek zorunda kalacağım. Benim burada yazdığım fonksiyon sadece iki sayıyı toplayan bir fonksiyon ama ben bunu istemiyorum. Ben istediğim zaman 2 istediğim zaman 10 tane sayıyı toplamak istiyorum. O zaman *args ve **kwargs yapısını kullanacağız.

**args Kullanımı

def topla(*args):
    print(sum(args))

topla(5,3,7)
topla(5,3,7,10,56)

Çıktı:

15
81

Artık dilediğiniz kadar sayı girebilirsiniz. Fonksiyon ne kadar sayı gelirse gelsin gerekli işlemleri yapacaktır. Şu şekilde de kullanabilirsiniz.

def topla(*sayilar):
    return sum(sayilar)

print(topla(5,3,7))
print(topla(5,3,7,10,56))

Çıktı:

15
81

Yine program çalışacaktır. Önemli olan parametre başına (*) koymanız ama kodlarınızın daha okunabilir olması için genel bir standart olan *args şeklinde kullanmanızı tavsiye ederim.

**kwargs Kullanımı

Evet *args ne olduğunu ve nasıl kullanıldığını öğrendik peki *kwargs nedir? Ve aralarındaki fark nedir? Aynı şekilde **kwargs da kaç tane parametre kullanacağımız bilmediğimiz durumlarda kullanıyoruz ama **kwargs anahtar değer ilişkisine dayanıyor. Bunu bir yerden hatırladınız dimi çünkü bu bahsettiğimiz sözlük(dictionary) veri tipinden başka bir şey değil. Hemen bir örnekle gösterelim.

def yazdir(**kwargs):
    print(kwargs)

yazdir(sayi1=5,sayi2=6,sayi3=7) 

Çıktı:

{'sayi1': 5, 'sayi2': 6, 'sayi3': 7}

Görüldüğü gibi çıktı olarak bize bir sözlük veri tipini döndürdü.

*args ve **kwargs Birlikte Kullanımı

Peki aklınıza şöyle bir soru gelmiştir ben *args ve **kwags parametresini kullanabilirmiyim. Hemen bakalım;

def yazdir(*args,**kwargs):
    print(kwargs)
    print(args)

yazdir(5,6,8,sayi1=5,sayi2=6,sayi3=7) 

Çıktı:
{'sayi1': 5, 'sayi2': 6, 'sayi3': 7}
(5, 6, 8)

Burada dikkat etmemiz gereken nokta *args geriye tuple(demet) veri tipini döndürürken *kwargs dictionary(sözlük) veri tipini döndürdü. Ayrıca dikkat edilmesi gereken başka bir nokta daha fonksiyona parametre verirken ilk önce *args parametresini kullandık eğer ilk önce *args değilde *kwargs parametresi kullansaydık ne olurdu. Hemen bakalım.

def yazdir(**kwargs,*args):
    print(kwargs)
    print(args)

yazdir(5,6,8,sayi1=5,sayi2=6,sayi3=7)

SyntaxError: invalid syntax

Evet gördüğünüz gibi syntax hatası aldık. Bu iki yapıyı birlikte kullandığımız fonksiyonlarda *args parametresinin önce kullanılmasına dikkat etmeliyiz.

Mobilhanem.com da Pyhon  Fonksiyonlarda *args e **kwargs Yapısı işledik. Bir sonraki yazımızda görüşmek üzere. Eksik yada yanlış gördüğünüz yada anlamadığınız yerler için çekinmeden ulaşabilirsiniz. Dilerseniz sorularınızı Soru-Cevap kısmında da sorabilirsiniz.

Bütün Python derslerine buradan ulaşabilirsiniz.

133

Cahit İşleyen

Data Scientist at @Embedica.ai
Python ve Linux sever.
Çay tiryakisi

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?