Pendamping Bab 7: String Lanjutan: Format dan Unicode. Gunakan nomor contoh dan latihan yang sama dengan buku.

Tujuan Belajar

  • Mengatur lebar, perataan, dan presisi tampilan.
  • Membedakan str dengan bytes.
  • Menggunakan pasangan encode dan decode dengan encoding yang sesuai.

Persiapan

Kamu sudah memahami string dasar dan f-string. Studi kasus inti hanya memakai materi sampai Bab 7; pengolahan daftar judul dengan fungsi dan dictionary menjadi pengembangan setelah Bab 13.

Program dengan tombol Coba di IDE dapat dijalankan di browser. Untuk program lokal, unduh sumber, ekstrak ZIP, lalu ikuti README.txt.

Pembahasan

07-01 – Perataan Teks (Alignment)

Format specifier ditulis setelah variabel di dalam kurung kurawal, dipisahkan oleh titik dua (:). Bentuk umumnya adalah: f"{nilai:specifier}".

Coba di IDE Unduh Sumber
nama_align = "Budi"
print(f"Nama: '{nama_align:<10}' (rata kiri dalam 10 spasi)")
print(f"Nama: '{nama_align:>10}' (rata kanan dalam 10 spasi)")
print(f"Nama: '{nama_align:^10}' (rata tengah dalam 10 spasi)")

# Kamu juga bisa menentukan karakter pengisi selain spasi
print(f"'{nama_align:-^10}'")  # Output: '---Budi---'

Hasil yang diharapkan:

Nama: 'Budi      ' (rata kiri dalam 10 spasi)
Nama: '      Budi' (rata kanan dalam 10 spasi)
Nama: '   Budi   ' (rata tengah dalam 10 spasi)
'---Budi---'

Coba ubah: Ganti isi nama_align dengan teks lain dan bandingkan hasilnya.

07-02 – Menampilkan Tanda Angka (`+`, `-`, spasi)

Instruksi dijalankan dari atas ke bawah; print menampilkan nilai saat instruksi itu dijalankan.

Coba di IDE Unduh Sumber
angka_pos = 123
angka_neg = -123
# Output: Positif: +123, Negatif: -123
print(f"Positif: {angka_pos:+d}, Negatif: {angka_neg:+d}")
# Output: Positif:  123, Negatif: -123
print(f"Positif: {angka_pos: d}, Negatif: {angka_neg: d}")

Hasil yang diharapkan:

Positif: +123, Negatif: -123
Positif:  123, Negatif: -123

Coba ubah: Ubah angka_pos dari 123 menjadi 124, lalu prediksi hasilnya.

07-03 – Mengontrol Lebar dan Presisi Angka Desimal

Instruksi dijalankan dari atas ke bawah; print menampilkan nilai saat instruksi itu dijalankan.

Coba di IDE Unduh Sumber
pi = 3.14159265
print(f"Pi (default): {pi}")
# Output: Pi (lebar 10, 2 desimal):       3.14
print(f"Pi (lebar 10, 2 desimal): {pi:10.2f}")
print(f"Pi (2 desimal): {pi:.2f}")
# Output: Pi (notasi ilmiah, 3 desimal): 3.142e+00
print(f"Pi (notasi ilmiah, 3 desimal): {pi:.3e}")

angka_besar_f = 1234567.89
# Output: Angka besar (pemisah ribuan): 1,234,567.89
hasil = f"{angka_besar_f:,.2f}"
print(f"Angka besar (pemisah ribuan): {hasil}")

Hasil yang diharapkan:

Pi (default): 3.14159265
Pi (lebar 10, 2 desimal):       3.14
Pi (2 desimal): 3.14
Pi (notasi ilmiah, 3 desimal): 3.142e+00
Angka besar (pemisah ribuan): 1,234,567.89

Coba ubah: Ubah pi dari 3.14159265 menjadi 4.14159265, lalu prediksi hasilnya.

07-04 – Format Angka Lainnya

