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 szesnastkowymHH\uHHHH– punkt kodowy UnicodeHHHH
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.
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().