2.4. Ciągi znaków

Ciąg znaków (string) to sekwencja znaków Unicode zapisana w cudzysłowach. Cudzysłowy pojedyncze i podwójne są równoważne – wybierz styl, który pozwala uniknąć ucieczki cudzysłowów występujących wewnątrz tekstu:

name    = "OpenMV Cam"
company = 'OpenMV, LLC'
message = "She said \"hi\""        # both styles can be used
same    = 'She said "hi"'

Ciągi w potrójnych cudzysłowach ("""...""" lub '''...''') mogą obejmować wiele wierszy i zachowują znaki nowej linii dosłownie:

banner = """boot ok
firmware v1.28
"""
print(banner)

Wynik:

boot ok
firmware v1.28

2.4.1. Sekwencje ucieczki

Wewnątrz zwykłego ciągu znaków \ wprowadza znak specjalny:

  • \n – nowa linia

  • \t – tabulator

  • \\ – dosłowny ukośnik wsteczny

  • \' / \" – dosłowny cudzysłów (gdy w przeciwnym razie zakończyłby ciąg)

  • \xHH – znak o kodzie szesnastkowym HH

  • \uHHHH – punkt kodowy Unicode HHHH

Gdy ciąg zawiera wiele ukośników wstecznych, poprzedź literał znakiem r, aby uczynić go ciągiem surowym (raw). Ukośniki wsteczne są wtedy traktowane dosłownie – \n pozostaje sekwencją dwóch znaków zamiast zostać zastąpionym znakiem nowej linii:

win_path = r"C:\Users\OpenMV\camera.py"
literal  = r"\n is two characters, not a newline"

2.4.2. Konkatenacja i powielanie

Dwa ciągi łączy się operatorem +; ciąg powiela się operatorem *:

greeting = "Hello, " + name + "!"
line     = "-" * 40              # 40-character separator

Powtarzanie + w pętli alokuje nowy ciąg przy każdej iteracji. Do budowania większych ciągów z wielu fragmentów użyj str.join().

2.4.3. Długość, indeksowanie i wycinki

len() zwraca liczbę znaków w ciągu. Indeksowanie za pomocą [] zwraca jednoznakowy ciąg na danej pozycji; indeksy ujemne liczone są od końca:

>>> s = "OpenMV"
>>> len(s)
6
>>> s[0]
'O'
>>> s[-1]
'V'

Wycinek s[start:stop] zwraca podciąg od pozycji start aż do, ale nie wliczając, stop. Każdy z końców można pominąć, co oznacza odpowiednio „początek” lub „koniec”, a opcjonalna trzecia wartość s[start:stop:step] pozwala pomijać znaki.

Ciąg "OpenMV" ze znacznikami pozycji pomiędzy każdym znakiem, ilustrujący, jak wycinek wybiera znaki między dwiema pozycjami.

Pozycje wycinka znajdują się pomiędzy znakami. s[2:5] wybiera znaki na pozycjach 2, 3 i 4.

>>> s = "OpenMV"
>>> s[2:5]
'enM'
>>> s[:3]
'Ope'
>>> s[3:]
'nMV'
>>> s[::-1]
'VMnepO'                     # whole string, reversed

Wycinek wykraczający poza zakres po cichu zwraca tę część, która istnieje – s[100:200] to pusty ciąg "", a nie błąd. Indeksowanie poza zakresem natomiast zgłasza IndexError.

2.4.4. Niezmienność

Ciągów znaków nie można modyfikować w miejscu. Operacje, które wyglądają, jakby zmieniały ciąg, w rzeczywistości zwracają nowy ciąg i pozostawiają oryginał bez zmian:

>>> name = "OpenMV"
>>> name.upper()
'OPENMV'
>>> name
'OpenMV'                     # unchanged

Aby „zmienić” ciąg, ponownie przypisz nazwę do nowej wartości: name = name.upper().