Python “Variable Unpacking” Kavramı
Bu yazımızda, Python programlama dilinde “variable unpacking” olarak adlandırılan değişkenlere birden çok değeri tek bir satırda atama yöntemini ele alacağız.
“Variable Unpacking” Nedir?
“Variable unpacking”, Python’da birden fazla değişkeni aynı satırda, tek bir atama işlemi ile değerlere ayırma işlemidir.
Zaten kelime anlamına bakınca “unpacking” İngilizcede bir şeyi açma veya parçalara ayırma anlamına gelir. “variable unpacking” terimi de kelime anlamından da anlaşılacağı üzere, Python’da değişkenlere birden fazla değeri tek bir satırda atamayı ifade eder. Bu, özellikle çok sayıda değişkenin hızla atanması gereken durumlarda kodun daha okunabilir ve sade olmasını sağlar.
Üç farklı değişkene değer atamak istediğimizi farz edelim. Geleneksel yöntemde her bir değeri ayrı ayrı satırlarda aşağıdaki gibi atardık:
1 2 3 |
x = 5 y = 10 z = 20 |
İşte bu değer atamalarını tek satırda aşağıdaki gibi yapabiliriz:
1 |
x, y, z = 5, 10, 20 |
Acak şunu da belirtmek istiyorum; doğrudan bir eşleme yapacaksanız sağdaki değerler ile soldaki değişkenler mutlaka eşit sayıda olmalıdırlar. Aksi halde bir ValueError
hatası alırsınız. Bakınız:
1 |
x, y = 5, 10, 15 # ValueError: too many values to unpack (expected 2) |
Bu durumu aşmak için *
(yıldız) operatörünü kullanabilirsiniz. Yıldız operatörü ile bir değişkenin birden fazla değeri “liste” içinde toplanır. Örneğin:
1 2 3 |
x, *y = 5, 10, 15 print(x) # 5 print(y) # [10, 15] |
Yukarıdaki örnekte, x
ilk değeri alırken, y
geriye kalan tüm değerleri bir liste olarak almıştır. Ayrıca yıldızlı ifadenin listenin herhangi bir yerinde kullanabileceğinizi de belirtmek isterim. Örneğin:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
*x, y = 5, 10, 15 print(x) # [5, 10] print(y) # 15 x, *y, z = 5, 10, 15, 20, 25 print(x) # 5 print(y) # [10, 15, 20] print(z) # 25 x, y, *z = 5, 10, 15, 20, 25 print(x) # 5 print(y) # 10 print(z) # [15, 20, 25] |
Ancak, bir satırda birden fazla yıldızlı ifade kullanamazsınız. Bakınız:
1 |
*x, *y = 5, 10, 15, 20 # SyntaxError |
Sonuç olarak, eğer *
operatörünü kullanmıyorsanız sağdaki değerler ile soldaki değişkenlerin sayısı eşit olmalıdır. Eğer *
operatörünü kullanıyorsanız, bu kurala uyma zorunluluğunuz yoktur.
Eğer soldaki değişkenlere değer atamak ve sağ taraftaki fazla değerleri göz ardı etmek istiyorsanız, *_
kullanabilirsiniz: x, y, *_ = değerler
x
‘e değerlerin ilk elemanı atanır.y
‘e değerlerin ikinci elemanı atanır._
ile gösterilen kısıma ise geriye kalan tüm değerler atanır ancak bu değişken kullanılmaz ve değerler göz ardı edilir.
1 2 3 4 |
x, y, *_ = 5, 8, 15, 18, 21 print("x:", x) # x: 5 print("y:", y) # y: 8 |
Yukarıdaki örneğimizde 15, 18, 21 değerleri _
adındaki değişkene atanır ama bu değişken kullanılmaz ve bu değerler haliyle göz ardı edilmiş olur.
Python dilinde bu “variable unpacking”, aynı zamanda iterable (yineleyici) olan nesnelerle (örn. listeler, tuple’lar, stringler) çalışırken de oldukça faydalıdır. Aşağıdaki örneği inceleyiniz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#Liste'de unpacking: x, y, z = [1, 2, 3] print(x) # 1 print(y) # 2 print(z) # 3 #Tuple'da unpacking: x, y, z = (1, 2, 3) print(x) # 1 print(y) # 2 print(z) # 3 #String'den unpacking: a, b, c = "ABC" print(a) # A print(b) # B print(c) # C #_ karakteri ile belirli değerleri atlamak: x, _, z = [1, 2, 3] print(x) # 1 print(z) # 3 #Yıldızlı ifade ile birden fazla değeri bir liste içinde toplamak: x, *y, z = [1, 2, 3, 4, 5] print(x) # 1 print(y) # [2, 3, 4] print(z) # 5 |