unpacking - açım kavramı

6718

dolaşılabilir bir nesnenin elemanlarını unpacking yani açım yöntemi ile değişkenlere atayabiliriz. ruby ve python gibi dillerde bunlar uzun zamandır vardır. c#, swift, c++ gibi dillere sonradan eklenmiştir.

eskiden açım işlemi yalnızca demetler üzerinde yapılabiliyordu ama daha sonra tüm dolaşılabilir nesneler açılabilir hale getirilmiştir. yani açım sentaksı genelleştirilmiş oldu.

aşağıdaki 3 sentaks tamamen aynıdır

  • (x, y, z, ...) = <dolaşılabilir nesne>

  • x, y, z, ...   = <dolaşılabilir nesne> yazması kolay olduğu için tercih

  • [x, y, z, ...] = <dolaşılabilir nesne>

bu işlem sırasında sağdaki nesne dolaşılır ve elde edilen değerler sol taraftaki değişkenlere sırası ile atanır.

t = 10, 20, 30
x, y, z = t

ile aşağısı tamamen eşdeğerdir

x = t[0]
y = t[1]
z = t[2]

mesela [x, y, z] = 'ali' ise her değişkene karakterler atanmış olur.


eğer dolaşılabilir nesnedeki eleman sayısı ile sol taraftaki değişken sayısı tutmaz ise ValueError exception oluşur.

>>> x, y = [10, 20, 30]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

açılan dolaşılabilir nesnenin elemanları karışık olabilir, kendileri de dolaşılabilir nesne olabilir.

>>> a, b, c = [10, [2, 3], 40]
>>> a
10
>>> b
[2, 3]
>>> c
40

>>> a, b, c = True, 'alper', 2.5
>>> a
True
>>> b
'alper'
>>> c
2.5

recursive yani özyinelemeli açma işlemi

açılan bir eleman da dolaşılabilir nesne ise onu da açabiliriz.

>>> a, [b, c], d = 10, (20, 30), 40
>>> a
10
>>> b
20
>>> c
30
>>> d
40

yine sol tarafta () ya da [] kullanabiliriz, fark etmez.

tabii bunu sonuna kadar devam ettirmemiz gerekmez.

>>> a, b, c = 10, (20, 30), 40
>>> b
(20, 30)

tüm atama işlemlerinin adres ataması olduğunu hatırlayalım.


swap işlemi

pythonic way olarak swap işlemi python’da a, b = b, a şeklinde yapılabilir. sağdaki ifade aslında bir tuple yani demet bildirir. daha sonra sol taraftaki değişkenlere atama yapılır.

burada işlemler a = b ve ardından b = a şeklinde yapılmaktadır. eğer böyle yapılıyor olsaydı iki değişkende de b nin orijinal değeri olurdu. burada aslında geçici bir demet oluşturulur. ilk başta b neyi gösteriyorsa [0] onu, a neyi gösteriyorsa da [1] onu göstermektedir. Daha sonra a, [0] neyi gösteriyorsa onu, b ise [1] neyi gösteriyorsa onu gösterir. yani günün sonunda swap etmiş oluyoruz.

6925