Znaki i teksty
Znaki i ich kodowanie
Znaki w Pythonie (jak zresztą w każdym innym języku programowania) to standardowe symbole służące do zapisu tekstu stosowane we wszystkich językach świata łącznie ze znakami interpunkcyjnymi, symbolami działań, nawiasami i spacją. Obok tego występują jeszcze znaki sterujące (przejście do nowej linijki, nowego akapitu, skoki, kasowanie znaków itp.).
Znaki w języku maszynowym to ciąg aktywnych lub nieaktywnych bitów ułożonych w bajty. Mają one zatem taką samą reprezentację jak liczby i tylko program wie jak dany bajt traktować. Odpowiednim znakom odpowiadają zatem liczby całkowite, które mają taką samą sekwencję aktywnych bitów. Są to numery kodowe poszczególnych znaków.
Najstarszym i najważniejszym systemem kodowania znaków jest standard ASCII. Składa się on ze znaków standardowych (128 symboli zakodowanych w 7-bitowym bajcie) i znaków rozszerzonego kodu ASCII. Znaki od 0 do 31 są to znaki sterujące. Znaki od numeru 32 do 126 dają widoczny symbol lub spację (znak 32), znak o numerze 127 należy do znaków sterujących (DEL). Znaki od numeru 128 do 255 to znaki rozszerzonego kodu ASCII.
Znaki w Pythonie zapisuje się w cudzysłowie lub między znakami apostrofów. Jeżeli liczby mają być potraktowane jako znaki, muszą być objęte cudzysłowem lub apostrofami. Można to prześledzić kopiując do Thonny następujący kod:
print(‘a’) print(“b”) print(‘1’,”2″) |
>>> a b 1 2 |
Uruchomienie tego kodu spowoduje pojawienie się odpowiednich znaków i tekstów w oknie wyników już bez apostrofów i cudzysłowów. Tymczasem w IDLE Pythona teksty wynikowe ograniczone są cudzysłowami.
Numery znaków w systemie dziesiątkowym możemy uzyskać za pomocą funkcji ord(), której argumentem musi być znak znajdujący się na klawiaturze. Funkcją odwrotną do ord() jest chr(), której argumentem musi być liczba całkowita. Obok numeru znaku w systemie dziesiętnym możemy uzyskać tzw. escape kode znaku w kodzie ASCII. Są to zaszyfrowane kody znaków, z których znaki od 0 do 255 zaczynają się od litery x, a znaki rozszerzonego kodu od litery u. Są częścią międzynarodowego systemu kodowania znaków koordynowanego przez ISO, który docelowo chce przypisać każdemu symbolowi używanemu gdzieś na świecie, jako symbol pisma, pewien numer binarny. Funkcja ascii() wyświetla albo znak (gdy występuje on na klawiaturze) bądź też escape kode tego znaku, gdy jest to znak sterujący lub spoza podstawowego zakresu znaków ASCII. Argumentami liczby chr() mogą być liczby większe od 128. Wyświetlają się wtedy znaki z aktywnych stron kodowych.
print(ord(‘A’), chr(ord(‘A’)), ascii(‘A’)) print(ord(‘\n’), chr(ord(‘\n’)), ascii(chr(ord(‘\n’)))) print(ord(‘\t’), chr(ord(‘\t’)), ascii(chr(ord(‘\t’)))) print(chr(70), ord(chr(70)), ascii(chr(70))) print(chr(200), ord(chr(200)), ascii(chr(200))) print(chr(260), ord(chr(260)), ascii(chr(260))) |
>>> 65 A ‘A’ 10 ‘\n’ 9 ‘\t’ F 70 ‘F’ E 200 ‘\xc8’ Ą 260 ‘\u0104’ |
Ukośnik \ jest wyjątkiem, dla którego nie można wyznaczyć numeru znaku. Służy on bowiem w Pythonie do wprowadzania do tekstu pewnych znaków sterujących. Dwuznak \n przenosi część tekstu poza nim do drugiej linijki. Jest więc odpowiednikiem znaku końca wiersza. Nie jest on widoczny na klawiaturze. Dwuznak \t jest odpowiednikiem znaku tabulacji. Zazwyczaj odsuwa on teksty od siebie o kilka spacji (do kolejnego miejsca wyznaczonego jako miejsce końca tabulacji).
Teksty
Teksty to po prostu serie znaków. Wpisujemy do Pythona ograniczając je apostrofami (‘ ‘), cudzysłowami (” “) lub potrójnym cudzysłowem (“”” “””). Ten ostatni pozwala na zapisanie tekstu w kilku linijkach.
print(‘Akcja “Pana Tadeusza” rozgrywa się na Litwie’) print(‘Akcja “Pana Tadeusza” \t rozgrywa się na Litwie’) print(“Prawo Hardy’ego-Weinberga”) print(“””Praca licencjacka napisana pod kierunkiem prof. Biologicza”””) print(“Praca licencjacka \n napisana pod kierunkiem prof. Biologicza”) |
>>> Akcja “Pana Tadeusza” rozgrywa się na Litwie Akcja “Pana Tadeusza” rozgrywa się na Litwie Prawo Hardy’ego-Weinberga Praca licencjacka napisana pod kierunkiem prof. Biologicza Praca licencjacka napisana pod kierunkiem prof. Biologicza |
Działania na tekstach
Teksty możemy łączyć za pomocą działania + i powielać za pomocą działania *. Działanie * zachodzi między tekstem a liczbą całkowitą. Może być ona napisana z lewej lub prawej strony tekstu.
print(‘kuku’+”ryku”) print(“kuku”*2) print(‘kuku’*2+’ryku’*3) print(2*’kuku’+3*’ryku’) |
>>> kukuryku kukukuku kukukukurykurykuryku kukukukurykurykuryku |
Relacje między znakami i tekstami
Za pomocą wieloznaków ‘==’,’in’, ‘not in’ możemy sprawdzać jednakowość tekstów, czy tekst z lewej zawiera się w tekście z prawej i czy tekst z lewej nie zawiera się w tekście z prawej. Wyniki są wartościami logicznymi True i False. Wygląda to następująco:
print(‘aaa’==”aaa”) print(‘aab’ in “baba abec”) print(‘aab’ not in “baba abec”) |
>>> True False True |
Za pomocą znaków ‘<‘, ‘<=’ sprawdzimy czy tekst z lewej jest przed tym po prawej w kolejności wyznaczonej przez numery jego znaków w kodzie ASCI, a za pomocą znaków ‘>’, ‘>=’ sprawdzimy czy jest odwrotnie. Kolejność znaków pokazuje następujący ciąg:
!”#$%&'()*+,-./023456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}Kolejność tekstów wyznacza się od pierwszego miejsca, w którym te teksty różnią się. Wygląda to następująco:
print(‘012′<“_012”) print(‘aab'<= “aaB”) print(‘aaa’>”AAA”) print(‘AAB’>=”AAA”) |
>>> True False True True |
W wyniku działania tego programu uzyskamy True False True True.
Dla tekstów działają wbudowane w system funkcje min() i max(). Pierwsza pokazuje najmniejszy w systemie ASCI znak tekstu, a druga największy.
print(min(‘Ala_ma_Asa,_a_Ola_ma_trzy_koty’)) print(max(‘Ala_ma_Asa,_a_Ola_ma_trzy_koty’)) |
>>> , z |
Konwersja liczb na tekst i tekstu na liczbę
Konwersja liczb na napisy może być uzyskana na trzy sposoby. Można liczbę otoczyć apostrofami, cudzysłowami lub zastosować funkcje str(). W drugą stronę, konwersja napisów na liczby, może być zastosowana za pomocą funkcji int(), float(), complex() tylko wtedy, gdy napis ma postać liczby całkowitej, rzeczywistej lub zespolonej.
print(‘1’+”2″+str(3)) print(int(“2″*2)*2) |
>>> 123 44 |
Wyodrębinanie znaków i podtekstów z tekstu
Do poszczególnych znaków tekstu, oraz jego fragmentów, można “dostać się” za pomocą nawiasów kwadratowych w których zawiera się indeks lub indeksy – liczb całkowite określające miejsce występowania znaków w tekście licząc od lewej strony gdy są to liczby dodatnie i licząc od prawej strony gdy są to liczby ujemne. Pierwszy znak w tekście od lewej ma indeks równy 0. Ostatni ma indeks -1. Indeks postaci n1:n2 oznacza fragment tekstu od n1-szego znaku do n2. Możliwe jest także indeksowanie domyślne :n oznacza 0:n a -5: oznacza od -5 znaku do końca.
print(‘Ala ma Asa, a Ola ma trzy koty'[0]) print(‘Ala ma Asa, a Ola ma trzy koty'[-1]) print(‘Ala ma Asa, a Ola ma trzy koty'[7:-7]) print(‘Ala ma Asa, a Ola ma trzy koty'[:7]) print(‘Ala ma Asa, a Ola ma trzy koty'[-7:]) print(‘Ala ma Asa, a Ola ma trzy koty'[10:7]+’pusty’) |
>>> A y Asa, a Ola ma tr Ala ma zy koty pusty |
Po wykonaniu takich podstawień uzyskamy odpowiednie fragmenty tekstu. Gdy indeks przekracza długość tekstu pojawia się komunikat o błędzie.
Metoda ‘split’ rozdziela tekst na podteksty według znaku podanego w nawiasie.
print(‘Ala Lala Lajlala Salamalajlala’.split(‘ ‘)) |
>>> [‘Ala’, ‘Lala’, ‘Lajlala’ ‘Salamalajlala’] |
Metoda ta nie pozwala na rozdzielenie tekstu na pojedyncze znaki.
Funkcje i metody tekstowe
Funkcja type(‘tekst’) zlicza wszystkie znaki występujące w tekscie łącznie ze spacjami.
print(type(‘Mama ma mata’)) |
>>> <class ‘str’> |
Funkcja len(‘tekst’) zlicza wszystkie znaki występujące w tekscie łącznie ze spacjami.
print(len(‘Ala ma Asa, a Ola ma trzy koty’)) print(len(‘Ala_ma_Asa,_a_Ola_ma_trzy_koty’)) print(len(‘Ala ma Asa,\n a Ola ma trzy koty’)) |
>>> 30 30 31 |
Dwuznak ‘\n’ został policzony jako jeden znak.
‘Metody’ to rodzaje funkcji (często kilkuargumentowej) o specyficznej budowie. Tworzy się j dopisując nazwę metody do jednego z jej argumentów (po kropce), a drugi argument umieszczany jest w nawiasach okrągłych. Taką metodą są ‘index’ której wynik jest liczbą wskazującą gdzie znak umieszczony nawiasie pojawia się w tekście po raz pierwszy. Inną metoda jest ‘count’ który zlicza ile razy znak w nawiasie pojawia się w tekście. Obie metody działają także na wieloznakowych podtekstach.
print(‘Ala ma Asa, a Ola ma trzy koty’.index(‘A’)) print(‘Ala ma Asa, a Ola ma trzy koty’.index(‘la’)) print(‘Ala ma Asa, a Ola ma trzy koty’.count(‘a’)) print(‘Ala ma Asa, a Ola ma trzy koty’.count(‘la’)) |
>>> 0 1 6 2 |
Widać, że miejsce znaku Python wyznacza licząc od 0 (dla pierwszego znaku). Ponadto znak ‘A’ odróżnił od znaku ‘a’.
Metoda ‘upper’ zamienia wszystkie litery na duże a metoda ‘lower’ zamienia wszystkie litery na małe.
print(‘Ala ma Asa, a Ola ma trzy koty’.upper()) print(‘Ala ma Asa, a Ola ma trzy koty’.lower()) |
>>> ALA MA ASA, A OLA MA TRZY KOTY ala ma asa, a ola ma trzy koty |
Metoda ‘startswith’ sprawdza czy tekst zaczyna się od frazy występującej w nawiasie, a metoda ‘endswith’ sprawdza czy się nią kończy. Obie te funkcje zwracają odpowiednie wartości logiczne.
print(‘Ala ma Asa, a Ola ma trzy koty’.startswith(‘Ala’)) print(‘Ala ma Asa, a Ola ma trzy koty’.endswith(‘Asa’)) |
>>> True Folse |
Ciekawie działa metoda ‘join’. Do poszczególnych znaków w nawiasie zostaje dołączony tekst.
print(‘Mama ma mata’.join(‘1234 ‘)) |
>>> 1 Mama ma mata 2 Mama ma mata 3 Mama ma mata 4 Mama ma mata |
Duże zastosowanie może mieć metoda ‘split’ rozdzielająca tekst na podteksty według znaku podanego w nawiasie. Może to służyć do wyodrębnienia potrzebnych informacji z plików tekstowych tworzonych przez urządzenia rejestrujące zdarzenia podczas eksperymentów laboratoryjnych lub obserwacji terenowych.
print(‘Ala ma Asa, a Ola ma trzy koty’.split(‘,’)) print(‘Ala ma Asa, a Ola ma trzy koty’.split(‘ ‘)) print(‘Ala_ma_Asa,_a_Ola_ma_trzy_koty’.split(‘_’)) print(‘Ala_ma_Asa,_a_Ola_ma_trzy_koty’.split(”)) |
>>> [‘Ala ma Asa’, ‘ a Ola ma trzy koty’] [‘Ala’, ‘ma’, ‘Asa,’, ‘a’, ‘Ola’, ‘ma’, ‘trzy’, ‘koty’] [‘Ala’, ‘ma’, ‘Asa,’, ‘a’, ‘Ola’, ‘ma’, ‘trzy’, ‘koty’] Traceback (most recent call last): File “C:\Users\User\AppData\Local\Programs\Thonny\Lib\site-packages\jedi\third_party\typeshed\ stdlib\3\builtins.pyi”, line 4, in print(‘Ala_ma_Asa,_a_Ola_ma_trzy_koty’.split(”)) ValueError: empty separator |
Metoda split nie pozwala jednak na rozdzielenie tekstu na pojedyncze znaki, które w nim występują. Operację tę można wykonać kombinacją metod join i split.
print((‘_’.join(‘Ala ma Asa, a Ola ma trzy koty’)).split(‘_’)) |
>>> [‘A’, ‘l’, ‘a’, ‘ ‘, ‘m’, ‘a’, ‘ ‘, ‘A’, ‘s’, ‘a’, ‘,’, ‘ ‘, ‘a’, ‘ ‘, ‘O’, ‘l’, ‘a’, ‘ ‘, ‘m’, ‘a’, ‘ ‘, ‘t’, ‘r’, ‘z’, ‘y’, ‘ ‘, ‘k’, ‘o’, ‘t’, ‘y’] |