2.5. Metody łańcuchów i formatowanie¶
Łańcuchy mają wbudowany zestaw metod do inspekcji i przekształcania. Ponieważ łańcuchy są niezmienne, każda metoda zwraca nowy łańcuch – oryginał pozostaje nienaruszony.
2.5.1. Inspekcja łańcuchów¶
str.startswith()/str.endswith()– test przedrostka lub przyrostka; zwracabool.str.find()– pozycja pierwszego wystąpienia podłańcucha lub-1w razie jego braku.str.index()robi to samo, ale w razie braku zgłaszaValueError.str.count()– liczba nienakładających się wystąpień.Słowo kluczowe
in–"MV" in namezwracaTrue, jeśli podłańcuch znajduje się gdziekolwiek w łańcuchu.
>>> name = "OpenMV Cam"
>>> name.startswith("Open")
True
>>> name.find("MV")
4
>>> name.count("m")
1
>>> "Cam" in name
True
2.5.2. Czyszczenie i wielkość liter¶
str.strip()– usuwa wiodące i końcowe białe znaki. Przekaż łańcuch znaków, aby usunąć własny zestaw (s.strip("/")).str.lower()/str.upper()– konwersja wielkości liter.str.replace()– podstawienie podłańcucha.
>>> " hello ".strip()
'hello'
>>> "abc-123".replace("-", "_")
'abc_123'
>>> "OpenMV".lower()
'openmv'
2.5.3. Dzielenie i łączenie¶
str.split()– dzieli łańcuch na listę przy każdym wystąpieniu separatora (domyślnie: dowolny ciąg białych znaków).str.join()– operacja odwrotna: skleja sekwencję łańcuchów, używając obiektu wywołującego jako separatora. To wydajny sposób budowania długiego łańcucha z fragmentów.
>>> "1,2,3".split(",")
['1', '2', '3']
>>> "hello world".split()
['hello', 'world']
>>> ", ".join(["a", "b", "c"])
'a, b, c'
2.5.4. f-stringi¶
Najprostszym sposobem wstawienia wartości do łańcucha jest f-string – literał łańcuchowy poprzedzony znakiem f. Dowolne wyrażenie wewnątrz {} jest obliczane i wstawiane:
>>> name = "OpenMV"
>>> count = 42
>>> f"{name} saw {count} blobs"
'OpenMV saw 42 blobs'
Dwukropek wewnątrz nawiasów klamrowych wprowadza specyfikację formatu, która kontroluje sposób renderowania wartości:
{x:.2f}– liczba zmiennoprzecinkowa z 2 cyframi po przecinku.{x:>10}– wyrównanie do prawej w polu o szerokości 10 znaków.{x:<10}– wyrównanie do lewej.{x:0>4}– uzupełnienie wiodącymi zerami do szerokości 4.{x:#x}– liczba szesnastkowa z przedrostkiem0x.{x:b}– reprezentacja binarna.
>>> 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
Pojedynczy znak = po nazwie wyrażenia wypisuje zarówno nazwę, jak i wartość – przydatne przy szybkich wydrukach diagnostycznych:
>>> v = 3.14
>>> print(f"{v=}")
v=3.14
2.5.4.1. Konwersje podstawy liczb całkowitych¶
Trzy funkcje wbudowane wykonują to samo zadanie co specyfikacje formatu :b / :o / :x, ale zwracają przekonwertowany łańcuch bezpośrednio:
bin()– podstawa 2, z przedrostkiem"0b".oct()– podstawa 8, z przedrostkiem"0o".hex()– podstawa 16, z przedrostkiem"0x".
>>> hex(255)
'0xff'
>>> bin(10)
'0b1010'
>>> oct(8)
'0o10'
Kierunek odwrotny – zamiana łańcucha o podstawie N z powrotem na liczbę całkowitą – korzysta z konstruktora int z jawnie podaną podstawą:
>>> int("ff", 16)
255
>>> int("0b1010", 2) # the "0b" prefix is allowed
10
Sięgaj po nie, gdy potrzebujesz surowego łańcucha dla liczby całkowitej (do wiersza logu, pliku konfiguracyjnego, zrzutu rejestru). Sięgaj po specyfikację formatu, gdy potrzebujesz dopełnienia, szerokości lub chcesz wymieszać wartość z innym tekstem w tym samym f-stringu.
2.5.5. Starsze style formatowania¶
f-stringi to zalecany styl, ale dwa starsze podejścia wciąż działają i pojawiają się w istniejącym kodzie:
str.format() – nawiasy klamrowe z argumentami pozycyjnymi lub nazwanymi przekazywanymi do metody .format() na łańcuchu szablonu:
>>> "Hello, {}".format(name)
'Hello, OpenMV'
>>> "{0} + {0} = {1}".format(2, 4)
'2 + 2 = 4'
>>> "{name}: {value}".format(name="frames", value=42)
'frames: 42'
Specyfikacje formatu ({:.2f}, {:>10}, …) działają tak samo jak w f-stringach; jedyna różnica polega na tym, gdzie dostarczana jest wartość.
Formatowanie % (w stylu printf) – pojedynczy operator % podstawia wartości do kodów formatu, po jednej wartości na kod. Wiele wartości przekazuj jako krotkę:
>>> "Hello, %s" % name
'Hello, OpenMV'
>>> "%d + %d = %d" % (2, 2, 4)
'2 + 2 = 4'
>>> "%.2f" % 3.14159
'3.14'
Najczęstsze kody typów to %s (łańcuch), %d (liczba całkowita), %f (liczba zmiennoprzecinkowa) i %x (szesnastkowa).
Każdy kod % może nieść modyfikatory między % a literą typu. Pełna postać to %[flags][width][.precision]type:
width – minimalna liczba znaków, jaką musi zająć pole. Krótsze wartości są uzupełniane spacjami; dłuższe przepełniają pole.
%10drezerwuje 10 znaków i wyrównuje liczbę do prawej.precision – znaczenie zależy od typu. Dla liczb zmiennoprzecinkowych to liczba cyfr po przecinku.
%.2fdaje dwa miejsca po przecinku. Dla łańcuchów to maksymalna liczba znaków do wzięcia (%.5sskraca do pięciu).Wyrównanie do lewej – flaga
-umieszcza pole po lewej stronie.%-10dumieszcza cyfry po lewej stronie z końcowymi spacjami.Uzupełnianie zerami – flaga
0uzupełnia wiodącymi zerami zamiast spacjami (dla typów liczbowych).%05duzupełnia zerami do pięciu cyfr.Znak – flaga
+zawsze pokazuje znak przy liczbach, w tym+dla liczb dodatnich.Forma alternatywna – flaga
#. Dla%xpoprzedza ona wynik przedrostkiem0x; dla%opoprzedza0o.
Flagi, szerokość i precyzję można łączyć:
>>> "%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 starsze style są wolniejsze do odczytania i bardziej podatne na błędy niż f-stringi – w nowym kodzie sięgaj po f-stringi, a starsze formy rozpoznawaj podczas czytania istniejącego kodu.