args ve **kwargs kullanımı
Bu yüzden *args
ve **kwargs
kavramlarıyla ilgili zorluk yaşıyorum.
Şimdiye kadar bunu öğrendim:
*args
= argümanların listesi - konumsal argümanlar olarak**kwargs
= sözlük - anahtarları ayrı anahtar kelime argümanları ve değerleri bu argümanların değerleri haline gelir.
Bunun hangi programlama görevi için yararlı olacağını anlamıyorum.
Olabilir:
Listeleri ve sözlükleri bir işlevin bağımsız değişkenleri olarak VE aynı zamanda bir joker karakter olarak girmeyi düşünüyorum, böylece HERHANGİ bir bağımsız değişken geçebilir miyim?
*argsve
**kwargs`ın nasıl kullanıldığını açıklayan basit bir örnek var mı?
Ayrıca bulduğum eğitimde sadece "*" ve bir değişken adı kullanılmış.
*argsve
*kwargssadece yer tutucular mı yoksa kodda tam olarak
argsve
**kwargs` mı kullanıyorsunuz?
1361
3
Sözdizimi
*
ve**
şeklindedir. *argsve
**kwargs` adları yalnızca gelenekseldir, ancak bunları kullanmak için zor bir gereklilik yoktur.Fonksiyonunuza kaç tane argüman aktarılacağından emin olmadığınızda
*args
kullanırsınız, yani fonksiyonunuza rastgele sayıda argüman aktarmanıza izin verir. Örneğin:Benzer şekilde,
**kwargs
önceden tanımlamadığınız adlandırılmış argümanları ele almanızı sağlar:Bunları adlandırılmış argümanlarla birlikte de kullanabilirsiniz. Açık argümanlar önce değer alır ve sonra diğer her şey
*args
ve**kwargs
'a aktarılır. Adlandırılmış argümanlar listede ilk sırada gelir. Örneğin:Her ikisini de aynı işlev tanımında kullanabilirsiniz, ancak
*args
**kwargs
dan önce gelmelidir.Bir fonksiyonu çağırırken
*
ve**
sözdizimini de kullanabilirsiniz. Örneğin:Bu durumda görebileceğiniz gibi, öğelerin listesini (veya tuple'ını) alır ve paketinden çıkarır. Bu sayede onları işlevdeki argümanlarla eşleştirir. Elbette, hem fonksiyon tanımında hem de fonksiyon çağrısında bir
*
olabilir.*args
ve
**kwargs` kullanımının oldukça faydalı olduğu yerlerden biri de alt sınıflamadır.Bu şekilde, Foo hakkında çok fazla bilgi sahibi olmak zorunda kalmadan Foo sınıfının davranışını genişletebilirsiniz. Değişebilecek bir API için programlama yapıyorsanız bu oldukça kullanışlı olabilir. MyFoo sadece tüm argümanları Foo sınıfına aktarır.
*args
ve
kwargsveya
kw` adları tamamen gelenekseldir. Birbirimizin kodunu okumamızı kolaylaştırırKullanışlı olduğu yerlerden biri struct modülünü kullanırken
struct.unpack()
bir tuple döndürürken,
struct.pack()değişken sayıda argüman kullanır. Verileri işlerken
struck.pack()` fonksiyonuna bir tuple aktarabilmek kullanışlıdır, örn.bu yetenek olmadan yazmak zorunda kalırdınız
Bu da format_str değişirse ve tuple'ın boyutu değişirse, geri dönüp o gerçekten uzun satırı düzenlemem gerektiği anlamına gelir