0
user Programlama Akademi
15-01-2025 4:39 PM
Python

Python 3'te *args ve **kwargs Nasıl Kullanılır

Giriş

Fonksiyon tanımlarında, parametreler bir fonksiyonun kabul edebileceği argümanları belirleyen adlandırılmış varlıklardır.

Programlama yaparken, kodunuzun tüm olası kullanım durumlarının farkında olmayabilirsiniz ve modül ile çalışan gelecek programcılar ya da kodla etkileşime giren kullanıcılar için daha fazla seçenek sunmak isteyebilirsiniz. Kodumuzda *args ve **kwargs kullanarak bir fonksiyona değişken sayıda argüman geçebiliriz.

*args'ı Anlamak

Python'da *args ifadesi, fonksiyonlara anahtar kelimesiz, değişken uzunlukta argümanlar göndermek için kullanılan bir parametre türüdür. Burada önemli olan yıldız işareti (*)'dir; çünkü args kelimesi geleneksel bir kullanımdır, ancak dil tarafından zorunlu tutulmaz.

Bilgi: Bu öğreticinin örnek kodları ile ilerlemek için yerel sisteminizde python3 komutunu çalıştırarak Python etkileşimli kabuğunu açabilirsiniz. Ardından, örnekleri kopyalayarak, yapıştırarak veya düzenleyerek >>> komut satırından takip edebilirsiniz.

İki argüman kullanan tipik bir fonksiyona göz atalım:

Lets_multiply.py

def carp(x, y):
    print(x * y)

Yukarıdaki kodda, fonksiyonu x ve y parametreleri ile oluşturduk, ardından fonksiyonu çağırdığımızda x ve y'ye karşılık gelen sayıları kullanmamız gerekir. Bu durumda, x için 5,y için 4 tam sayısını geçireceğiz:

Lets_multiply.py

def carp(x, y):
    print(x * y)

carp(5, 4)

Şimdi yukarıdaki kodu çalıştırabiliriz:

$ python lets_multiply.py

Aşağıdaki çıktıyı alacağız, bu da 5 ve 4 tam sayılarının carp(x, y) fonksiyonu ile çarpıldığını gösteriyor:

Çıktı

20

Peki ya sonra, sadece iki sayıyı değil, üç sayıyı çarpmak istersek? Eğer aşağıdaki gibi fonksiyona ek bir sayı eklemeye çalışırsak, bir hata alacağız.

Lets_multiply.py

def carp(x, y):
    print(x * y)

carp(5, 4, 3)

Çıktı

TypeError: carp() takes 2 positional arguments but 3 were given

Eğer ileride daha fazla argüman kullanmamız gerektiğini düşünüyorsanız, parametre olarak *args kullanarak bunu çözebilirsiniz.

Aslında, yukarıdaki ilk örnekte gösterdiğimiz aynı fonksiyonu ve kodu oluşturabiliriz, x ve y'yi fonksiyon parametreleri olarak kaldırarak yerine *args kullanarak

Lets_multiply.py

def carp(*args):
    z = 1
    for num in args:
        z *= num
    print(z)

carp(4, 5)
carp(10, 9)
carp(2, 3, 4)
carp(3, 5, 10, 6)

Bu kodu çalıştırdığımızda, her bir fonksiyon çağrısı için çarpım sonuçlarını alacağız:

Çıktı

20  
90  
24  
900

Çünkü *args kullanarak fonksiyona değişken uzunlukta argümanlar gönderdik, bu sayede istediğimiz kadar argüman geçirebildik.

*args ile daha esnek bir kod oluşturabiliriz, bu da fonksiyon içinde değişken sayıda anahtar kelimesiz argüman kabul etmemizi sağlar.

**kwargs'ı Anlamak

Çift yıldız **kwargs formu, anahtar kelimeli, değişken uzunluktaki argümanları bir fonksiyona göndermek için kullanılır. Yine, burada önemli olan iki yıldız işaretidir (**), çünkü kwargs kelimesi geleneksel olarak kullanılır, ancak dil tarafından zorunlu tutulmaz.

*args gibi, **kwargs istediğiniz kadar argüman alabilir. Ancak, **kwargs'ın *args'dan farkı, anahtar kelimeleri atamanız gerektiğidir.

İlk olarak, fonksiyona gönderdiğimiz **kwargs argümanlarını yazdıralım. Bunu yapmak için kısa bir fonksiyon oluşturacağız:

Print_kwargs.py

def print_kwargs(**kwargs):
    print(kwargs)

Sonra, fonksiyonu bazı anahtar kelimeli argümanlarla çağıralım:

Print_kwargs.py

def print_kwargs(**kwargs):
    print(kwargs)

print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)

Yukarıdaki programı çalıştıralım ve çıktıya bakalım:

$ python print_kwargs.py

Çıktı

{'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'}

Kullandığınız Python 3 sürümüne bağlı olarak, sözlük veri tipi sırasız olabilir. Python 3.6 ve üzeri sürümlerde anahtar-değer çiftlerini sırasıyla alırsınız, ancak daha eski sürümlerde çiftler rastgele sırayla çıktılanacaktır.

Önemli olan, kwargs adı verilen bir sözlük oluşturulması ve bununla diğer sözlüklerle çalıştığımız gibi çalışmamızdır.

Şimdi **kwargs'ı nasıl kullanabileceğimizi göstermek için başka kısa bir program oluşturacağız. Burada, bir isimler sözlüğünü selamlayan bir fonksiyon yaratacağız. İlk olarak, iki ismin bulunduğu bir sözlük ile başlayacağız:

Print_values.py

def print_values(**kwargs):
    for key, value in kwargs.items():
              print("The value of {} is {}".format(key, value))

