BAB 8: Tipe Data di Python

Pahami sistem tipe data Python secara mendalam: numerik, string, boolean, None, list, tuple, dictionary, dan set — lengkap dengan karakteristik, perbedaan, dan gotcha yang sering menjebak pemula.

Di bab sebelumnya, kita sudah menyimpan SKOR_MAKSIMAL = 100 dan JUMLAH_SOAL = 20 ke dalam konstanta — dan Python menerimanya tanpa pertanyaan. Tapi ada sesuatu yang belum kita bahas: mengapa 100 berbeda dari "100"? Mengapa nilai_akhir bisa dikalkulasi tapi "Kuis Python" tidak?

Jawabannya ada di tipe data. Setiap nilai di Python punya tipe — dan tipe itu menentukan apa yang bisa dan tidak bisa dilakukan terhadap nilai tersebut. Angka bisa dijumlahkan, teks bisa digabungkan, daftar bisa diurutkan. Ketika kamu mencoba menjumlahkan teks dengan angka, Python akan protes dengan TypeError — karena aturan itu memang ada.

Kamu sebenarnya sudah menggunakan beberapa tipe data sejak bab 6. nama = "Rina" adalah string, umur = 22 adalah integer, aktif = True adalah boolean. Di bab ini kita membongkar apa yang ada di balik masing-masing tipe itu, dan mengenal tipe-tipe lain yang akan sering kamu pakai.

Numerik: int, float, complex

Python punya tiga tipe numerik bawaan. Ketiganya terlihat serupa tapi punya perilaku berbeda yang penting untuk dipahami.

Integer (int) adalah bilangan bulat tanpa desimal. Tidak ada batasan ukurannya — Python bisa menangani bilangan bulat sebesar yang kamu butuhkan tanpa overflow.

Float (float) adalah bilangan dengan desimal. Secara internal Python menggunakan representasi 64-bit sesuai standar IEEE 754, yang berarti ada keterbatasan presisi untuk angka tertentu.

Complex (complex) adalah bilangan kompleks dengan bagian real dan imajiner. Ini tipe yang jarang digunakan pemula tapi penting untuk kalkulasi ilmiah dan sinyal digital.

# kuis.py
from typing import Final

SKOR_MAKSIMAL: Final[int] = 100
JUMLAH_SOAL: Final[int] = 20
NILAI_LULUS: Final[float] = 70.0

skor_pengguna = 17
nilai_akhir = (skor_pengguna / JUMLAH_SOAL) * SKOR_MAKSIMAL

print(type(SKOR_MAKSIMAL))   # <class 'int'>
print(type(NILAI_LULUS))     # <class 'float'>
print(f"Nilai akhir: {nilai_akhir}")
<class 'int'>
<class 'float'>
Nilai akhir: 85.0

Perhatikan bahwa nilai_akhir bertipe float meski SKOR_MAKSIMAL dan skor_pengguna keduanya integer. Ini karena operasi pembagian / di Python selalu menghasilkan float, bahkan jika hasilnya bilangan bulat. Kalau kamu ingin pembagian yang hasilnya integer, gunakan // (floor division).

Python secara otomatis memperlebar tipe numerik saat operasi melibatkan tipe berbeda. int + float menghasilkan float. float + complex menghasilkan complex. Ini disebut type coercion — Python memilih tipe yang “lebih luas” agar tidak kehilangan informasi.

Kamu bisa mengecek tipe data nilai apa pun menggunakan fungsi bawaan type():

print(type(17))       # <class 'int'>
print(type(85.0))     # <class 'float'>
print(type(3+2j))     # <class 'complex'>

String: Teks di Python

String (str) adalah tipe data untuk teks — urutan karakter yang dibungkus tanda kutip. Python memperlakukan string sebagai urutan karakter Unicode, artinya kamu bisa menyimpan teks dalam bahasa apa pun, termasuk aksara non-Latin.

Ada empat cara menulis string di Python, semuanya valid:

# biodata.py
nama = "Rina Kartika"            # kutip ganda, satu baris
kota = 'Bandung'                  # kutip tunggal, satu baris
catatan = """Ini teks
yang panjang
dan bisa multi-baris."""          # triple kutip ganda
pesan = '''Baris pertama
baris kedua'''                    # triple kutip tunggal

Kutip tunggal dan ganda tidak ada perbedaan fungsional — pilih salah satu dan konsisten. Triple quotes digunakan untuk teks yang merentang beberapa baris tanpa harus menyisipkan \n secara manual.

