String (tipe str) adalah teks: deretan karakter di antara tanda kutip. Bayangin papan menu Warung Kopi Pak Darto yang hurufnya ubin-ubin kecil berjajar, K, o, p, i, dan seterusnya, tiap ubin punya nomor. Kamu bisa membaca satu ubin, atau memotong beberapa ubin berurutan. Tapi ubinnya ditempel mati: mau tulisan lain, kamu bikin papan baru.
🧪 Tebakan cepat:
menu = "Kopi susu", lalu barismenu.upper(), laluprint(menu). Yang tercetakKOPI SUSUatauKopi susu? Tebak dulu, jawabannya ada di bagian "String gak bisa diubah".
Membuat string
menu = "Kopi susu"
toko = 'Warung Kopi Pak Darto'
struk = """Kopi susu x3
Teh manis x4"""
print(len(menu)) # 9
- Kutip ganda
"..."dan kutip tunggal'...'sama saja. Pilih satu dan konsisten. - Tiga kutip
"""..."""boleh berisi beberapa baris. len(menu)menghitung jumlah karakternya: 9, spasinya ikut dihitung.
Indeks: nomor tiap karakter
| Karakter | K |
o |
p |
i |
spasi | s |
u |
s |
u |
|---|---|---|---|---|---|---|---|---|---|
| Indeks | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| Indeks negatif | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
menu[0]adalahK. Indeks mulai dari 0, jadi karakter terakhir ada dilen(menu) - 1, yaitu 8.- Indeks negatif menghitung dari belakang:
menu[-1]adalahu, karakter terakhir. menu[9]gak ada, dan Python menolaknya denganIndexError: string index out of range.
Slicing: memotong bagian
print(menu[0:4]) # Kopi
print(menu[5:]) # susu
print(menu[-4:]) # susu
print(menu[:4]) # Kopi
print(menu[::-1]) # usus ipoK
menu[awal:akhir]mengambil dari indeksawalsampai sebelumakhir.menu[0:4]mengambil indeks 0, 1, 2, 3.awalkosong artinya dari depan,akhirkosong artinya sampai habis.menu[-4:]artinya empat karakter terakhir. Cocok kalau panjang teksnya bisa berubah.- Slicing gak pernah error:
menu[2:100]cukup berhenti di ujung, hasilnyapi susu. [::-1]membalik teksnya.
Method string
Method adalah fungsi yang menempel di sebuah nilai, dipanggil dengan titik: nilai.nama_method().
pesanan = "kopi susu, teh manis, roti bakar"
print(pesanan.upper()) # KOPI SUSU, TEH MANIS, ROTI BAKAR
print(len(pesanan)) # 32
print(pesanan.replace("teh", "es teh")) # kopi susu, es teh manis, roti bakar
print(pesanan.split(", ")) # ['kopi susu', 'teh manis', 'roti bakar']
.upper()jadi huruf besar semua,.lower()huruf kecil semua,.strip()membuang spasi di kedua ujung.len()bukan method, tapi fungsi yang menerima teksnya:len(pesanan), bukanpesanan.len()..replace(lama, baru)mengganti semualamadenganbaru..split(", ")memotong teks di setiap", "dan menghasilkan list, daftar nilai. Print menulisnya dengan kurung siku dan kutip tunggal.- Kebalikannya
.join(), yang dipanggil di pemisahnya:" ".join(["kopi", "teh", "roti"])menghasilkankopi teh roti.
String gak bisa diubah
menu = "Kopi susu"
menu.upper()
print(menu) # Kopi susu
menu = menu.upper()
print(menu) # KOPI SUSU
String itu immutable: isinya gak bisa diubah. Method seperti .upper() gak mengubah menu, dia membuat string baru. Kalau string baru itu gak disimpan, dia langsung hilang, jadi print(menu) tetap Kopi susu. Itu jawaban tebakannya. Mau menyimpan hasilnya? Tempel lagi ke nama: menu = menu.upper().
Mengganti satu karakter langsung juga ditolak:
Traceback (most recent call last):
File "/home/darto/warung.py", line 2, in <module>
menu[0] = "k"
~~~~^^^
TypeError: 'str' object does not support item assignment
f-string dengan format spec
Di dalam {} sebuah f-string, kamu boleh menulis ekspresi, dan sesudah tanda : boleh ada format spec, aturan cara menulis nilainya:
total = 89000
per_orang = total / 3
nama = "budi"
print(f"Total: Rp{total:,}") # Total: Rp89,000
print(f"Total: Rp{total:,}".replace(",", ".")) # Total: Rp89.000
print(f"Per orang: Rp{per_orang:.2f}") # Per orang: Rp29666.67
print(f"Halo, {nama.upper()}!") # Halo, BUDI!
{total:,}menambah pemisah ribuan. Pemisahnya koma, gaya Inggris, jadi untuk gaya Indonesia ganti komanya dengan.replace(",", ".").{per_orang:.2f}menulis tepat 2 angka di belakang titik, dibulatkan: 29666.666666666668 jadi29666.67.{nama.upper()}menjalankan method-nya dulu, baru hasilnya disisipkan.
📌 Format spec lain
print(f"{'Kopi':<10}|") # Kopi |
print(f"{'Kopi':>10}|") # Kopi|
print(f"{'Kopi':^10}|") # Kopi |
print(f"{7:03}") # 007
print(f"{0.8745:.1%}") # 87.5%
<, >, ^ meratakan kiri, kanan, tengah dalam lebar 10 karakter, berguna untuk struk yang rapi. 03 mengisi depan angka dengan nol sampai 3 digit. .1% mengalikan 100 lalu menulis satu angka desimal dan tanda persen.
⚠️ Jebakan yang sering ketemu
- Hasil method gak disimpan.
menu.upper()sendirian gak mengubah apa pun. Simpan (menu = menu.upper()) atau langsung cetak (print(menu.upper())). - Indeks terakhir dikira
len.menu[9]di teks 9 karakter adalahIndexError. Yang terakhirmenu[8]ataumenu[-1]. .join()dipanggil di list.kata.join(" ")gagal denganAttributeError: 'list' object has no attribute 'join'. Yang benar" ".join(kata).- Lupa kurung.
print(menu.upper)gak menjalankan method-nya, cuma menulis<built-in method upper of str object at 0x...>.
TL;DR: String adalah teks di antara kutip, dan len() menghitung karakternya. Indeks mulai dari 0, indeks negatif dari belakang (menu[-1] karakter terakhir), dan indeks di luar batas jadi IndexError. Slicing menu[awal:akhir] berhenti sebelum akhir dan gak pernah error. Method dipanggil dengan titik: .upper(), .replace(lama, baru), .split(", ") (hasilnya list), dan " ".join(list) dipanggil di pemisahnya. String immutable: method membuat string baru, jadi simpan atau cetak hasilnya. Format spec di f-string: {total:,} untuk ribuan (89,000), {x:.2f} untuk 2 desimal.