DataLens

Tuple dan kapan memakainya

Kelompok nilai yang tetap dan tidak bisa diubah: bagaimana tuple berbeda dari list, unpacking, dan mengapa immutability adalah sebuah fitur.

Level: Dasar · 8 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Idenya

Tuple itu seperti list yang tidak bisa diubah. Ia adalah kelompok nilai berurutan, ditulis dengan tanda kurung biasa:

location = (-6.2088, 106.8456)     # lintang, bujur Jakarta
order = ("NG-24107", "2024-09-15", 798000)
print(location[0])
print(order[-1])
print(len(order))
-6.2088
798000
3

Indexing, index negatif, slicing, dan len() semuanya bekerja persis seperti pada list. Yang tidak bisa kamu lakukan adalah mengubah tuple setelah ia ada:

order[2] = 800000
TypeError: 'tuple' object does not support item assignment

Jadi kenapa kamu menginginkan list yang kehilangan fitur? Karena "ini tidak bisa berubah" adalah sebuah janji, dan janji membuat kode lebih mudah dipercaya.

Analogi

List adalah daftar belanja di papan tulis: kamu terus menambah dan mencoret. Tuple adalah struk yang sudah dicetak: ia mencatat persis apa yang terjadi, dan tidak boleh ada yang mengeditnya setelah itu.

List versus tuple

Patokan yang dipakai programmer Python berpengalaman:

Di list, setiap item memainkan peran yang sama. Di tuple, posisi 0 bisa berupa nama, posisi 1 kota, dan posisi 2 jumlah. Itu sebabnya tuple sering disebut "record ringan".

ListTuple
Sintaks[1, 2, 3](1, 2, 3)
Bisa diubah?Ya (mutable)Tidak (immutable)
Pemakaian khasbanyak item sejenissatu record berisi beberapa field
Methodbanyak (append, sort…)hanya count dan index

Membuat tuple

Tanda kurungnya sebenarnya opsional. Yang membuat tuple adalah koma-nya:

point = 3, 4
print(type(point))
single = ("Jakarta",)
not_a_tuple = ("Jakarta")
print(type(single), type(not_a_tuple))
<class 'tuple'>
<class 'tuple'> <class 'str'>

Tuple satu item butuh koma di belakang: ("Jakarta",). Tanpa koma itu, tanda kurungnya hanyalah kurung pengelompokan biasa dan kamu mendapatkan string biasa. Kamu jarang butuh tuple satu item, tapi sekarang kamu tidak akan bingung saat melihatnya.

Kamu bisa mengubah list menjadi tuple dengan tuple(), dan sebaliknya dengan list():

cities = ["Jakarta", "Bandung"]
frozen = tuple(cities)
print(frozen)
print(list(frozen))
('Jakarta', 'Bandung')
['Jakarta', 'Bandung']

Unpacking: kekuatan super yang sebenarnya

Unpacking (membongkar) memberikan setiap item tuple ke variabelnya sendiri dalam satu baris. Kamu sudah memakainya untuk menukar nilai di modul variabel; sekarang kamu bisa melihat apa yang sebenarnya terjadi:

order = ("NG-24107", "2024-09-15", 798000)
order_id, date, total = order
print(order_id)
print(total)
NG-24107
798000

Jumlah nama di sebelah kiri harus sama dengan jumlah item. Unpacking mengubah order[2] (index 2 itu apa ya tadi?) menjadi total, yang menjelaskan dirinya sendiri.

Kalau kamu hanya butuh sebagian nilainya, konvensinya adalah memakai _ untuk nilai yang kamu abaikan, dan * untuk mengumpulkan "sisanya" ke dalam list:

order_id, _, total = order
print(order_id, total)

first, *others = ["Ayu", "Budi", "Citra", "Dimas"]
print(first)
print(others)
NG-24107 798000
Ayu
['Budi', 'Citra', 'Dimas']

Mengembalikan beberapa nilai

Tuple muncul setiap kali sepotong kode mengembalikan lebih dari satu nilai. Fungsi bawaan Python divmod() mengembalikan hasil floor division dan sisanya sekaligus, sebagai tuple:

result = divmod(135, 60)
print(result)
hours, minutes = divmod(135, 60)
print(f"{hours} h {minutes} min")
(2, 15)
2 h 15 min

Saat kamu menulis fungsimu sendiri di modul berikutnya, kamu akan mengembalikan tuple dengan cara yang sama, dan pemanggilnya akan membongkarnya.

Tuple sebagai key dictionary dan anggota set

Karena tuple tidak bisa berubah, Python bisa memakainya di tempat-tempat yang tidak mengizinkan list, seperti key dictionary dan item set (keduanya dibahas berikutnya). Misalnya, dictionary berisi ongkos kirim dengan key berupa pasangan (from_city, to_city) terasa alami dengan tuple dan mustahil dengan list.

route = ("Jakarta", "Bandung")
print(hash(route) == hash(("Jakarta", "Bandung")))
True

Istilah teknisnya adalah hashable: Python bisa menghitung sidik jari tetap (sebuah hash) untuk nilai itu karena ia tidak pernah berubah. List tidak hashable, karena isinya bisa berubah setelah sidik jarinya diambil.

Awas

Tuple hanya sebeku isinya. Tuple yang berisi list, seperti (1, [2, 3]), tidak bisa diganti item-itemnya, tapi list di dalamnya tetap bisa diubah. Buat tuple dari nilai-nilai sederhana (angka, string, tuple lain) dan ia akan berperilaku seperti yang kamu harapkan.

Mengapa ini penting untuk kode bersih

Memilih tuple memberi tahu pembaca berikutnya "kelompok nilai ini saling terkait dan tidak akan berubah". Itu informasi yang tidak perlu mereka cari tahu sendiri. Dikombinasikan dengan unpacking (order_id, date, total = order), tuple memungkinkanmu memberi setiap nilai nama yang bermakna saat kamu memakainya, alih-alih menyebar index misterius seperti row[2] di seluruh kodemu.

Rangkuman

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.