PYI_RY_W13_M07 Podstawowe operacje na tekstach
W języku Python stosujemy dwie podstawowe funkcje pozwalające przeprowadzać operacje na kodach ASCII:
Funkcja | Przykład |
|---|---|
|
|
|
|
Funkcja chr() przyjmuje jako argument liczbę całkowitą (kod ASCII), a zwraca odpowiadający jej znak.
Funkcja ord() działa odwrotnie – jako argument przyjmuje znak, a zwraca odpowiadający mu kod ASCII.
Ciągi znaków w języku Python
W języku Python teksty są obiektami typu string (a dokładniej obiektami klasy str).
Oto przykłady definiowania i wyświetlania ciągów znaków:
Do sprawdzenia długości tekstu w języku Python służy funkcja len():
Obiekt typu string w języku Python jest niezmienną sekwencją. Do poszczególnych znaków możemy się odwołać za pomocą indeksu.
Przeanalizujmy zdanie: „Jeśli rozwiązanie jest łatwe do wyjaśnienia, to możliwe, że jest ono dobrym rozwiązaniem” (sentencja to fragment ZEN języka Python tłumaczonego na język polski). Całe zdanie możemy potraktować jako ciąg pojedynczych znaków i odwoływać się do konkretnych elementów, podając ich indeksy (indeks pierwszego znaku wynosi 0).
Możemy również odwołać się do części napisu, używając wyrażeń indeksujących. Pozwala to tworzyć kod działający podobnie jak pętla, ale łatwiejszy do zapisania.
Oto zapis z wykorzystaniem pętli:
Identyczny efekt uzyskamy z użyciem wyrażenia indeksującego:
Inne przykłady użycia wyrażeń indeksujących:
W ciągach znaków można odwoływać się do konkretnego elementu (podobnie jak w przypadku listy), ale nie da się zmieniać poszczególnych elementów – język Python zgłosi w takim przypadku błąd: TypeError: 'str' object does not support item assignment.
Oto przykład błędnego polecenia:
Stosowanie wyrażeń indeksujących należy do tzw. pythonizmów. Warto je znać – pozwalają one uprościć tworzony program. Umiejętność działań na wycinkach (slicerach) przydaje się podczas operacji na tekstach. Wyrażenia umożliwiają zapisanie wspak podanego ciągu znaków. Przedstawiona poniżej instrukcja print oznacza: odczytuj napis od znaku ostatniego do pierwszego (czytaj cały tekst, zmniejszając indeksy, czyli od końca do początku).
Działania na ciągach znaków: dodawanie i mnożenie
Oczywiście nie da się mnożyć tekstu przez tekst (przykładowo: 'Adam' * 'Linux'). Możliwe jest natomiast mnożenie obiektów klasy str przez liczby typu int oraz dodawanie napisów do siebie.
Operacja | Dozwolona | Przykład |
|---|---|---|
Dodawanie | TAK |
|
| NIE |
|
| TAK |
|
Przykład operacji dodawania:
Operacja mnożenia:
Przygotujmy funkcję, która będzie tworzyła prostokąt o podanych wymiarach, wypełniony znakami – przykładowo: prostokat(x, y, znak).
Specyfikacja problemu:
Dane:
x– szerokość tworzonego prostokąta; liczba naturalna dodatniay– wysokość tworzonego prostokąta; liczba naturalna dodatniaznak– litera, z której będzie tworzony prostokąt; znak
Wynik:
Program wypisuje stworzony ze znaków znak prostokąt o zadanych wymiarach.
W klasie str dostępna jest metoda center(). Pozwala ona osiągnąć interesujące efekty podczas pracy z tekstami. Przykładowo: polecenie ' + '.center(15,'$') da wynik: '$$$$$$ + $$$$$$' – ustawi dany ciąg znaków na środku, tak aby łączna długość wynikowego ciągu znaków wynosiła 15, a puste miejsca uzupełni znakiem $.
Wszystkie metody klasy str możemy poznać, wydając polecenie dir():
Proste kodowanie tekstu
Przejdźmy do kodowania. Możemy do tego celu wykorzystywać poznane właśnie elementy języka Python. Napiszemy dwie funkcje - pierwsza zamieni podany jej tekst w ciąg kodów ASCII, odpowiadających poszczególnym znakom, a druga wykona operację odwrotną, czyli zamieni ciąg kodów ASCII w tekst składający się ze znaków odpowiadających kolejnym kodom.
Przykładową implementację i efekty działania funkcji prezentuje następujący kod:
Napisz program odkodowujący tajny tekst zapisany za pomocą kodów ASCII. Dzięki temu odczytasz ciekawostkę (m.in. na temat oprogramowania FLOSS).
Przetestuj działanie programu dla tablicy:
Specyfikacja problemu:
Dane:
tajny– wiadomość zakodowana za pomocą kodów ASCII; tablica liczb naturalnych
Wynik:
Program wypisuje odkodowaną wiadomość.
Operacje na dłuższych tekstach
Wykonajmy kilka operacji na fragmencie dokumentu zawierającego wiele zdań. Jako przykład posłuży nam zbiór felietonów Tadeusza Boya-Żeleńskiego pt. Dziewice konsystorskie (dostępny w domenie publicznej).
Oto wybrany fragment:
W kolejnych e‑materiałach dowiesz się, jak zapisać i wczytać tekst z pliku – teraz natomiast zapiszemy cały tekst w jednej zmiennej, z użyciem notacji pozwalającej na definiowanie napisów wielolinijkowych:
Ujęcie tekstu w znaki trzech cudzysłowów (lub trzech apostrofów) powoduje, że wszystkie znaki – włącznie ze znakami nowej linii – zostają zapisane do zmiennej dane. Możemy podzielić tekst na listę za pomocą metody split(). Konwertujemy wtedy tekst na listę, której elementami są łańcuchy znaków zawierające poszczególne linie.
Funkcje count() i find()
W rozwiązaniu kolejnego problemu użyjemy dwóch ważnych funkcji: count() i find().
Pierwsza z nich: count() służy do zliczania wystąpień danego wzorca w tekście. Jeżeli wzorzec nie występuje, zwraca ona wartość 0.
Funkcja find() wyszukuje wzorzec w tekście i zwraca pozycję jego pierwszego wystąpienia. Funkcja zwraca wartość -1, jeżeli wzorzec nie występuje w tekście.
Znajdźmy odpowiedzi na następujące pytania:
Z ilu zdań składa się tekst? Dowiemy się tego, licząc kropki, wykrzykniki i znaki zapytania; wykorzystamy metodę
count().Ile spacji zawiera tekst? Aby to sprawdzić, ponownie użyjemy metody
count().Ile słów „się” znajdziemy w tekście? Tu znów sięgniemy po metodę
count().Na której pozycji zapisano pierwsze słowo „się”? By się tego dowiedzieć, skorzystamy z metody
find().
Przykładowy tekst należy przekształcić w:
ciąg złożony z co piątego znaku, zaczynając od pierwszego znaku w tekście;
tekst, w którym słowa „się” zostaną zamienione na „XXX”, a „kiedy” na „ZZZZ”.
ASCII ART – sztuka zapomniana
Operując na ciągach znaków, można tworzyć oryginalne napisy. Służy do tego biblioteka ART, która jest projektem typu Open Source. Kod biblioteki znajdziemy w serwisie GitHub.
Funkcja text2art pozwala na takie przetworzenie łańcucha znaków, że zostaje on wyświetlony w formie graficznej za pomocą innego łańcucha znaków.
Funkcja art natomiast wyświetla graficzną reprezentację łańcucha znaków. Oto przykłady zastosowania:
W roku Paulina Piotrowska, studentka Akademii Sztuk Pięknych w Gdańsku, napisała pracę magisterską zatytułowaną „ASCII ART” (nr albumu 4836).
We wstępie czytamy:
ASCII ARTASCII Art, według mnie pierwsza i jedyna najbardziej skomputeryzowana forma przedstawienia grafiki w formie cyfrowej. Tworzona za pomocą pierwotnego narzędzia, jakiego używa współczesny grafik komputerowy – klawiatury. Dodatkowo tworzona w najbardziej podstawowym programie, którego używają programiści – edytorze tekstu.
Źródło: Paulina Piotrowska, ASCII ART, 2009, dostępny w internecie: archive.org [dostęp 7.04.2021].
Podsumujmy najważniejsze elementy tego e‑materiału:
Ciągi znaków w języku Python są obiektami klasy
str, a składają się ze znaków ASCII.Ciągi znaków są niezmiennymi sekwencjami.
Ciągi znaków możemy przetwarzać, stosując metody takie jak
split(),count()czyfind().
Słownik
moduł służący do graficznego przedstawienia napisu złożonego ze znaków ASCII; należy go zainstalować, korzystając z komendy pip install art
(ang. American Standard Code for Information Interchange) system kodowania znaków, pierwotnie oparty na 7 bitach (współcześnie rozszerzony)
(ang. Free/Libre and Open Source Software – wolne oprogramowanie i otwarty kod źródłowy) programy, które są dostępne dla każdego zgodnie z zasadami przedstawionymi na stronie projektu GNU
(ang. immutable) sekwencja, której pojedynczych elementów nie da się zmodyfikować; w celu dokonania zmiany konieczne jest zastąpienie całego obiektu nowym (niezbędna jest wymiana całego ciągu, aby zastąpić w nim pojedynczy znak)
specyficzna dla języka Python konstrukcja programistyczna, pozwalająca na tworzenie krótkiego kodu
(ang. slice) zawarte w nawiasach kwadratowych wyrażenie, które pozwala określić wybraną część sekwencji; może mieć ono postać [a:b] lub [a] lub podobną; nazywane także wycinkiem
manifest ZEN of Python by Tim Peters - dokument składający się z 19 punktów, które zostały napisane i opublikowane na liście dyskusyjnej języka Python w roku; treść manifestu można przeczytać, wydając polecenie import this w środowisku IDLE