Tuple dan unpacking

Sifat immutable tuple, sintaks unpacking, dan pengembalian beberapa nilai dari fungsi.

Daftar isi

Tuple adalah urutan nilai terurut yang bersifat immutable, yakni isinya tidak dapat ditambah, diubah, atau dihapus setelah dibuat. Sifat ini membuat tuple cocok untuk kelompok nilai yang strukturnya tetap, misalnya satu titik koordinat atau pasangan nama dan peringkat. Topik ini membahas cara membuat tuple, sifat immutable yang menyertainya, sintaks unpacking untuk menyalin isi tuple ke beberapa variabel, hingga pola fungsi yang mengembalikan beberapa nilai sekaligus.

Membuat tuple dan memahami sifat immutable#

Tuple ditulis dengan nilai-nilai yang dipisahkan tanda koma, lazimnya diapit tanda kurung. Pembacaan elemen mengikuti aturan list, yaitu indeks dimulai dari 0 dan indeks negatif dihitung dari akhir. Perbedaan yang mudah terlewat adalah tuple satu elemen, yang wajib diakhiri tanda koma. Tanpa koma, (42) hanya berupa bilangan bulat yang diapit tanda kurung, bukan tuple.

python Contoh: membuat tuple
titik = (3, 7)
print(titik[0], titik[1])
satu = (42,)
bukan_tuple = (42)
print(type(satu).__name__, type(bukan_tuple).__name__)
text Keluaran
3 7
tuple int

Sifat immutable tersebut teruji ketika sebuah elemen berusaha diubah. Python menolak penugasannya dengan error TypeError, bukan diam-diam mengubah nilai, sehingga isi tuple dapat diandalkan untuk tetap sama sepanjang program.

python Contoh: percobaan mutasi tuple
titik = (3, 7)
try:
    titik[0] = 10
except TypeError as e:
    print(type(e).__name__, str(e))
text Keluaran
TypeError 'tuple' object does not support item assignment

Sifat immutable ini bukan sekadar batasan, melainkan jaminan. Tuple yang dikirim ke bagian program lain dapat diandalkan untuk tidak berubah, sehingga tidak perlu salinan pengaman sebagaimana pada list. Kebiasaan yang baik adalah menggunakan tuple untuk data yang sekali dibentuk lalu hanya dibaca, dan menyerahkan perubahan kepada list.

Operasi yang tetap tersedia#

Sifat immutable tidak berarti tuple tak dapat dibaca. Tuple tetap mendukung pengaksesan indeks, fungsi len(), operator in, serta metode count() dan index(). Penggabungan dua tuple dengan operator + juga sah, tetapi hasilnya berupa tuple baru, karena tuple lama tidak mungkin diubah. Isi yang terkunci menjadikan tuple tepat untuk data yang seharusnya tidak berubah, dan sifat inilah yang kelak membuat tuple dapat digunakan sebagai kunci dictionary.

python Contoh: operasi baca pada tuple
ukuran = (38, 40, 42, 40)
print(len(ukuran))
print(ukuran.count(40))
print(40 in ukuran)
gabung = (1, 2) + (3, 4)
print(gabung)
print(ukuran.index(42))
text Keluaran
4
2
True
(1, 2, 3, 4)
2

Nilai 40 muncul dua kali sehingga count() mengembalikan 2, sedangkan index() menemukan 42 pada indeks 2. Penggabungan (1, 2) + (3, 4) menghasilkan tuple empat elemen yang berdiri sendiri, dan tuple aslinya tetap utuh.

Fungsi bawaan min(), max(), dan sum() bekerja pada tuple sebagaimana pada list, karena keduanya sama-sama urutan nilai yang dapat ditelusuri. Konversi dua arah juga tersedia, yaitu list(t) untuk mengubah tuple menjadi list yang dapat diubah, dan tuple(data) untuk mengunci list menjadi tuple. Konversi menyalin isi ke objek baru, sehingga tuple hasil konversi tidak terikat lagi dengan list asalnya.

Unpacking dan pertukaran nilai#

Unpacking adalah proses menyalin isi sebuah urutan nilai ke beberapa variabel sekaligus dalam satu penugasan. Bentuknya a, b = 1, 2, yang membuat nilai 1 masuk ke variabel a dan nilai 2 masuk ke variabel b. Sisi kanan dievaluasi terlebih dahulu sebelum penugasan terjadi, sehingga nilai lama tidak tertimpa saat pertukaran berlangsung. Pola pertukaran nilai memanfaatkan mekanisme yang sama, sehingga tidak membutuhkan variabel bantu sebagaimana lazim di bahasa lain.

python Contoh: pertukaran dua nilai
a, b = 1, 2
a, b = b, a
print(a, b)
text Keluaran
2 1