String di Python bersifat immutable — artinya setelah dibuat, konten string tidak bisa diubah secara langsung. Yang kamu lakukan saat “mengubah” string sebenarnya adalah membuat string baru.

String juga mendukung operasi seperti penggabungan dengan + dan pengulangan dengan *:

# biodata.py
sapaan = "Halo, "
nama = "Rina"
pesan_lengkap = sapaan + nama    # penggabungan

print(pesan_lengkap)
print("-" * 20)                  # mencetak 20 tanda hubung
Halo, Rina
--------------------

Untuk menyisipkan variabel ke dalam string, gunakan f-string — cara yang paling mudah dibaca dan direkomendasikan di Python modern. Kamu sudah menggunakannya sejak bab 6: f"Nilai akhir kamu: {nilai_akhir}". Di balik layar, Python memanggil metode __format__ pada setiap nilai yang disisipkan, sehingga pemformatannya fleksibel dan efisien.

Boolean: True dan False

Boolean (bool) hanya punya dua nilai: True dan False. Keduanya harus ditulis dengan huruf kapital di awal — true atau false akan membuat Python error.

# kuis.py
lulus = nilai_akhir >= NILAI_LULUS
print(lulus)           # True atau False tergantung nilai_akhir
print(type(lulus))     # <class 'bool'>

Yang menarik dan perlu kamu pahami: bool di Python adalah subkelas dari int. Artinya True secara teknis sama dengan 1, dan False sama dengan 0.

print(True == 1)    # True
print(False == 0)   # True
print(True + True)  # 2

Ini bukan kesalahan — Python memang merancangnya demikian agar boolean bisa digunakan dalam kalkulasi numerik. Tapi dalam kode sehari-hari, hindari bergantung pada perilaku ini karena bisa membingungkan pembaca kode.

Setiap tipe data di Python punya nilai yang dianggap “benar” (truthy) dan “salah” (falsy). Nilai-nilai yang dianggap False antara lain: 0, 0.0, "" (string kosong), [] (list kosong), {} (dict kosong), None. Semua nilai lainnya dianggap True. Ini akan sangat berguna saat kamu mulai bekerja dengan kondisi di bab if-else.

None: Ketiadaan Nilai

None adalah nilai khusus di Python yang merepresentasikan ketiadaan nilai — setara dengan null di bahasa lain. None adalah satu-satunya nilai dari tipe NoneType.

# kuis.py
jawaban_pengguna = None   # belum ada jawaban yang dimasukkan

print(jawaban_pengguna)   # None
print(type(jawaban_pengguna))  # <class 'NoneType'>

None sering digunakan untuk menandai bahwa sebuah variabel belum memiliki nilai — misalnya data yang belum diisi pengguna, atau hasil dari fungsi yang belum mengembalikan apapun. Di Python, fungsi yang tidak punya pernyataan return secara implisit mengembalikan None.

Untuk memeriksa apakah sebuah variabel bernilai None, gunakan is None — bukan == None. Operator == memeriksa kesetaraan nilai, sedangkan is memeriksa identitas objek. Untuk None, Python menjamin hanya ada satu objek None di seluruh program, sehingga is None adalah cara yang tepat dan lebih cepat.

# Benar
if jawaban_pengguna is None:
    print("Belum ada jawaban")

# Hindari
if jawaban_pengguna == None:
    print("Belum ada jawaban")

List: Kumpulan Data Berurutan

List adalah tipe data yang menyimpan kumpulan nilai dalam urutan tertentu. Nilai-nilai ini disebut elemen, dan setiap elemen bisa diakses menggunakan indeks — posisi numerik yang dimulai dari 0.

# kuis.py
SKOR_MAKSIMAL = 100
JUMLAH_SOAL = 20

daftar_peserta = ["Rina", "Budi", "Sari", "Andi"]
skor_peserta = [85, 72, 91, 68]

print(daftar_peserta[0])   # Rina  (indeks 0 = elemen pertama)
print(skor_peserta[2])     # 91   (indeks 2 = elemen ketiga)
Rina
91

List di Python bersifat mutable — kamu bisa menambah, mengubah, atau menghapus elemen setelah list dibuat. List juga bisa berisi elemen dengan tipe berbeda dalam satu list yang sama, meski dalam praktik sebaiknya satu list berisi elemen sejenis agar kode lebih mudah diprediksi.

# Mengubah elemen
skor_peserta[1] = 78       # Budi dapat nilai baru

# Menambah elemen
daftar_peserta.append("Dewi")
skor_peserta.append(88)

