Ta strona wykorzystuje ciasteczka ("cookies") w celu zapewnienia maksymalnej wygody w korzystaniu z naszego serwisu. Czy wyrażasz na to zgodę?

Czytaj więcej
< All Topics
Print

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’]
Spis treści