Instruksi dijalankan dari atas ke bawah; print menampilkan nilai saat instruksi itu dijalankan. Jalankan dengan Python di komputer agar format hasil sama dengan contoh buku.

Unduh Sumber
angka_format = 255
print(f"Desimal: {angka_format:d}")
print(f"Biner: {angka_format:b}")
print(f"Oktal: {angka_format:o}")
print(f"Heksadesimal: {angka_format:x}")

nilai_persen = 0.75
print(f"Persentase (default): {nilai_persen:%}")
print(f"Persentase (0 desimal): {nilai_persen:.0%}")

Hasil yang diharapkan:

Desimal: 255
Biner: 11111111
Oktal: 377
Heksadesimal: ff
Persentase (default): 75.000000%
Persentase (0 desimal): 75%

Coba ubah: Ubah angka_format dari 255 menjadi 256, lalu prediksi hasilnya.

07-05 – Padding dengan Angka Nol

Instruksi dijalankan dari atas ke bawah; print menampilkan nilai saat instruksi itu dijalankan.

Coba di IDE Unduh Sumber
nomor_urut = 42
# Output: Nomor: 00042 (total 5 digit, diisi nol)
print(f"Nomor: {nomor_urut:05d}")

Hasil yang diharapkan:

Nomor: 00042

Coba ubah: Ubah nomor_urut dari 42 menjadi 43, lalu prediksi hasilnya.

07-06 – Unicode dan Encoding Karakter

Python 3 menggunakan Unicode secara native untuk string. Artinya, string di Python 3 dapat menyimpan karakter dari bahasa apa pun, seperti Arab, Mandarin, Rusia, termasuk emoji.

Coba di IDE Unduh Sumber
teks_unicode = "Halo Dunia! (wave)(world)"
print(teks_unicode)
# Karakter pertama dan code point-nya
print(f"Karakter pertama: {teks_unicode[0]}")
print(f"Code point: {ord(teks_unicode[0])}")
# Huruf ke-5 dan code point-nya
print(f"Huruf: {teks_unicode[5]}")
print(f"Code point: {ord(teks_unicode[5])}")

Hasil yang diharapkan:

Halo Dunia! (wave)(world)
Karakter pertama: H
Code point: 72
Huruf: D
Code point: 68

Coba ubah: Ganti isi teks_unicode dengan teks lain dan bandingkan hasilnya.

Studi Kasus

07-07 – Kartu harga yang rapi

Nama diratakan ke kiri dalam lebar delapan karakter, harga ke kanan dalam lebar sepuluh dengan dua digit desimal.

Coba di IDE Unduh Sumber
barang_1 = "Buku"
barang_2 = "Pensil"
harga_1 = 12500.5
harga_2 = 3000
print(f"{barang_1:<8} | {harga_1:>10.2f}")
print(f"{barang_2:<8} | {harga_2:>10.2f}")

Hasil yang diharapkan:

Buku     |   12500.50
Pensil   |    3000.00

Coba ubah: Ganti nama barang dengan nama yang lebih panjang dan amati batas lebar minimum.

Rangkuman

Format mengubah cara nilai ditampilkan, bukan nilai asalnya. str menyimpan teks Unicode; encode menghasilkan bytes dan decode mengembalikan teks dengan encoding yang sesuai.

Cek Pemahaman

Lima pertanyaan ini sama dengan pertanyaan di buku. Periksa jawaban di kuis untuk melihat skor dan pembahasan.

  1. Format .2f menampilkan …
  2. Penanda < dalam format string berarti …
  3. Hasil encode("utf-8") adalah …
  4. Apa yang diperlukan saat decode?
  5. Apakah format f-string mengubah nilai asal angka?
Kerjakan Kuis

Latihan Mandiri

Latihan 07-L01 – Nomor urut

Dasar. Tampilkan angka 7 dengan tiga digit menjadi 007.

Kerjakan di IDE Unduh Latihan

Hasil yang diharapkan:

007
Lihat Petunjuk