print(daftar_peserta)
print(skor_peserta)
['Rina', 'Budi', 'Sari', 'Andi', 'Dewi']
[85, 78, 91, 68, 88]

Tuple dan Dictionary

Tuple mirip list — kumpulan nilai berurutan yang bisa diakses menggunakan indeks — tapi bersifat immutable. Setelah tuple dibuat, isinya tidak bisa diubah.

# kuis.py
konfigurasi_kuis = (SKOR_MAKSIMAL, JUMLAH_SOAL, NILAI_LULUS)
print(konfigurasi_kuis)       # (100, 20, 70.0)
print(konfigurasi_kuis[0])    # 100

Kapan pakai tuple daripada list? Gunakan tuple untuk data yang memang tidak seharusnya berubah — konfigurasi, koordinat, nilai tetap. Python memproses tuple sedikit lebih cepat dari list, dan tuple bisa digunakan sebagai kunci dictionary karena immutable.

Dictionary (dict) menyimpan data sebagai pasangan kunci-nilai. Berbeda dari list yang menggunakan indeks angka, dictionary menggunakan kunci yang kamu tentukan sendiri untuk mengakses nilai.

# kuis.py
profil_peserta = {
    "nama": "Rina",
    "skor": 17,
    "nilai_akhir": 85.0,
    "lulus": True
}

print(profil_peserta["nama"])
print(f"Status: {'Lulus' if profil_peserta['lulus'] else 'Tidak Lulus'}")
Rina
Status: Lulus

Dictionary adalah tipe data yang akan sangat sering kamu temui — terutama saat bekerja dengan data dari API, database, atau file JSON. Kunci dictionary bisa berupa string, integer, atau tuple (tipe immutable apa pun), sedangkan nilainya bisa berupa tipe data apa pun termasuk list atau dictionary lain.

Set: Koleksi Unik Tanpa Urutan

Set adalah kumpulan nilai yang tidak berurutan dan tidak mengizinkan duplikat. Python secara otomatis membuang nilai yang sama jika kamu mencoba memasukkannya.

# kuis.py
topik_dikuasai = {"variabel", "tipe data", "string", "variabel"}
print(topik_dikuasai)
# {'string', 'tipe data', 'variabel'}  -- "variabel" hanya muncul sekali
{'string', 'tipe data', 'variabel'}

Set berguna saat kamu ingin memastikan tidak ada data duplikat, atau saat perlu operasi himpunan seperti irisan (&), gabungan (|), dan selisih (-).

topik_bab_lalu = {"variabel", "konstanta", "komentar"}
topik_bab_ini = {"variabel", "tipe data", "string"}

topik_baru = topik_bab_ini - topik_bab_lalu   # topik yang belum dipelajari
print(topik_baru)
{'tipe data', 'string'}

Satu hal yang perlu diingat: karena set tidak berurutan, kamu tidak bisa mengakses elemen set menggunakan indeks seperti list atau tuple. Set hanya berguna untuk pengecekan keanggotaan (in) dan operasi himpunan.

Mengecek dan Mengonversi Tipe Data

Python menyediakan type() untuk mengecek tipe data sebuah nilai, dan serangkaian fungsi untuk mengonversi antaratipe.

# kuis.py
skor_input = "17"          # input dari pengguna biasanya berupa string
print(type(skor_input))    # <class 'str'>

skor_angka = int(skor_input)
print(type(skor_angka))    # <class 'int'>
print(skor_angka * 2)      # 34  (kalkulasi numerik berhasil)
<class 'str'>
<class 'int'>
34

Fungsi konversi tipe yang paling sering digunakan: int(), float(), str(), bool(), list(), tuple(). Konversi ini tidak selalu berhasil — misalnya int("halo") akan memunculkan ValueError karena "halo" tidak bisa dikonversi ke angka. Penanganan error ini akan dibahas di bab tersendiri.

Kita sudah punya semua bahan dasar untuk membangun program yang sesungguhnya: variabel menyimpan data, konstanta menjaga nilai yang tidak berubah, dan sekarang kita tahu bahwa setiap data punya tipe yang menentukan perilakunya. Langkah selanjutnya adalah mulai mengolah data itu — menjumlahkan skor, membandingkan nilai, menggabungkan teks. Itulah yang akan kita bahas di bab berikutnya: operator di Python.

Referensi

  1. 1Python Docs — Built-in Types
  2. 2Python Docs — Data Model
  3. 3Real Python — Basic Data Types in Python
  4. 4PEP 8 — Style Guide for Python Code