Bu bölümde, daha önceki bölümlerde de kullandığım *args argümanını kullanmayı öğreneceğiz. Ek olarak **kwargs isimli bir argümanı daha göreceğiz. Başlayalım.
*args"args" kelimesi, "arguments" kelimesinin kısaltılmışıdır ve anlamı, "argümanlar" şeklindedir. Bu noktada args kelimesinin başına gelen yıldız (*) işareti programlama camiasında "all/her şey, hepsi" anlamına gelir. Bu argümanı bir fonksiyona verdiğimiz zaman o fonksiyona sayısız şekilde argüman verebiliriz. Hemen nasıl kullanıldığını görelim.

Fonksiyonumun, vereceğim sayıları toplamasını istiyorum. Dolayısıyla def topla(*args): dedim. *args ifadesini argüman olarak verdiğim için fonksiyonu çağırırken istediğimiz kadar sayı girebiliriz. Bunu verdikten sonra result = 0 şeklinde bir tanımlama yaptım. Bu, toplanacak olan sayıların tutulacağı kısım olacak.
Sonrasında bir for döngüsü açtım ve args argümanının çıktısını kontrol ettim. Bu noktada dikkat edeceğiniz şey, başında yıldız işaretinin olmamasıdır. for döngüsünün içerisine de result = result + number şeklinde bir kod yazdım. Bu, args argümanının tuttuğu değerleri tek tek toplayıp result değişkenine atacaktır. Örneğin 3, 4, 6, 2 şeklinde değerler verdik. Python bu noktada aşağıdaki gibi bir yol izleyecektir:
3 + 4 = 7
7 + 6 = 13
13 + 2 = 15
Son olarak for döngüsünün dışına çıktım ve return result diyerek sonucu döndürdüm.
Peki, neden böyle bir şey yaptık? Yani neden direkt olarak result = result + args demedik? Çünkü *args argümanı, aldığı değerleri bir Tuple içerisinde saklar. Tuple içerisindeki değerlere de direkt olarak erişemediğimiz için bir for döngüsü yardımıyla Tuple içerisindeki bütün değerleri tek tek gezdik.
Şimdi, kodu çalıştırmayı deneyelim.

Dikkat ederseniz topla() dediğimde ve parantezlerin içine girdiğimde yukarıda bir ifade beliriyor: "*args: Any". Bu, "ne istersen gir" anlamındadır. Madem öyle, girelim.

topla() fonksiyonunun içerisine 1'den 9'a kadar değerler verdim ve sonuç 45 olarak geldi; doğru bir hesaplama.
Aslında for döngüsüne vesaire hiç gerek yoktu; arkasındaki mantığı görmeniz için öyle yaptım. Bunu, Python'da bulunan gömülü bir fonksiyon yardımıyla daha kolay yapabiliriz. Bakalım.

sum() fonksiyonu, toplama işlemini bizim için yapacaktır. args argümanı, değerleri Tuple içinde tutuyor olmasına rağmen sum() fonksiyonu sayesinde bu işlemi kolayca gerçekleştirebiliyoruz.
Dilerseniz ortalama hesabı da yapabilirsiniz. args argümanı, değerleri Tuple içerisinde tutuyorsa Tuple için len() fonksiyonunu çalıştıramaz mıyım? Elbette, yapabilirim. Bakalım.

Bunun için argümanları sum() fonksiyonu ile topladım ve toplam değerini argümanların uzunluğuna böldüm. Sonuç olarak bir ortalama hesabı yaparken değerleri toplayıp kaç değer varsa sonucu ona bölüyoruz. Burada da aynısını yaptık.
Peki, çarpma işlemini nasıl yapacağız yahut yapabilir miyiz?

Elbette, yapabiliriz. Bunun için yapmamız gereken tek şey, matematiksel operatörü değiştirmektir. Ancak dikkat ederseniz sonuç 0 olarak geldi. Hâlbuki 2*4*8 işleminin sonucu 0 değil, 64 olmalıydı. Bunun sebebi, result değişkenine başlangıç değeri olarak 0 vermemizdir. Bu noktada Python, şöyle bir yol izliyor:
0 * 2 = 0
0 * 4 = 0
0 * 8 = 0
O zaman biz bu değeri 1 olarak ayarlarsak Python, şu şekilde bir yol izleyemez mi?
1 * 2 = 2
2 * 4 = 8
8 * 8 = 64
Sonucu görelim.