Lebar tiga dengan pengisi nol memakai 03d.

Lihat Solusi
nomor = 7
print(f"{nomor:03d}")

Nol ditambahkan pada tampilan, bukan pada nilai integer.

Coba Solusi di IDEUnduh Solusi

Latihan 07-L02 – Harga dua desimal

Penerapan. Tampilkan harga 12500.5 sebagai 12500.50.

Kerjakan di IDE Unduh Latihan

Hasil yang diharapkan:

12500.50
Lihat Petunjuk

Gunakan .2f.

Lihat Solusi
harga = 12500.5
print(f"{harga:.2f}")

Dua digit pecahan dibuat konsisten.

Coba Solusi di IDEUnduh Solusi

Latihan 07-L03 – Teks pulang-pergi

Pengembangan. Encode teks "café" memakai UTF-8, lalu decode kembali dan cetak teks serta hasil perbandingannya dengan teks awal.

Kerjakan di IDE Unduh Latihan

Hasil yang diharapkan:

café
True
Lihat Petunjuk

Gunakan encoding yang sama pada kedua langkah.

Lihat Solusi
teks = "café"
data = teks.encode("utf-8")
hasil = data.decode("utf-8")
print(hasil)
print(hasil == teks)

Decode dengan UTF-8 mengembalikan teks asal.

Coba Solusi di IDEUnduh Solusi

Pengembangan

Pengembangan: Memformat Judul Artikel

Prasyarat: kerjakan setelah Bab 13.

Prasyarat: Kerjakan studi kasus dan latihan berikut setelah Bab 13. Di sini kita menggabungkan metode string dengan fungsi, percabangan, perulangan, list, dan dictionary.

Bayangkan kamu memiliki daftar judul artikel yang tidak konsisten formatnya. Kamu ingin membuat fungsi yang:

  1. Mengubah judul menjadi title case.
  2. Menghapus spasi di awal atau akhir dan merapikan spasi antarkata.
  3. Mengganti kata atau frasa tertentu (misalnya, “py” menjadi “Python” dan “scikit learn” menjadi “Scikit-Learn”).
def format_judul_artikel(judul, ganti_kata=None):
    if ganti_kata is None:
        ganti_kata = {}

    kata_kata_judul = judul.strip().title().split()
    kata_kata_hasil = []
    indeks = 0

    while indeks < len(kata_kata_judul):
        for kata_lama, kata_baru in ganti_kata.items():
            kata_pola = kata_lama.lower().split()
            jumlah = len(kata_pola)
            potongan = kata_kata_judul[indeks:indeks + jumlah]
            cocok = " ".join(potongan).lower() == " ".join(kata_pola)
            if jumlah > 0 and cocok:
                kata_kata_hasil.append(kata_baru)
                indeks += jumlah
                break
        else:
            # Tidak ada kata atau frasa pengganti yang cocok
            kata_kata_hasil.append(kata_kata_judul[indeks])
            indeks += 1

    return " ".join(kata_kata_hasil)

#### Contoh penggunaan:
judul1 = "  belajar py dasar untuk pemula  "
judul2 = "pengenalan machine learning dengan scikit learn"
#### Dictionary untuk penggantian kata atau frasa
penggantian_baru = {
    "py": "Python",
    "scikit learn": "Scikit-Learn"
}

print(f"Judul Asli: '{judul1}'")
hasil1 = format_judul_artikel(judul1, penggantian_baru)
print(f"-> Judul Format: '{hasil1}'")
print(f"Judul Asli: '{judul2}'")
hasil2 = format_judul_artikel(judul2, penggantian_baru)
print(f"-> Judul Format: '{hasil2}'")

judul3 = "advanced python programming"
print(f"Judul Asli: '{judul3}'")
hasil3 = format_judul_artikel(judul3, {'python': 'PYTHONTM'})
print(f"-> Judul Format: '{hasil3}'")

Output yang diharapkan:

