2.5. Metody řetězců a formátování

Řetězce přicházejí s vestavěnou sadou nástrojů – metod pro zkoumání a přetváření. Protože jsou řetězce neměnné, každá metoda vrací nový řetězec – původní zůstává beze změny.

2.5.1. Zkoumání řetězců

  • str.startswith() / str.endswith() – test předpony nebo přípony; vrací bool.

  • str.find() – pozice prvního výskytu podřetězce, nebo -1, pokud chybí. str.index() dělá totéž, ale při nepřítomnosti vyvolá ValueError.

  • str.count() – počet nepřekrývajících se výskytů.

  • Klíčové slovo in"MV" in name vrátí True, pokud je podřetězec kdekoli v řetězci.

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

2.5.2. Čištění a velikost písmen

  • str.strip() – odstraní úvodní a koncové bílé znaky. Předáním řetězce znaků odstraníte vlastní sadu (s.strip("/")).

  • str.lower() / str.upper() – převod velikosti písmen.

  • str.replace() – náhrada podřetězce.

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

2.5.3. Rozdělování a spojování

  • str.split() – rozdělí řetězec na seznam na každém výskytu oddělovače (výchozí: libovolný úsek bílých znaků).

  • str.join() – opačně: slepí posloupnost řetězců dohromady s příjemcem coby oddělovačem. Toto je efektivní způsob, jak sestavit dlouhý řetězec z částí.

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

2.5.4. f-řetězce

Nejjednodušší způsob, jak vložit hodnoty do řetězce, je f-řetězec (f-string) – řetězcový literál s předponou f. Jakýkoli výraz uvnitř {} se vyhodnotí a vloží:

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

Dvojtečka uvnitř složených závorek uvádí formátovací specifikaci, která řídí, jak se hodnota vykreslí:

  • {x:.2f} – desetinné číslo se 2 číslicemi za desetinnou čárkou.

  • {x:>10} – zarovnání vpravo v poli o šířce 10 znaků.

  • {x:<10} – zarovnání vlevo.

  • {x:0>4} – doplnění úvodními nulami do šířky 4.

  • {x:#x} – šestnáctkově s předponou 0x.

  • {x:b} – binární reprezentace.

>>> 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

Samotné = za názvem výrazu vypíše jak název, tak hodnotu – užitečné pro rychlé ladicí výpisy:

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

2.5.4.1. Převody celých čísel mezi soustavami

Tři vestavěné funkce dělají stejnou práci jako formátovací specifikace :b / :o / :x, ale vracejí převedený řetězec přímo:

  • bin() – soustava o základu 2, s předponou "0b".

  • oct() – soustava o základu 8, s předponou "0o".

  • hex() – soustava o základu 16, s předponou "0x".

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

Opačný směr – převod řetězce v soustavě o základu N zpět na celé číslo – používá konstruktor int s explicitním základem:

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

Po těchto funkcích sáhněte, když chcete surový řetězec pro celé číslo (pro řádek logu, konfigurační soubor, výpis registru). Po formátovací specifikaci sáhněte, když chcete doplnění, šířku nebo smíchat hodnotu s dalším textem ve stejném f-řetězci.

2.5.5. Starší styly formátování

f-řetězce jsou doporučovaný styl, ale dva starší přístupy stále fungují a objevují se ve stávajícím kódu:

str.format() – složené závorky s poziční nebo klíčovými argumenty předanými metodě .format() nad šablonovým řetězcem:

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

Formátovací specifikace ({:.2f}, {:>10}, …) fungují stejně jako v f-řetězcích; jediný rozdíl je v tom, kde se hodnota dodává.

Formátování pomocí % (styl printf) – jediný operátor % dosazuje hodnoty do formátovacích kódů, jednu hodnotu na kód. Více hodnot předejte jako n-tici:

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

Nejběžnější typové kódy jsou %s (řetězec), %d (celé číslo), %f (desetinné číslo) a %x (šestnáctkové).

Každý kód % může mezi % a písmenem typu nést modifikátory. Úplná podoba je %[flags][width][.precision]type:

  • width – minimální počet znaků, který musí pole zabrat. Kratší hodnoty se doplní mezerami; delší přetečou. %10d vyhradí 10 znaků a zarovná číslo vpravo.

  • precision – význam závisí na typu. U desetinných čísel počet číslic za desetinnou čárkou. %.2f dává dvě desetinná místa. U řetězců maximální počet znaků k převzetí (%.5s zkrátí na pět).

  • Zarovnání vlevo – příznak - umístí pole vlevo. %-10d umístí číslice na levou stranu s koncovými mezerami.

  • Doplnění nulami – příznak 0 doplní úvodními nulami místo mezer (pro číselné typy). %05d doplní nulami na pět číslic.

  • Znaménko – příznak + u čísel vždy zobrazí znaménko, včetně + u kladných hodnot.

  • Alternativní forma – příznak #. U %x předřadí výstupu 0x; u %o předřadí 0o.

Příznaky, šířku a přesnost lze kombinovat:

>>> "%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

Oba starší styly se čtou hůře a jsou náchylnější k chybám než f-řetězce – v novém kódu sáhněte po f-řetězcích a starší formy poznejte při čtení stávajícího kódu.