Pendalaman string

Metode string, konsekuensi sifat immutable, dan dasar-dasar Unicode.

Daftar isi

String adalah urutan karakter yang bersifat immutable dan menjadi tipe utama untuk teks pada Python. Topik ini memperdalam metode string yang paling sering dibutuhkan, menelusuri konsekuensi sifat immutable tersebut, dan menyingkap dasar-dasar Unicode yang menentukan cara karakter dihitung serta dinyatakan sebagai angka. Setiap metode diperkenalkan bersama keluarannya sehingga efeknya terlihat langsung.

Membersihkan dan mengubah huruf#

Metode strip() membuang spasi di awal dan akhir string, metode lower() mengubah seluruh huruf menjadi kecil, dan metode upper() mengubahnya menjadi besar. Ketiganya sering dirangkai pada pembersihan masukan pengguna, misalnya sebelum data disimpan atau dibandingkan dengan nilai lain.

python Contoh: strip, lower, dan upper
teks = "  Python Dasar  "
print(teks.strip())
print(teks.strip().lower())
judul = "laporan bulanan"
print(judul.upper())
text Keluaran
Python Dasar
python dasar
LAPORAN BULANAN

Pemanggilan berantai teks.strip().lower() berjalan dari kiri ke kanan, yaitu spasi dibuang terlebih dahulu, lalu hurufnya dikecilkan. Variabel teks sendiri tidak berubah, dan hasilnya berupa string baru yang dikembalikan. Pola inilah yang berlaku bagi seluruh metode string.

Metode strip() menerima argumen opsional berupa karakter yang ingin dibuang, sehingga teks.strip("*") membuang tanda bintang di tepi saja. Varian lstrip() dan rstrip() membatasi pembuangan pada sisi kiri atau kanan. Metode capitalize() dan title() melengkapi kelompok pengubahan huruf, masing-masing membesarkan huruf awal kalimat dan huruf awal setiap kata.

Memecah dan menggabungkan#

Metode split() memecah string menjadi list berdasarkan pemisah yang diberikan, sedangkan metode join() menggabungkan list string menjadi satu string dengan pemisah di antaranya. Keduanya saling melengkapi, yaitu split() memecah dan join() menyambung kembali.

python Contoh: split dan join
baris = "beras,telur,minyak"
data = baris.split(",")
print(data)
print(baris.split())
gabung = " - ".join(data)
print(gabung)
text Keluaran
['beras', 'telur', 'minyak']
['beras,telur,minyak']
beras - telur - minyak

Pemisah koma menghasilkan tiga elemen, sedangkan split() tanpa argumen membelah pada rentetan spasi. Karena baris tidak mengandung spasi, hasilnya list dengan satu elemen utuh. Pemanggilan split() tanpa argumen tepat untuk teks yang pemisahnya berupa spasi dengan jumlah berapa pun, sedangkan pemisah eksplisit digunakan untuk data berformat koma. Argumen tambahan pada split(), misalnya baris.split(",", 1), membatasi jumlah pemecahan maksimum sehingga sisanya tetap utuh pada elemen terakhir.

Mencari dan menghitung#

Metode find() mengembalikan indeks kemunculan pertama sebuah substring, yaitu potongan string, atau -1 apabila tidak ditemukan. Operator in menguji keberadaannya sebagai nilai boolean, metode count() menghitung jumlah kemunculannya, dan metode replace() menyusun string baru dengan penggantian yang diminta.

python Contoh: find, in, count, dan replace
teks = "struktur data python"
print(teks.find("data"))
print(teks.find("mysql"))
print("data" in teks)
print(teks.count("u"))
print(teks.replace("python", "python modern"))
text Keluaran
9
-1
True
2
struktur data python modern

Substring "data" dimulai pada indeks 9, sedangkan "mysql" tidak ada sehingga find() mengembalikan -1. Huruf u muncul dua kali pada struktur dan tidak muncul pada kata lainnya. Hasil replace() adalah string baru, dan variabel teks tetap memuat kalimat aslinya.

Dua metode yang sering dibutuhkan untuk menguji tepi string adalah startswith() dan endswith(), yang masing-masing mengembalikan True atau False untuk awalan dan akhiran tertentu. Metode rfind() mencari kemunculan terakhir dan mengembalikan -1 bila tidak ditemukan, serupa dengan find(). Kelompok metode ini melengkapi kebutuhan pencarian tanpa perlu ekspresi reguler (regular expression), yaitu pola pencarian yang lebih kompleks.

Sifat immutable dan konsekuensinya#

Setiap metode string mengembalikan string baru dan tidak pernah mengubah string aslinya, karena tipe ini bersifat immutable. Percobaan mengubah satu karakter lewat indeks pun ditolak.

python Contoh: percobaan mutasi string
teks = "python"
try:
    teks[0] = "P"