Judul Asli: '  belajar py dasar untuk pemula  '
-> Judul Format: 'Belajar Python Dasar Untuk Pemula'
Judul Asli: 'pengenalan machine learning dengan scikit learn'
-> Judul Format: 'Pengenalan Machine Learning Dengan Scikit-Learn'
Judul Asli: 'advanced python programming'
-> Judul Format: 'Advanced PYTHONTM Programming'

Fungsi ini menggabungkan strip(), title(), split(), dan join() dengan perulangan dan percabangan. split() tanpa argumen merapikan pemisah antarkata. Pada setiap posisi, fungsi membandingkan satu atau beberapa kata sekaligus tanpa membedakan huruf besar dan kecil. Karena itu, frasa scikit learn dapat diganti sebagai satu kesatuan, sedangkan py tidak akan mengganti sebagian kata seperti python.

Jika pola cocok, hasil pengganti ditambahkan sesuai penulisan di dictionary dan indeks maju sebanyak kata yang diganti. break menghentikan pencarian pola pada posisi tersebut. Blok else milik for berjalan jika tidak ada pola yang cocok, sehingga kata semula tetap ditambahkan. Jika beberapa pola cocok pada posisi yang sama, pola yang muncul lebih dahulu di dictionary dipakai. Contoh ini mencocokkan kata yang dipisahkan spasi; tanda baca yang menempel pada kata perlu ikut ditulis dalam pola.

Kegiatan Tambahan

  1. Validator Email Sederhana: Buat fungsi cek_email(email) yang menerima string email. Fungsi ini harus mengembalikan True jika email dianggap “cukup valid”, False sebaliknya. Kriteria sederhana:

    • Mengandung satu karakter @.
    • Karakter @ bukan karakter pertama atau terakhir.
    • Setelah @, harus ada minimal satu titik (.).
    • Titik (.) setelah @ bukan karakter pertama atau terakhir setelah @.
    • Tidak boleh ada spasi. Contoh: cek_email("[email protected]") -> True cek_email("user@example") -> False cek_email("@example.com") -> False cek_email("user example.com") -> False
  2. Hitung Frekuensi Kata: Buat fungsi hitung_kata(teks) yang menerima sebuah string panjang. Fungsi ini harus mengembalikan dictionary di mana kuncinya adalah kata (dalam huruf kecil dan tanpa tanda baca di ujungnya) dan nilainya adalah frekuensi kemunculan kata tersebut. Tips:

    • Ubah semua teks menjadi huruf kecil.
    • Gunakan split() untuk mendapatkan kata-kata.
    • Untuk setiap kata, hilangkan tanda baca umum (misalnya: ., ,, !, ?) dari awal/akhir kata. Metode strip() bisa menerima argumen karakter yang ingin dihilangkan. Contoh: kata.strip(".,!?").
  3. Pembuat Akronim: Buat fungsi buat_akronim(frasa) yang mengambil frasa dan mengembalikan akronimnya dalam huruf besar.

    Contoh:

    • buat_akronim("Organisasi Kesehatan Dunia") -> "OKD"
    • buat_akronim("ilmu pengetahuan alam") -> "IPA"
  4. Pemeriksa Palindrom (Lanjutan): Buat fungsi is_palindrom_lanjutan(teks) yang memeriksa apakah sebuah teks adalah palindrom, dengan mengabaikan spasi, tanda baca, dan kapitalisasi.

    Contoh:

    • is_palindrom_lanjutan("A man, a plan, a canal: Panama") -> True
    • is_palindrom_lanjutan("Kasur ini rusak.") -> True

Tabel Pengingat Tambahan

Berikut adalah rangkuman operasi dan metode string yang paling sering digunakan, disajikan dalam format tabel untuk kemudahan referensi:

1. Pembuatan String

