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 namevrá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ředponou0x.{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.
%10dvyhradí 10 znaků a zarovná číslo vpravo.precision – význam závisí na typu. U desetinných čísel počet číslic za desetinnou čárkou.
%.2fdává dvě desetinná místa. U řetězců maximální počet znaků k převzetí (%.5szkrátí na pět).Zarovnání vlevo – příznak
-umístí pole vlevo.%-10dumístí číslice na levou stranu s koncovými mezerami.Doplnění nulami – příznak
0doplní úvodními nulami místo mezer (pro číselné typy).%05ddoplní 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%xpředřadí výstupu0x; u%opř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.