Evet, sorun ortadan kalktı. Bu tarz ufak detaylara dikkat ederseniz daha iyi olacaktır.
**kwargsŞimdi, **kwargs ifadesinin ne olduğunu görelim. İlk olarak dikkat etmeniz gereken şey, burada iki adet yıldız işaretinin bulunduğudur. Bu ifadeleri, *args ve **kwargs şeklinde zihnimize kazıyalım. "kwargs" kelimesi, "keyword arguments" kelimelerinin kısaltılmışıdır ve anlamı "anahtar kelime argümanları" şeklindedir.
Normal şartlarda fonksiyonun içerisine name, age gibi bazı argümanlar veriyorduk ve fonksiyonu çağırırken bu argümanlara değer veriyorduk. İşte, **kwargs yapısı sayesinde bu tarzda, istediğimiz kadar argüman belirleyebilir ve onlara değerler verebiliriz. Nasıl olduğuna bakalım.

def showTheKwargs(**kwargs) şeklinde bir fonksiyon oluşturdum ve return kwargs diyerek yalnızca girilen kwargs'ları döndürdüm. Fonksiyonu çağırırken firstName, lastName, age ve isStudent şeklinde 4 adet argüman verdim. İşte, genel olarak **kwargs bu şekilde kullanılıyor.
Çıktı kısmına dikkat ederseniz **kwargs yapısının, aldığı argümanları bir sözlük içerisinde tuttuğunu görebilirsiniz. Madem bu bir sözlük, o zaman sözlük gibi davranmasını isteyebilir miyim? Bence isteyebilirim. O zaman örneğin age anahtarının değerine ulaşmaya çalışalım.

Sözlüğün atandığı değişken kwargs oluyor, öyle değil mi? Nasıl ki *args ifadesini tanımlarken başına yıldız koyuyor ama onu çağırırken yıldız koymuyorsak **kwargs için de aynısı geçerli. O sözlük arka planda aslında kwargs = {...} şeklinde tanımlı olduğu için kwargs.get() diyebilirim. Hatta dict (sözlük) yapısının diğer fonksiyonlarını da kullanabilirim. Zaten gördüğünüz üzere age anahtarını sorguladığımda bana 23 değerini döndürdü.
Bununla istediğiniz gibi oynayabilirsiniz:

*args ve **kwargs ifadeleri bu şekildeydi. İsterseniz son olarak bu ikisini beraber kullanmayı deneyelim.

Burada biri zorunlu argüman olmak üzere *args ve **kwargs argümanlarını tanımladım. Yani ilk önce bir programlama dilinin adını, sonrasında *args ve **kwargs ifadelerinin değerlerini gireceğim. Fonksiyonun yapacağı şey ise sadece bunları ekrana yazdırmak. Oradaki print('*'*50) ifadesi, yazdırılan her bölümü ayıracak 50 adet yıldız işaretini ifade ediyor; çok da önemli değil.
Değerlerimizi girelim.

Kutuların renk uyumuna çok dikkat edelim. Kırmızı kutu, prog_lang argümanının; yeşil kutu, *args argümanının; mor kutu ise **kwargs argümanının değerleridir. Bu noktada Python'un bunu nasıl anladığını yani hangi argümanın hangi değere eşit olduğunu nasıl anladığını merak ediyor olabilirsiniz. Programı çalıştırmadan önce basitçe değinelim.
İlk argüman zaten zorunlu olarak girilecektir. Yani argümanı girdikten sonra virgül koyduğunuz an sizden *args ifadelerini girmeniz beklenecektir. İstediğiniz kadar *args ifadesi girdikten ve virgül koyduktan sonra eğer bir değişken tanımlaması yaparsanız bunun **kwargs olduğunu anlayıp yoluna devam edecektir. Şimdi, kodu çalıştıralım.

Gördüğünüz üzere hepsi gruplanarak doğru bir şekilde getirildi. Dilerseniz bu değerleri de kullanıcıdan alabilirsiniz.

Herhangi bir problem çıkmadı; çok güzel. İşte, *args ve **kwargs bu şekildeydi.
Yayınlanma Tarihi: 2022-12-30 17:14:10
Son Düzenleme Tarihi: 2023-01-01 16:46:50