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:
- Sonraki Makale: Python 3'te Sınıflar Nasıl Oluşturulur ve Nesneler Nasıl Tanımlanır
- Önceki Makale: Python 3'te Fonksiyonlar Nasıl Tanımlanır