2.5. Metode string dan pemformatan

String dilengkapi dengan kotak alat metode bawaan untuk inspeksi dan pembentukan ulang. Karena string bersifat imutabel, setiap metode mengembalikan string baru -- yang asli tidak berubah.

2.5.1. Menginspeksi string

  • str.startswith() / str.endswith() -- uji awalan atau akhiran; mengembalikan bool.

  • str.find() -- posisi kemunculan pertama substring, atau -1 jika tidak ada. str.index() melakukan hal yang sama tetapi memunculkan ValueError jika tidak ditemukan.

  • str.count() -- jumlah kemunculan yang tidak tumpang tindih.

  • in keyword -- "MV" in name mengembalikan True jika substring ada di mana saja dalam string.

>>> name = "OpenMV Cam"
>>> name.startswith("Open")
True
>>> name.find("MV")
4
>>> name.count("m")
1
>>> "Cam" in name
True

2.5.2. Membersihkan dan mengubah huruf

>>> "  hello  ".strip()
'hello'
>>> "abc-123".replace("-", "_")
'abc_123'
>>> "OpenMV".lower()
'openmv'

2.5.3. Memisahkan dan menggabungkan

  • str.split() -- pecah string menjadi daftar pada setiap kemunculan separator (default: spasi putih mana pun).

  • str.join() -- kebalikannya: gabungkan urutan string bersama-sama dengan penerima sebagai separator. Ini adalah cara efisien untuk membangun string panjang dari bagian-bagian.

>>> "1,2,3".split(",")
['1', '2', '3']
>>> "hello world".split()
['hello', 'world']
>>> ", ".join(["a", "b", "c"])
'a, b, c'

2.5.4. f-string

Cara paling sederhana untuk menginterpolasi nilai ke dalam string adalah f-string -- literal string yang diawali dengan f. Ekspresi apa pun di dalam {} dievaluasi dan disisipkan:

>>> name = "OpenMV"
>>> count = 42
>>> f"{name} saw {count} blobs"
'OpenMV saw 42 blobs'

Titik dua di dalam kurung kurawal memperkenalkan spesifikasi format yang mengontrol bagaimana nilai dirender:

  • {x:.2f} -- float dengan 2 digit setelah titik desimal.

  • {x:>10} -- rata kanan dalam field 10 karakter.

  • {x:<10} -- rata kiri.

  • {x:0>4} -- isi dengan nol di depan hingga lebar 4.

  • {x:#x} -- heksadesimal dengan awalan 0x.

  • {x:b} -- representasi biner.

>>> f"pi is roughly {3.14159:.3f}"
'pi is roughly 3.142'
>>> f"reg = {0xAB:#x}"
'reg = 0xab'
>>> for i in range(3):
...     print(f"line {i:0>3}")
line 000
line 001
line 002

Satu = setelah nama ekspresi mencetak nama dan nilainya -- berguna untuk cetak debug cepat:

>>> v = 3.14
>>> print(f"{v=}")
v=3.14

2.5.4.1. Konversi basis bilangan bulat

Tiga fungsi bawaan melakukan pekerjaan yang sama seperti spesifikasi format :b / :o / :x tetapi mengembalikan string yang dikonversi secara langsung:

  • bin() -- basis 2, dengan awalan "0b".

  • oct() -- basis 8, dengan awalan "0o".

  • hex() -- basis 16, dengan awalan "0x".

>>> hex(255)
'0xff'
>>> bin(10)
'0b1010'
>>> oct(8)
'0o10'

Arah sebaliknya -- mengubah string basis-N kembali menjadi bilangan bulat -- menggunakan konstruktor int dengan basis eksplisit:

>>> int("ff", 16)
255
>>> int("0b1010", 2)         # the "0b" prefix is allowed
10

Gunakan fungsi-fungsi ini ketika Anda menginginkan string mentah untuk int (untuk baris log, file konfigurasi, dump register). Gunakan spesifikasi format ketika Anda menginginkan padding, lebar, atau mencampur nilai dengan teks lain dalam f-string yang sama.

2.5.5. Gaya pemformatan lama

f-string adalah gaya yang direkomendasikan, tetapi dua pendekatan lama masih berfungsi dan muncul dalam kode yang ada:

str.format() -- kurung kurawal dengan argumen posisi atau kata kunci yang diteruskan ke metode .format() pada string template:

>>> "Hello, {}".format(name)
'Hello, OpenMV'
>>> "{0} + {0} = {1}".format(2, 4)
'2 + 2 = 4'
>>> "{name}: {value}".format(name="frames", value=42)
'frames: 42'

Spesifikasi format ({:.2f}, {:>10}, ...) bekerja sama seperti dalam f-string; satu-satunya perbedaan adalah di mana nilai disuplai.

Pemformatan % (gaya printf) -- operator % tunggal mensubstitusi nilai ke dalam kode format, satu nilai per kode. Berikan beberapa nilai sebagai tuple:

>>> "Hello, %s" % name
'Hello, OpenMV'
>>> "%d + %d = %d" % (2, 2, 4)
'2 + 2 = 4'
>>> "%.2f" % 3.14159
'3.14'

Kode tipe yang paling umum adalah %s (string), %d (integer), %f (float), dan %x (hex).

Setiap kode % dapat membawa pengubah antara % dan huruf tipe. Bentuk lengkapnya adalah %[flags][width][.precision]type:

  • width -- jumlah minimum karakter yang harus diisi field. Nilai yang lebih pendek diisi dengan spasi; nilai yang lebih panjang meluap. %10d mereservasi 10 karakter dan meratakan kanan angka.

  • precision -- artinya bergantung pada tipe. Untuk float, jumlah digit setelah titik desimal. %.2f memberikan dua tempat desimal. Untuk string, jumlah maksimum karakter yang diambil (%.5s memotong hingga lima).

  • Left-align -- flag - menempatkan field di kiri. %-10d menempatkan angka di sisi kiri dengan spasi di belakang.

  • Zero pad -- flag 0 mengisi dengan nol di depan alih-alih spasi (untuk tipe numerik). %05d zero-pad hingga lima angka.

  • Sign -- flag + selalu menampilkan tanda pada angka, termasuk + untuk positif.

  • Alternate form -- flag #. Untuk %x ini menambahkan awalan 0x pada output; untuk %o awalan 0o.

Flag, lebar, dan presisi dapat dikombinasikan:

>>> "%10d" % 42
'        42'                 # width 10, space-padded, right-aligned
>>> "%-10d|" % 42
'42        |'                # width 10, left-aligned
>>> "%05d" % 42
'00042'                      # width 5, zero-padded
>>> "%8.2f" % 3.14159
'    3.14'                   # width 8, 2 decimal places
>>> "%08.2f" % 3.14159
'00003.14'                   # width 8, zero-padded
>>> "%+d" % 42
'+42'                        # explicit sign
>>> "%#06x" % 0xAB
'0x00ab'                     # 0x prefix, zero-pad to 6 chars total

Kedua gaya lama lebih lambat untuk dibaca dan lebih rawan kesalahan daripada f-string -- gunakan f-string dalam kode baru, dan kenali bentuk lama ketika membaca kode yang ada.