Cara Pembuatan & Deskripsi Contoh & Output
s = “teks” atau s = ‘teks’
Membuat string literal.
s = "halo"; print(f"'{s}'")
Output: 'halo'
s = “““teks multi baris”““ atau s = ’‘’teks multi baris’’’
Membuat string yang mencakup beberapa baris.
s = """baris1\nbaris2"""; print(s.splitlines())
Output: ['baris1', 'baris2']
s = str(objek_lain)
Mengkonversi objek lain menjadi string.
s = str(123); print(f"'{s}'")
Output: '123'

2. Operasi Dasar

Operasi & Deskripsi Contoh & Output
len(s)
Mengembalikan panjang (jumlah karakter) string.
s = "abc"; print(s.__len__())
Output: 3
s1 + s2
Penggabungan (concatenation) dua string.
s1 = "a"; s2 = "b"; print(f"'{s1 + s2}'")
Output: 'ab'
s * n
Pengulangan string sebanyak n kali.
s = "a"; print(f"'{s * 3}'")
Output: 'aaa'
karakter in s
Memeriksa keberadaan substring (True/False).
s = "abc"; print("a" in s)
Output: True
s[i]
Indexing (mengakses karakter ke-i).
s = "abc"; print(f"'{s[0]}'")
Output: 'a'
s[start:stop:step]
Slicing (mengambil potongan string).
s = "abcde"; print(f"'{s[1:4]}'")
Output: 'bcd'

3. Metode Kapitalisasi (Case)

Metode & Deskripsi Contoh & Output
s.lower()
Mengubah semua huruf menjadi huruf kecil.
s = "HeLLo"; print(f"'{s.lower()}'")
Output: 'hello'
s.upper()
Mengubah semua huruf menjadi huruf besar.
s = "HeLLo"; print(f"'{s.upper()}'")
Output: 'HELLO'
s.capitalize()
Kapitalisasi huruf pertama string, sisanya kecil.
s = "hELLo WORLD"; print(f"'{s.capitalize()}'")
Output: 'Hello world'
s.title()
Kapitalisasi huruf pertama setiap kata.
s = "hello world"; print(f"'{s.title()}'")
Output: 'Hello World'
s.swapcase()
Menukar huruf besar jadi kecil dan sebaliknya.
s = "PyThOn"; print(f"'{s.swapcase()}'")
Output: 'pYtHoN'

4. Metode Penghapusan Spasi & Karakter (Trimming)

Metode & Parameter & Deskripsi Contoh & Output
s.strip()
Hapus spasi putih di awal dan akhir
s = " halo "; print(f"'{s.strip()}'")
Output: 'halo'
s.strip(chars)
Hapus karakter chars di awal dan akhir
s = "xxhaloxx"; print(f"'{s.strip('x')}'")
Output: 'halo'
s.lstrip()
Hapus spasi putih di awal (kiri)
s = " halo "; print(f"'{s.lstrip()}'")
Output: 'halo '
s.lstrip(chars)
Hapus karakter chars di awal
s = "xxhaloxx"; print(f"'{s.lstrip(\"x\")}'")
Output: 'haloxx'
s.rstrip()
Hapus spasi putih di akhir (kanan)
s = " halo "; print(f"'{s.rstrip()}'")
Output: ' halo'
s.rstrip(chars)
Hapus karakter chars di akhir
s = "xxhaloxx"; print(f"'{s.rstrip(\"x\")}'")
Output: 'xxhalo'

5. Metode Pencarian & Penggantian

Metode & Parameter & Deskripsi Contoh & Output
s.find(sub)
Posisi pertama sub (atau -1 jika tidak ada).
s = "abcabc"; print(s.find("b"))
Output: 1
s.rfind(sub)
Posisi terakhir sub (atau -1 jika tidak ada).
s = "abcabc"; print(s.rfind("b"))
Output: 4
s.index(sub)
Sama seperti find, tapi error jika sub tidak ada.
s = "abc"; print(s.index("b"))
Output: 1
s.rindex(sub)
Sama seperti rfind, tapi error jika sub tidak ada.
s = "abcabc"; print(s.rindex("b"))
Output: 4
s.count(sub)
Menghitung berapa kali sub muncul dalam s.
s = "banana"; print(s.count("na"))
Output: 2
s.replace(old, new, count)
Mengganti count (opsional) kemunculan old dengan new.
s = "aa aa"; print(f"'{s.replace(\"aa\", \"b\", 1)}'")
Output: 'b aa'

