Tekst, ale z metodami
Napis (string) w Pythonie to ciąg znaków i będziesz go używać częściej niż jakiegokolwiek innego typu. Każda nazwa, etykieta, wiadomość, adres URL, ścieżka pliku i odpowiedź z API w którymś momencie jest napisem.
Tworzysz go w cudzysłowie: pojedynczym, podwójnym albo potrójnym:
Cudzysłowy pojedyncze i podwójne są wymienne. Używaj tych, przy których nie musisz poprzedzać znaku ukośnikiem. "don't" jest czyste; 'don\'t' wymaga ukośnika wstecznego.
Napisy są niemodyfikowalne. Gdy napis już istnieje, nie możesz zmienić żadnego jego znaku w miejscu. Każda operacja, która wygląda, jakby zmieniała napis, w rzeczywistości zwraca nowy. Dlatego piszesz text = text.upper(), a nie samo text.upper(): bez ponownego przypisania nowy napis wielkimi literami zostałby wyrzucony.
Łączenie i powtarzanie
Dwa operatory załatwiają większość łączenia napisów, jakiego potrzebujesz:
+ łączy napisy. * powtarza napis. Oba zwracają nowy napis.
Łączenie wielu kawałków przez + szybko robi się brzydkie. Gdy mieszasz w wiadomości wartości różnych typów, sięgnij zamiast tego po f-stringi, opisane w następnej sekcji.
f-stringi: tak zwykle będziesz formatować
Postaw f przed otwierającym cudzysłowem, a napis stanie się szablonem. Wszystko w {...} zostanie zastąpione wartością tego wyrażenia:
W klamrach możesz umieścić dowolne wyrażenie: zmienne, arytmetykę, wywołania metod i funkcji. Niech jednak będą proste; jeśli kusi cię, żeby wcisnąć do {...} trzylinijkowe obliczenie, najpierw zapisz wynik w nazwanej zmiennej.
f-stringi obsługują też specyfikatory formatu po dwukropku, które sterują formatowaniem liczb, dopełnianiem i wyrównaniem:
To te same specyfikatory, których używa str.format(). Warto je szybko przejrzeć, gdy poczujesz się pewnie z podstawami. W kodzie pierwszego dnia nie są potrzebne.
Wycinki: wybierz kawałek
Napisy można indeksować jak sekwencje. Każdy znak ma pozycję liczoną od zera i możesz pobrać jeden znak albo zakres:
Wzorzec [start:stop:step] pojawia się też w listach i innych sekwencjach, więc kilka minut poświęconych na jego przyswojenie zwraca się wszędzie.
Dwie rzeczy, na które warto zwrócić uwagę:
- Indeks
stopnie wchodzi do wyniku:word[0:2]obejmuje indeksy 0 i 1, bez 2. - Ujemne indeksy liczą od końca:
-1to ostatni znak,-2przedostatni i tak dalej.
Jak odwrócić napis
Napisy nie mają metody .reverse(), bo są niemodyfikowalne, ale wycinek z krokiem -1 załatwia sprawę w jednej linii:
word[::-1] czyta się jako "od początku do końca, krokiem wstecz o 1". Wynik to zupełnie nowy napis; oryginał pozostaje nietknięty. Jeśli chcesz przejść po znakach od końca bez tworzenia nowego napisu, reversed(word) zwraca leniwy iterator.
Jak sprawdzić długość napisu
len(text) zwraca liczbę znaków:
Zauważ, że len liczy punkty kodowe Unicode, a nie bajty. len("café") to 4, a nie 5, choć zapis w UTF-8 zajmuje więcej bajtów. Zwykle właśnie o to chodzi.
Jak sprawdzić, czy napis zawiera podciąg
Idiomatycznym sprawdzeniem jest operator in, który czyta się jak zwykłe zdanie:
Żeby sprawdzać bez rozróżniania wielkości liter, najpierw ujednolić obie strony:
Jeśli potrzebujesz pozycji, a nie tylko odpowiedzi tak/nie, użyj .find(): zwraca indeks albo -1, gdy podciągu nie ma.
Popularne metody napisów
Napisy mają dziesiątki metod. Po tę garść będziesz sięgać bez przerwy:
Dzielenie i łączenie:
.split(separator) zamienia napis w listę. separator.join(list_of_strings) skleja ją z powrotem. Te dwie metody wykonują nieproporcjonalnie dużą część prawdziwej pracy z napisami.
Jeszcze jedna przydatna para:
To parser jednoliniowego wpisu konfiguracji w trzech liniach. Małe napisy, duże możliwości.
Sprawdzanie zawartości
Kilka metod zwraca wartości logiczne, przydatne w warunkach if:
Używaj ich oszczędnie: nie obsługują zawiłości Unicode tak, jak można by się spodziewać. Przy wszystkim poza ASCII oprzyj się na module regex albo module unicodedata.
Znaki specjalne i ucieczka
Niektóre znaki wymagają ukośnika wstecznego, żeby pojawić się w napisie:
Jeśli piszesz ścieżki Windows albo wyrażenia regularne, surowe napisy ułatwiają życie. Postaw r przed cudzysłowem, a ukośniki wsteczne przestaną być znakami ucieczki:
Napisy są wszędzie, więc dbaj o czytelność
Trzy nawyki, które chronią kod pełen napisów przed zamianą w zupę:
- Do wstawiania wartości używaj f-stringów. Nie łącz
+wartości wielu typów. - Przypisuj ponownie, gdy "zmieniasz" napis.
text = text.strip(), a nie samotext.strip(). - Sięgaj po
.split()i.join(), zanim napiszesz ręczne pętle do parsowania albo składania tekstu. Są szybsze, czytelniejsze i trudniej w nich o błąd.
Dalej: f-stringi dokładniej, czyli narzędzie do formatowania, które pojawiło się już kilka razy, oraz specyfikatory formatowania liczb i dat, dla których warto je opanować.
Najczęściej zadawane pytania
Czym jest f-string w Pythonie?
f-string to literał napisu z przedrostkiem f, w którym wszystko w {...} zostaje zastąpione wartością tego wyrażenia. Przykład: f"Hello, {name}!" wstawia do napisu bieżącą wartość name w trakcie działania programu.
Jak odwrócić napis w Pythonie?
Użyj wycinka z krokiem -1: reversed_text = original[::-1]. Zwraca to nowy napis złożony z tych samych znaków w odwrotnej kolejności. Oryginalny napis pozostaje nietknięty, bo napisy w Pythonie są niemodyfikowalne.
Jak podzielić napis w Pythonie?
Wywołaj .split() na napisie. Bez argumentu dzieli po dowolnych białych znakach: "a b c".split() zwraca ['a', 'b', 'c']. Możesz przekazać konkretny separator: "a,b,c".split(",") zwraca ['a', 'b', 'c'].
Czy napisy w Pythonie są modyfikowalne?
Nie. Napisy są niemodyfikowalne: gdy napis już istnieje, nie możesz zmienić żadnego jego znaku w miejscu. Każda metoda, która "zmienia" napis, w rzeczywistości zwraca nowy. Dlatego widzisz wzorce takie jak text = text.strip(): przypisujesz zmiennej nowy napis.
Jak łączyć napisy w Pythonie?
Użyj +, żeby połączyć dwa napisy: "hello" + " " + "world". Żeby wstawić wartość do zdania, wybierz f-string: f"Hello, {name}". Do łączenia wielu kawałków z listy użyj separator.join(pieces): to szybsze i czytelniejsze niż łańcuch +.
Jak sprawdzić długość napisu w Pythonie?
Wywołaj wbudowaną funkcję len(text). Zwraca liczbę znaków (punktów kodowych Unicode), więc len("café") to 4. Żeby poznać długość w bajtach, najpierw zakoduj napis: len(text.encode("utf-8")).