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.
teks = " Python Dasar "
print(teks.strip())
print(teks.strip().lower())
judul = "laporan bulanan"
print(judul.upper())Python Dasar
python dasar
LAPORAN BULANANPemanggilan 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.
baris = "beras,telur,minyak"
data = baris.split(",")
print(data)
print(baris.split())
gabung = " - ".join(data)
print(gabung)['beras', 'telur', 'minyak']
['beras,telur,minyak']
beras - telur - minyakPemisah 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.
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"))9
-1
True
2
struktur data python modernSubstring "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.
teks = "python"
try:
teks[0] = "P"
except TypeError as e:
print(type(e).__name__, str(e))
besar = teks.upper()
print(teks)
print(besar)TypeError 'str' object does not support item assignment
python
PYTHONError 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 untuk 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.
kata = "café"
print(len(kata))
for huruf in kata:
print(huruf, ord(huruf))
print(chr(233))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.
kata2 = "cafe\u0301"
print(kata2 == "café")
print(len(kata2))False
5Kedua 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.
teks = " halo "
teks.strip()
print(f"[{teks}]")[ 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(), danreplace()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, danchr()mengubah nomor menjadi karakter.- Satu huruf beraksen dapat memiliki dua penulisan yang berbeda, sehingga perbandingan string perlu menyamakan bentuknya terlebih dahulu.
Referensi#
- String Methods — Python Software Foundation — Daftar lengkap metode string beserta perilaku dan contoh pemakaiannya.
- Unicode HOWTO — Python Software Foundation — Panduan resmi memahami Unicode pada Python, dari titik kode sampai penyandian.