Destructuring (juga disebut unpacking) adalah pengambilan data dari collection seperti list atau tuple dan membaginya menjadi nilai variabel secara individual. Ini sangat berguna, karena memungkinkan kita untuk melakukan hal - hal seperti destructuring assignment, dimana kita memberi value ke beberapa variabel sekaligus dari satu collection yang sama.


Standar Destructuring Pada Value


Sama seperti bahasa pemrograman lainnya, python juga dapat melakukan multiple assignment value ke beberapa variabel sekaligus. Contoh :

var1, var2, var3 = 101, 707, 420

Lalu, coba kita lihat output dari variabel - variabel tersebut menggunakan print :

print(var1) # 101
print(var2) # 707
print(var3) # 90

Seperti yang kalian lihat, bahwa variabel - variabel (var1, var2, var3) yang tadi kita assign terisi dengan nilai - nilai (101, 707, 420) dengan urutan yang sama.

Bisa kita simpulkan, destructuring pada nilai (value) hanya perlu memberikan jumlah yang sama pada kedua sisi variabel dan nilai (value).

Lalu bagaimana jika jumlah di sisi variabel ataupun sisi nilai berbeda? misal :

x, y, z = 10, 20
Kode diatas akan menghasilkan ERROR

Disisi variabel berjumlah 3, sedangkan disisi nilai (value) hanya ada 2. Jika kita jalankan kodenya akan error seperti ini.

ValueError: not enough values to unpack (expected 3, got 2)

Destructuring Pada List


Tentunya python juga menyediakan destructuring pada list. Mungkin didalam situasi tertentu, kita dihadapkan masalah yang harus membagi sebuah list menjadi beberapa bagian, dimana kita hanyamengambil satu atau dua nilai dari list dan membiarkan nilai lainnya. Contoh :

awal, *other = [1,2,3,4,6,7]

print(awal) # 1
print(other) # [2,3,4,6,7]

Pada variabel awal hanya mengambil nilai pertama dalam list dan variabel other mengambil sisa datanya.

Jika di JavaScript ada yang namanya Spread Operator (...), maka pada Python kita menggunakan *.

Oke, kita coba dengan kasus lain, dimana kita mengambil nilai pertama dan terakhir dan membiarkan nilai - nilai ditengah. Python menyelesaikan dengan cara seperti ini :

awal, *tengah, akhir = [101,2,3,4,5,6,7,90]

print(awal) # 101
print(tengah) # [2,3,4,5,6,7]
print(akhir) # 90

Destructuring Pada Looping


Penerapan desctructuring juga ada pada saat looping, dan salah satu syntax yang paling vital dalam implementasi ini adalah enumerate. Contoh kode nya seperti ini :

listku = ["Me", "You", "Him"]
for position, subject in enumerate(listku):
    print(position, subject)

# Output :
# 0 Me
# 1 You
# 2 Him

Masih bingung apa yang terjadi pada kode diatas?, Baiklah mari kita bedah bagaimana enumerate bekerja :

listku = ["Me", "You", "Him"]
for example in enumerate(listku):
    print(example)

# [(0, "Me") , (1,"You") , (2, "Him")]

Fungsi enumerate akan mereturn sebuah iterasi berbentuk sekempulan tupple didalam list. Dimana ia mengkelompokan antara nilai dan juga index nilai tersebut dalam list.

Sehingga seperti konsep Destructuring List dapat diterapkan ke dalam bentuk tupple seperti (0, "Me"), dimana 0 adalah index nilai dan "Me" adalah nilai tersebut.

Kalian mungkin terpaku dalam menggunakan fungsi enumerate ini, mari kita pindah ke contoh yang lebih umum dalam sebuah kasus desctructuring pada saat looping :

hewanku = [
  ("Gajah", 4, "Herbivora"),
  ("Harimau", 4, "Karnivora"),
  ("Ayam", 2, "Omnivora"),
]

for hewan, kaki, jenis in hewanku:
  print("Seekor", hewan ,"memiliki Kaki", kaki ,"berjenis", jenis)

# Seekor Gajah memiliki Kaki 4 berjenis Herbivora
# Seekor Harimau memiliki Kaki 4 berjenis Karnivora
# Seekor Ayam memiliki Kaki 2 berjenis Omnivora

Dalam kode diatas kita mengassign tiga nilai didalam tupple ke variabel hewan, kaki dan jenis secara berurutan.

Kode diatas jauh lebih baik dalam keterbacaan kode ketimbang kode dibawah ini :

for hewan in hewanku:
  print("Seekor", hewan[0] ,"memiliki Kaki", hewan[1] ,"berjenis", hewan[2])

Walaupun hasilnya sama, tetapi kode dimana kita menerapkan destructuring menjadi lebih deskriptif, ketimbang hanya mengandalkan anggota index.


Ignoring Values


Uniknya, dalam melakukan destructuring pada sebuah kumpulan nilai (collections), kita juga dapat mengabaikan (ignore) beberapa nilai dari kumpulan nilai tersebut. Contoh :

seseorang = ("Anbi", 30, "Programmer")
nama, _, profesi = person

print(nama, profesi) # Anbi Programmer

Dengan mengassign nilai menggunakan simbol _ (Underscore), maka python menganggap bahwa nilai tersebut diabaikan (ignore). Sehingga dengan cara ini kita dapat secara spesifik menentukan nilai mana saja (didalam list) yang akan digunakan.

Contoh dengan kasus - kasus lain seperti ini :

makan, _, daftar, _, _, harga = ["Telur", 10, "Menu", "Padang", "Sari", 10000]
print(makan, daftar, harga) # Telur Menu 10000

Sama seperti Destructuring List yang dapat menggunakan * untuk mengumpulkan nilai secara jamak, Ignoring Values pun dapat menerapkan *. Contoh :

a , *_ , c = [1,2,3,4,5,6,7,8]
print(a, c) # 1 , 8

*_ , z = [1,3,4,5,6,7,8,10]
print(z) # 10

Ada juga kegunaan dalam looping, jika kita memiliki kasus untuk looping menggunakan for tetapi yang kita butuhkan hanya looping nya saja, tidak datanya. Bisa kita terapkan seperti ini :

for _ in range(10):
  print('ini akan ter print 10 kali')

. . .

Kesimpulan


Destructuring bisa kalian sebut juga sebagai pemecah variabel yang bertujuan untuk mempermudah kita dalam menangani kumpulan nilai atau variabel. Metode ini dapat diterapkan dalam list , perulangan, dan juga dictionary (ini belum saya jelasin hehe). Sekian dan terima kasih.