6. Metode Pemecahan & Penggabungan

Metode & Deskripsi Contoh & Output
s.split(sep=None)
Memecah s menjadi list berdasarkan sep. Default sep adalah spasi.
s = "a b c"; print(s.split())
Output: ['a', 'b', 'c']
s.rsplit(sep=None, maxsplit)
Sama seperti split, tapi dari kanan, dengan maxsplit opsional.
s = "a-b-c"; print(s.rsplit("-", 1))
Output: ['a-b', 'c']
s.splitlines()
Memecah s menjadi list berdasarkan baris baru (\\n, \\r\\n, dll).
s = "baris1\\nbaris2"; print(s.splitlines())
Output: ['baris1', 'baris2']
sep.join(iterable)
Menggabungkan elemen iterable (list/tuple string) dengan sep.
L = ['a','b']; print(f"'{"-".join(L)}'")
Output: 'a-b'

7. Metode Pengecekan Kondisi (Boolean)

Metode & Deskripsi Contoh & Output
s.startswith(prefix)
True jika s dimulai dengan prefix.
s = "Python"; print(s.startswith("Py"))
Output: True
s.endswith(suffix)
True jika s diakhiri dengan suffix.
s = "file.txt"; print(s.endswith(".txt"))
Output: True
s.isalpha()
True jika semua karakter huruf & tidak kosong.
s = "abc"; print(s.isalpha())
Output: True
s.isdigit()
True jika semua karakter digit & tidak kosong.
s = "123"; print(s.isdigit())
Output: True
s.isnumeric()
True jika semua karakter numerik (Unicode) & tidak kosong.
s = "123"; print(s.isnumeric())
Output: True
s.isalnum()
True jika semua karakter alfanumerik & tidak kosong.
s = "Py3"; print(s.isalnum())
Output: True
s.islower()
True jika semua huruf adalah huruf kecil & ada min. 1 huruf.
s = "py"; print(s.islower())
Output: True
s.isupper()
True jika semua huruf adalah huruf besar & ada min. 1 huruf.
s = "PY"; print(s.isupper())
Output: True
s.isspace()
True jika string hanya berisi karakter spasi putih & tidak kosong.
s = " "; print(s.isspace())
Output: True
s.istitle()
True jika string dalam format title case & ada min. 1 huruf.
s = "Judul Ini"; print(s.istitle())
Output: True

8. Format String (f-string)

Sintaks & Deskripsi Contoh & Output
f”Teks dengan {variabel} dan {ekspresi}“
Menyisipkan variabel dan ekspresi Python ke dalam string.
nama="A"; print(f"'Halo {nama}'")
Output: 'Halo A'
f”{nilai:specifier}“
Menggunakan format specifier untuk mengatur tampilan nilai.
print(f"{3.1415:.2f}")
Output: 3.14
f”{teks:<10}“
Rata kiri dalam 10 karakter.
print(f"'{ 'Hi':<5 }'")
Output: 'Hi '
f”{teks:>10}“
Rata kanan dalam 10 karakter.
print(f"'{ 'Hi':>5 }'")
Output: ' Hi'
f”{angka:03d}“
Angka integer, total 3 digit, diisi nol di depan jika perlu.
print(f"{5:03d}")
Output: 005

Referensi dan Materi Pendamping

Langkah Selanjutnya

Bab 8 membahas Percabangan dengan if, elif, dan else. Sebelum melanjutkan, pastikan kamu dapat menjelaskan tujuan belajar dan menyelesaikan tiga latihan inti bab ini.

Edisi September 2026. Nomor contoh, pertanyaan, dan latihan digunakan bersama pada buku dan halaman ini.

Bab 6 | Bab 8