print_values(my_name="Sammy", your_name="Casey")

Şimdi programı çalıştırabilir ve çıktıya bakabiliriz:

$ python print_values.py

Çıktı

The value of your_name is Casey
The value of my_name is Sammy

Yine, sözlüklerin sırasız olabileceği için çıktınızda önce Casey ismi ya da önce Sammy ismi görünebilir.

Şimdi fonksiyona ek argümanlar geçirelim ve **kwargs'ın istediğiniz kadar argümanı kabul ettiğini görelim:

Print_values.py

def print_values(**kwargs):
    for key, value in kwargs.items():
               print("The value of {} is {}".format(key, value))

print_values(
            name_1="Alex",
            name_2="Gray",
            name_3="Harper",
            name_4="Phoenix",
            name_5="Remy",
            name_6="Val"
        )

Bu noktada programı çalıştırdığımızda aşağıdaki çıktıyı alacağız, yine sırasız olabilir:

Çıktı

The value of name_2 is Gray
The value of name_6 is Val
The value of name_4 is Phoenix
The value of name_5 is Remy
The value of name_3 is Harper
The value of name_1 is Alex

**kwargs kullanmak, programımızda anahtar kelime argümanları kullanmamıza esneklik sağlar. **kwargs'ı parametre olarak kullandığımızda, bir fonksiyona geçireceğimiz argümanların sayısını bilmemiz gerekmez.

Argümanların Sıralanması

Bir fonksiyon veya fonksiyon çağrısında argümanlar sıralanırken, belirli bir sıraya uymaları gerekir:

  • Normal pozisyonel argümanlar
  • *args
  • Anahtar kelime argümanları
  • **kwargs

Pratikte, açık pozisyonel parametreler ile birlikte *args ve **kwargs kullanırken, fonksiyonunuz aşağıdaki gibi görünür:

def ornek(arg_1, arg_2, *args, **kwargs):
    ...

Ve pozisyonel parametreler ile birlikte isimlendirilmiş anahtar kelime parametrelerini, ayrıca *args ve **kwargs kullandığınızda, fonksiyonunuz şöyle görünür:

def ornek2(arg_1, arg_2, *args, anahtar_1="köpekbalığı", anahtar_2="blobfish", **kwargs):
    ...

Fonksiyon oluştururken argümanların sırasını akılda tutmak önemlidir; aksi takdirde Python kodunuzda bir sözdizimi hatası alabilirsiniz.

Fonksiyon Çağrılarında *args ve **kwargs Kullanımı

*args ve **kwargs'ı, fonksiyonlara argüman geçirmek için de kullanabiliriz.

Öncelikle, *args ile bir örneğe bakalım.

Bazi_args.py

def bazi_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

args = ("Sammy", "Casey", "Alex")
bazi_args(*args)

Yukarıdaki fonksiyonda, arg_1, arg_2 ve arg_3 olarak tanımlanan üç parametre vardır. Fonksiyon, bu argümanların her birini yazdırır. Daha sonra bir değişken oluşturup, bir iterable'a (bu durumda bir tuple) ayarlayarak, bu değişkeni yıldızlı sözdizimiyle fonksiyona geçirebiliriz.

Programı python bazi_args.py komutuyla çalıştırdığımızda aşağıdaki çıktıyı alırız:

Çıktı

arg_1: Sammy  
arg_2: Casey  
arg_3: Alex

Yukarıdaki programı bir iterable liste veri türü ve farklı bir değişken adıyla da değiştirebiliriz. Ayrıca, *args sözdizimini bir isimlendirilmiş parametreyle birleştirelim:
bazi_args.py

def bazi_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

benim_listem = [2, 3]
bazi_args(1, *benim_listem)

Yukarıdaki programı çalıştırırsak, şu çıktıyı alırız:

Çıktı

arg_1: 1  
arg_2: 2  
arg_3: 3

Benzer şekilde, anahtarlanmış **kwargs argümanları bir fonksiyon çağırmak için kullanılabilir. Bir değişken oluşturup, 3 anahtar-değer çiftinden oluşan bir sözlüğe (örneğimizde kwargs) atayabilir ve bunu çift yıldızlı sözdizimiyle bir fonksiyona geçirebiliriz:
bazi_kwargs.py

def bazi_kwargs(kwarg_1, kwarg_2, kwarg_3):
    print("kwarg_1:", kwarg_1)
    print("kwarg_2:", kwarg_2)
    print("kwarg_3:", kwarg_3)

kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
bazi_kwargs(**kwargs)

Yukarıdaki programı python bazi_kwargs.py komutuyla çalıştıralım:

Çıktı

kwarg_1: Val  
kwarg_2: Harper  
kwarg_3: Remy

Bir fonksiyon çağırırken, *args ve **kwargs kullanarak argümanları geçirebilirsiniz.

Sonuç

Bir fonksiyon tanımı içinde özel *args ve **kwargs sözdizimini kullanarak, fonksiyona değişken sayıda argüman geçirebiliriz.

*args ve **kwargs'ı kabul eden fonksiyonlar oluşturmak, argüman listesinde giriş sayısının nispeten küçük kalmasının beklendiği durumlarda en iyi şekilde kullanılır. *args ve **kwargs kullanımı, öncelikle okunabilirlik ve kullanım kolaylığı sağlamak içindir, ancak dikkatle yapılmalıdır.


Lisa Tagliaferri tarafından yazılan How To Use args and *kwargs in Python 3 Program makalesinin düzenlenmiş çevirisi.


Daha Fazla Oku:


Bu Makaleyi Paylaş

Yorumlar

yorum Yap