Tanda bintang (*) memperluas unpacking untuk jumlah elemen yang tidak pasti. Satu variabel bertanda bintang menyerap sisa elemen dalam bentuk list, sehingga pola pertama, tengah, dan terakhir dapat ditulis tanpa mengetahui panjang datanya.

python Contoh: unpacking dengan tanda bintang
nilai = [10, 20, 30, 40, 50]
pertama, *tengah, terakhir = nilai
print(pertama)
print(tengah)
print(terakhir)
text Keluaran
10
[20, 30, 40]
50

Variabel pertama dan terakhir masing-masing menerima satu elemen, sedangkan tengah menyerap tiga elemen sisanya dalam bentuk list. Hanya satu variabel bertanda bintang yang diperbolehkan pada satu penugasan, dan letaknya bebas di awal maupun di akhir.

Unpacking tidak terbatas pada penugasan tunggal, melainkan juga berlaku pada kepala perulangan for. Data berupa pasangan dapat ditulis sebagai for nama, nilai in pasangan, dan setiap putaran membongkar satu pasangan ke dua variabel. Pola inilah yang membuat penelusuran data berpasangan terasa alami pada Python.

Fungsi yang mengembalikan beberapa nilai#

Penugasan tuple juga menjelaskan pola fungsi yang mengembalikan beberapa nilai. Pernyataan return min(nilai), max(nilai) sebenarnya mengemas dua nilai menjadi satu tuple, dan pemanggil dapat langsung membongkarnya dengan unpacking. Pola ini menghindarkan fungsi dari variabel global atau list campuran yang strukturnya tidak jelas.

python Contoh: fungsi mengembalikan tiga nilai
def statistik(nilai):
    return min(nilai), max(nilai), sum(nilai) / len(nilai)

rendah, tinggi, rata_rata = statistik([78, 92, 65, 88])
print(rendah, tinggi, rata_rata)
text Keluaran
65 92 80.75

Fungsi statistik() mengembalikan nilai terendah, tertinggi, dan rata-rata dalam satu tuple. Jumlah nilai 78, 92, 65, dan 88 adalah 323, sehingga rata-ratanya 323 dibagi 4, yaitu 80.75. Setiap variabel penerima di sisi pemanggil memiliki makna yang jelas, dan struktur tuple menjaga ketiganya tetap berpasangan.

Kesalahan umum#

Kesalahan pertama adalah ketidakcocokan jumlah variabel dengan jumlah elemen. Python menimbulkan error ValueError ketika penugasan tidak seimbang.

python Contoh: jumlah variabel tidak cocok
try:
    a, b = (1, 2, 3)
except ValueError as e:
    print(type(e).__name__, str(e))
text Keluaran
ValueError too many values to unpack (expected 2)

Perbaikannya bergantung pada tujuan. Bila seluruh isi ingin dimuat, tambahkan variabel penerima menjadi a, b, c = (1, 2, 3). Bila sisa elemen tidak penting, gunakan variabel bertanda bintang agar sisa itu tertampung tanpa perlu dihitung.

Kesalahan kedua adalah memperlakukan tuple seperti list yang dapat diubah, misalnya memanggil metode penambahannya.

python Contoh: memanggil append pada tuple
t = (1, 2)
try:
    t.append(3)
except AttributeError as e:
    print(type(e).__name__, str(e))
text Keluaran
AttributeError 'tuple' object has no attribute 'append'

Bila datanya memang harus bertambah, konversi dahulu dengan list(t), tambahkan elemen yang diperlukan, lalu kembalikan ke bentuk tuple dengan tuple(...) bila hasil akhirnya harus tetap immutable. Pemilihan tipe sejak awal lebih baik daripada konversi bolak-balik, karena setiap konversi menyalin seluruh isi.

Kesalahan ketiga adalah lupa koma pada tuple satu elemen di dalam pemanggilan fungsi. Ekspresi proses((42)) mengirim bilangan 42, sedangkan proses((42,)) mengirim tuple berisi satu elemen, karena koma itulah penanda tuple dan bukan tanda kurung. Kesalahan ini tidak selalu memunculkan error, melainkan berujung pada perilaku yang keliru secara diam-diam.

Ringkasan#

  • Tuple adalah urutan nilai terurut yang immutable, sehingga cocok untuk data berstruktur tetap dan aman dari perubahan yang tidak disengaja.
  • Unpacking menyalin isi urutan nilai ke beberapa variabel sekaligus, mencakup pertukaran nilai a, b = b, a dan penyerapan sisa elemen dengan tanda bintang.
  • return a, b pada fungsi sebenarnya mengembalikan satu tuple, sehingga pemanggil dapat membongkarnya menjadi beberapa variabel.
  • Jumlah variabel pada unpacking wajib sama dengan jumlah elemen, kecuali ada satu variabel bertanda bintang yang menyerap sisanya.

Referensi#