except TypeError as e:
    print(type(e).__name__, str(e))
besar = teks.upper()
print(teks)
print(besar)
text Keluaran
TypeError 'str' object does not support item assignment
python
PYTHON

Error TypeError menyatakan penugasan per karakter tidak didukung, dan upper() memperlihatkan pola yang sama melalui cara yang sah, yaitu menghasilkan string baru tanpa menyentuh string lama. Konsekuensi praktisnya muncul saat banyak string digabung berulang-ulang dalam perulangan. Setiap penggabungan menyalin seluruh isi string lama ke string baru, sehingga biayanya mendekati O(n2)O(n^2) untuk nn potongan. Untuk jumlah besar, kumpulkan potongan-potongan dalam list lalu satukan sekali dengan join().

Sifat immutable juga berdampak pada aspek lain. Karena isi string tidak dapat berubah, nilai hashnya tetap, sehingga string dapat digunakan sebagai kunci dictionary dan elemen set tanpa syarat tambahan. Kesetaraan dua string juga cukup diperiksa dari isinya, karena isi keduanya tidak dapat berubah setelah string dibuat.

Dasar-dasar Unicode#

Python 3 menyimpan setiap string sebagai rentetan titik kode (code point) Unicode, sehingga satu karakter dihitung satu, apa pun bentuknya. Fungsi len() menghitung karakter, fungsi ord() mengembalikan nomor titik kode sebuah karakter, dan fungsi chr() melakukan kebalikannya.

python Contoh: len, ord, dan chr
kata = "café"
print(len(kata))
for huruf in kata:
    print(huruf, ord(huruf))
print(chr(233))
text Keluaran
4
c 99
a 97
f 102
é 233
é

String "café" berisi empat karakter, dan huruf é berada pada titik kode 233. Fungsi chr(233) mengembalikan huruf yang sama, membuktikan bahwa ord() dan chr() saling berkebalikan.

Kerumitan Unicode muncul karena satu huruf beraksen dapat ditulis dengan dua cara, yaitu satu karakter jadi (precomposed) atau huruf dasar ditambah tanda aksen pengiring (combining character). Bentuk jadi tersimpan sebagai satu titik kode, sedangkan bentuk pengiring menambahkan satu titik kode tersendiri untuk aksennya.

python Contoh: dua penulisan huruf é
kata2 = "cafe\u0301"
print(kata2 == "café")
print(len(kata2))
text Keluaran
False
5

Kedua string terlihat serupa di layar, tetapi perbandingannya bernilai False karena penulisan kedua memakai lima titik kode, yaitu huruf e yang ditambah karakter pengiring berlabel 769. Kesadaran ini penting saat membandingkan teks yang berasal dari sumber berbeda, misalnya dengan menyamakan bentuknya terlebih dahulu melalui modul unicodedata.

Perlu dibedakan antara string dan representasi bytenya. Penyandian (encoding) seperti UTF-8 mengubah string menjadi rentetan byte, dan satu karakter dapat menggunakan satu sampai empat byte tergantung titik kodenya. Inilah sebabnya len() menghitung titik kode dan bukan byte, sehingga jumlah karakter tetap sama berapa pun penyandian berkas yang menyimpannya.

Kesalahan umum#

Kesalahan pertama adalah memanggil metode string lalu membuang hasilnya. Karena string immutable, pemanggilan tanpa penugasan tidak meninggalkan jejak apa pun.

python Contoh: hasil strip() yang terbuang
teks = "  halo  "
teks.strip()
print(f"[{teks}]")
text Keluaran
[  halo  ]

Tanda kurung siku pada cetakan sengaja digunakan agar spasi yang tersisa terlihat. Perbaikannya satu langkah, yaitu menuliskan teks = teks.strip() agar variabel menampung string baru hasil metode tersebut.

Kesalahan kedua adalah memperlakukan hasil find() seolah selalu berupa indeks yang sah. Nilai -1 tidak menimbulkan error saat dipakai sebagai indeks, tetapi maknanya berbeda jauh, yaitu elemen terakhir. Periksa dahulu dengan if teks.find("data") != -1, atau gunakan operator in apabila hanya keberadaannya yang penting.

Ringkasan#

  • Metode string seperti strip(), lower(), split(), join(), find(), dan replace() selalu mengembalikan string baru karena string bersifat immutable.
  • Penggabungan berulang dalam perulangan mahal, dan join() yang dipanggil sekali di akhir menjadi pola penggantinya.
  • len() menghitung titik kode Unicode, ord() mengubah karakter menjadi nomornya, dan chr() mengubah nomor menjadi karakter.
  • Satu huruf beraksen dapat memiliki dua penulisan yang berbeda, sehingga perbandingan string perlu menyamakan bentuknya terlebih dahulu.

Referensi#