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.
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:
- Pakai list untuk kumpulan hal-hal sejenis yang bisa bertambah atau berkurang: semua pesanan, semua harga, sebuah antrean.
- Pakai tuple untuk catatan tetap berisi nilai-nilai yang saling terkait, di mana setiap posisi punya arti yang berbeda: pasangan (lintang, bujur), catatan (order_id, date, total), warna RGB seperti
(86, 105, 253).
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".
| List | Tuple | |
|---|---|---|
| Sintaks | [1, 2, 3] | (1, 2, 3) |
| Bisa diubah? | Ya (mutable) | Tidak (immutable) |
| Pemakaian khas | banyak item sejenis | satu record berisi beberapa field |
| Method | banyak (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.
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
- Tuple adalah kelompok berurutan yang immutable:
(a, b, c). Koma yang membuatnya, tanda kurung opsional. - Indexing, slicing, dan
len()bisa dipakai; mengubah item memunculkanTypeError. - List untuk kumpulan hal-hal sejenis; tuple untuk record tetap berisi nilai-nilai yang saling terkait.
- Bongkar dengan
a, b, c = some_tuple. Pakai_untuk nilai yang kamu abaikan dan*restuntuk mengumpulkan sisanya. - Fungsi seperti
divmod()mengembalikan tuple. Tuple bisa menjadi key dictionary; list tidak bisa.