2.5. Szöveges metódusok és formázás

A szövegek egy beépített eszközkészlettel érkeznek a vizsgálathoz és átalakításhoz. Mivel a szövegek megváltoztathatatlanok, minden metódus egy új szöveget ad vissza – az eredeti változatlan marad.

2.5.1. Szövegek vizsgálata

  • str.startswith() / str.endswith() – előtag- vagy utótag-teszt; bool értéket ad vissza.

  • str.find() – egy részszöveg első előfordulásának pozíciója, vagy -1, ha hiányzik. A str.index() ugyanezt teszi, de hiány esetén ValueError hibát vált ki.

  • str.count() – az át nem fedő előfordulások száma.

  • in kulcsszó – a "MV" in name True értéket ad vissza, ha a részszöveg bárhol megtalálható a szövegben.

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

2.5.2. Tisztítás és kis-/nagybetű

  • str.strip() – eltávolítja a vezető és záró whitespace karaktereket. Adj át egy karakterekből álló szöveget egy egyéni halmaz eltávolításához (s.strip("/")).

  • str.lower() / str.upper() – kis-/nagybetű átalakítás.

  • str.replace() – részszöveg helyettesítése.

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

2.5.3. Felbontás és összefűzés

  • str.split() – egy szöveget listára bont egy elválasztó minden előfordulásánál (alapértelmezett: bármely whitespace szakasz).

  • str.join() – a fordítottja: szövegek egy sorozatát fűzi össze úgy, hogy a hívó objektum az elválasztó. Ez a hatékony módja egy hosszú szöveg darabokból való felépítésének.

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

2.5.4. f-stringek

A legegyszerűbb módja annak, hogy értékeket illessz be egy szövegbe, az f-string – egy f előtaggal ellátott szövegliterál. A {} belsejében lévő bármely kifejezés kiértékelődik és beillesztődik:

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

A kapcsos zárójeleken belüli kettőspont egy formátum-specifikációt vezet be, amely szabályozza, hogyan jelenik meg az érték:

  • {x:.2f} – lebegőpontos szám 2 számjeggyel a tizedespont után.

  • {x:>10} – jobbra igazítás egy 10 karakteres mezőben.

  • {x:<10} – balra igazítás.

  • {x:0>4} – kitöltés vezető nullákkal 4-es szélességig.

  • {x:#x} – hexadecimális 0x előtaggal.

  • {x:b} – bináris ábrázolás.

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

A kifejezés neve után egyetlen = jel kiírja mind a nevet, mind az értéket – praktikus gyors hibakereső kiíráshoz:

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

2.5.4.1. Egész számok alapátváltásai

Három beépített függvény ugyanazt a feladatot végzi, mint a :b / :o / :x formátum-specifikációk, de közvetlenül az átalakított szöveget adják vissza:

  • bin() – 2-es alap, "0b" előtaggal.

  • oct() – 8-as alap, "0o" előtaggal.

  • hex() – 16-os alap, "0x" előtaggal.

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

Az ellenkező irány – egy N-alapú szöveg visszaalakítása egész számmá – az int konstruktort használja explicit alappal:

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

Akkor nyúlj ezekhez, ha egy egész szám nyers szövegét szeretnéd megkapni (egy naplósorhoz, egy konfigurációs fájlhoz, egy regiszter-kiírathoz). A formátum-specifikációhoz akkor nyúlj, ha kitöltést, szélességet szeretnél, vagy az értéket más szöveggel akarod keverni ugyanabban az f-stringben.

2.5.5. Régebbi formázási stílusok

Az f-stringek az ajánlott stílus, de két régebbi megközelítés még mindig működik, és felbukkan a meglévő kódban:

str.format() – kapcsos zárójelek pozicionális vagy kulcsszavas argumentumokkal, amelyeket egy sablonszöveg .format() metódusának adunk át:

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

A formátum-specifikációk ({:.2f}, {:>10}, …) ugyanúgy működnek, mint az f-stringekben; az egyetlen különbség az, hogy hol adjuk meg az értéket.

% formázás (printf-stílus) – egyetlen % operátor illeszt be értékeket a formátumkódokba, kódonként egy értéket. Több értéket egy rendezett n-esként (tuple) adj át:

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

A leggyakoribb típuskódok a %s (szöveg), %d (egész szám), %f (lebegőpontos szám) és %x (hexadecimális).

Minden % kód módosítókat hordozhat a % és a típusbetű között. A teljes alak a %[flags][width][.precision]type:

  • width – a karakterek minimális száma, amelyet a mezőnek el kell foglalnia. A rövidebb értékeket szóközökkel tölti ki; a hosszabbak túlcsordulnak. A %10d 10 karaktert foglal le, és jobbra igazítja a számot.

  • precision – a jelentése a típustól függ. Lebegőpontos számoknál a tizedespont utáni számjegyek száma. A %.2f két tizedesjegyet ad. Szövegeknél a maximálisan felhasználandó karakterek száma (a %.5s ötre csonkít).

  • Balra igazítás – a - jelző a mezőt balra helyezi. A %-10d a számjegyeket a bal oldalra teszi, záró szóközökkel.

  • Nullával kitöltés – a 0 jelző szóközök helyett vezető nullákkal tölt ki (numerikus típusoknál). A %05d öt számjegyre tölt fel nullákkal.

  • Előjel – a + jelző mindig megjeleníti az előjelet a számokon, beleértve egy + jelet a pozitívaknál.

  • Alternatív forma – a # jelző. A %x esetén 0x előtaggal látja el a kimenetet; a %o esetén 0o előtaggal.

A jelzők, a szélesség és a pontosság kombinálhatók:

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

Mindkét régebbi stílus lassabban olvasható és hibára hajlamosabb, mint az f-stringek – új kódban nyúlj az f-stringekhez, és ismerd fel a régebbi formákat a meglévő kód olvasásakor.