Rzucimy teraz okiem na łańcuchy znaków w Pythonie przedstawiając Wam ich strukturę, z czego się składają, jak je tworzyć i jak nimi manipulować. Wyjaśnimy sobie czym jest konkatenacja łańcuchów, a także w jaki sposób możemy je przycinać w sposób nad wyraz abstrakcyjny (czyt. występujący tylko w języku Python). Więcej informacji w środku artykułu.
Tweet |
Z CZEGO SKŁADAJĄ SIĘ ŁAŃCUCHY ZNAKÓW W PYTHONIE?
Teoria na sam początek. Łańcuch znaków to tablica składająca się co najmniej z jednego elementu umożliwiająca przechowywanie znaków i wyświetlanie ich na strumieniu wyjściowym jako "całość". Warto sobie uzmysłowić, że znakiem nie musi być wyłącznie litera! Przyjrzyjmy się poszczególnym aspektom celem dokładniejszego zrozumienia możliwości łańcuchów. Bywa też, że łańcuch określamy też jako ciąg znaków.
RODZAJE ZNAKÓW
Znak w pamięci komputera jest w rzeczywistości kodem w postaci liczby całkowitej (najczęściej w systemie szesnastkowym). Znakiem może być mała litera, duża litera, cyfra albo symbol. Występują również znaki niewidoczne (niedrukowalne), które nie posiadają żadnej graficznej reprezentacji, a mogą stanowić zupełnie inne znaczenie np. być sygnałem dla drukarki, żeby przewinąć stronę. Znaki sterujące (czy też sekwencje sterujące) umożliwiają przejęcie kontroli nad tekstem i manipulowanie jego wyświetlaniem. Takie kombinacje jak "\n" (znak nowej linii), "\t" (tabulator poziomy) czy też "\"" (znak cudzysłowu) są sekwencjami sterującymi. W trakcie przetwarzania łańcucha znaków, każda sekwencja jest zamieniana na odpowiedni "efekt".
Efekt "konwersji" sekwencji sterującej znaku nowej linii. Zamiana znaku "\n" na odstęp, tak jakbyśmy nacisnęli Enter.
APOSTROFY CZY CUDZYSŁOWY?
Warto to podkreślić, bo to arcyważna sprawa! Łańcuchy znaków w Pythonie mogą być objęte w cudzysłowy lub apostrofy (jak kto woli), w przeciwieństwie do szerszej gamy innych języków wysokiego poziomu, w których już odróżnia się jedno od drugiego. Pojedynczy znak zwykle jest obejmowany apostrofami, a łańcuchy, cudzysłowami. W Pythonie nie ma takiego rozróżnienia. Można tak albo tak. Jeżeli jednak chcielibyście otoczyć jakiś fragment tekstu cudzysłowami, to macie dwa sposoby. Albo otaczacie cały tekst apostrofami, a w środku wstawiacie cudzysłów:
Jeżeli obraliśmy łańcuch w apostrofy, to nie ma żadnych problemów, żeby skorzystać z cudzysłowów w środku niego.
albo korzystacie z sekwencji sterującej (\") gdy otoczyliście już cały tekst cudzysłowami. W takiej sytuacji trzeba skorzystać już z sekwencji, gdyż sam znak zostanie wówczas potraktowany jako koniec łańcucha, co powinno to być wyraźnie oznaczone (biały kolor pozostałej części tekstu "stojącej" już za cudzysłowem), choćby w domyślnym IDE dla Pythona noszącego nazwę "IDLE".
Łańcuch otoczony cudzysłowami zostaje przerwany, gdy użyje się samego znaku cudzysłowu pomiędzy początkiem, a końcem. Tylko sekwencja sterująca pozwala temu zapobiec, jeżeli jest już otoczony cudzysłowami.
METODY MANIPULACJI ŁAŃCUCHAMI
Łańcuchy znaków w Pythonie zostały "obdarzone" większą wygodą w kwestii manipulowania danymi. Oto niektóre operacje na łańcuchach będące "wizytówką" ich możliwości w tym języku.
"MNOŻENIE" ŁAŃCUCHA
W Pythonie występuje przeciążony operator mnożenia, który może być podstawiony do łańcucha. Efektem końcowym będzie zwrócenie "sklonowanego" podanego ciągu znaków. O wszelkie spacje czy odstępy już dbamy samodzielnie.
Przykład "przemnożonego" łańcucha znaków w Pythonie.
KONKATENACJA
Konkatenacja jest połączeniem kilku osobnych łańcuchów znaków w jeden łańcuch znaków. Wykonuje się go bardzo prosto przy użyciu operatora dodawania. Warto dodać, że jeśli dowolny łańcuch posiada spację w dowolnym miejscu, to jest również brany pod uwagę. Znak to znak.
Przykład skonkatenowanych łańcuchów znaków w Pythonie.
"PRZYCINANIE" / "WYCINANIE" ŁAŃCUCHA
Łańcuchy znaków w Pythonie mogą zostać jeszcze "przycięte" czy też "wycięte" bez używania jakichkolwiek funkcji i jest to kolejna operacja niewystępująca w żadnym innym języku wysokiego poziomu (a przynajmniej "w zdecydowanej większości"). Zabieg przycinania polega na wykorzystaniu notacji tablicowej i wyselekcjonowaniu od którego indeksu do którego, łańcuch ma zostać zachowany. W Pythonie nawet same indeksy są nieco "rozbudowane" o możliwości i przy pomocy odpowiedniej kombinacji znaków, jesteśmy w stanie otrzymać "wycięty" fragment łańcucha.
Różne dostępne kombinacje "przycinania" łańcucha znaków w Pythonie przy pomocy notacji indeksowej.
Opiszę pokrótce każdą sytuację:
- Pierwsza kombinacja "wycina" pierwsze trzy znaki. Pierwszy indeks nie został podany (przed znakiem dwukropka w nawiasach kwadratowych), więc język traktuje to jako wstawienie zera (pierwszy znak). Po dwukropku jest trójka, zatem brany jest pod uwagę znak pierwszy, drugi i trzeci. W efekcie końcowym "wyciągane" są znaki w indeksach 0-2 (podana liczba zredukowana o jeden) i zwracany jest łańcuch "Dod".
- Drugi zapis to "wyjęcie" znaków od piątego indeksu (a szóstego znaku) do samego końca (brak liczby po dwukropku oznacza przydzielenie wartości domyślnej równej długości łańcucha). Ponieważ długość łańcucha to osiem znaków, a "rozkazało się" rozpoczęcie uwzględniania od szóstego znaku, zostają tylko trzy więc mamy łańcuch "nie".
- Trzecia sytuacja pokazuje "wyrozumiałość" Pythona, jeśli podane indeksy wyjdą poza długość łańcucha. W innych językach doszłoby do zgłoszenia wyjątku, a tutaj po prostu nie wyświetli się nic.
- Czwarty zapis to ustawienie przedziału wycinania z obu stron pokazujące, że koniec NIE oznacza sumy początku i końca, tylko sztywny indeks do którego to ma "biec". Tutaj mamy ustalenie uwzględniania znaków od pierwszego indeksu (a drugiego znaku) do trzeciego z wyłączeniem tego trzeciego, czyli do drugiego. Na wyjściu otrzymamy "od", łańcuch składający się z drugiej i trzeciej litery.
- Piąta kombinacja ukazuje kompletnie nietypowy zapis, który w innych językach skończyłby się błędem kompilacji (kto to widział ujemny indeks :D?!). Tak, w Pythonie jest możliwość poruszania się po indeksach w odwrotną stronę wstawiając indeksy ujemne. Początek został zignorowany, zatem będzie iść od samego początku, a koniec ustawiony na -3 spowoduje "cofnięcie się" o trzy znaki do tyłu zaczynając od zera i "stanie" na znaku "n", zatem to da taki sam wynik jakbyśmy za koniec podstawili piątkę. Wychodzi na wyjściu "Dodat", czyli indeksy 0-4.
- Szósty łańcuch to jest znowu "nie", fragment pobrany poprzez cofnięcie się początkowego indeksu (0) o trzy znaki i "dojście" do samego końca, który domyślnie ustawiono na długość łańcucha. Efekt identyczny jak w zapisie #2.
POSZERZONE PORÓWNYWANIE ŁAŃCUCHÓW
Kolejna rzecz jaką można zrobić z łańcuchami to postawić oba pomiędzy operatorem relacyjnym (większy od, mniejszy od itd.) i przekonać się jaka wartość boolowska zostanie zwrócona. Łańcuchy znaków w Pythonie zostały "obdarzone" taką techniką porównawczą. Operator porównania jest wszystkim dobrze znany, ale co powiecie na możliwość zdecydowania o "większości" lub "mniejszości" łańcucha :)?
Język Python umożliwia nie tylko klasyczne porównywanie łańcuchów, ale także zdecydowanie który z nich jest "większy".
Zadajecie sobie pytanie jakim cudem Python ustala który łańcuch może być "wyższy" od drugiego? W grę wchodzi porządek leksykograficzny. Każdy znak posiada swój numeryczny kod w systemie kodowania znaków o nazwie ASCII. Dla przykładu, mała litera 'a' kryje się pod numerem 97 w systemie dziesiętnym. Z kolei duża litera 'B' zajmuje numer 66. Stąd pierwsze porównanie umieszczone na powyższym zdjęciu zwróci fałsz, gdyż 97 NIE JEST mniejsze od 66.
A co z drugim wyrażeniem? Duża litera 'C' to numer 67. Mała litera 'p' kryje się pod numerkiem 112. W tym przypadku to, że drugi łańcuch znaków jest dłuższy niż pierwszy, nie robi żadnego znaczenia. Tutaj w grę wchodzą pierwsze litery, zatem nierówność jest prawdziwa, ponieważ 67 jest mniejsze od 112. Możecie posłużyć się funkcją "ord" (od słowa "ordinal" - ang. "porządkowy"), która po podaniu w parametrze dowolnego znaku, zwróci jej numeryczny odpowiednik.
Rozumiem, że na początku będzie bardzo ciężko się przyzwyczaić do wyżej wymienionych wygód (szczególnie dla programistów języka C, pozdrawiam ;)!), aczkolwiek jeśli chcecie nazywać się programistami Pythona, to to jest norma w programowaniu na co dzień.
Dziękuję za pełne przeczytanie od początku do końca. Warto wiedzieć jak można "bawić się" łańcuchami znaków w Pythonie, gdyż twórcy naprawdę uatrakcyjnili tę manipulacje, które w języku C skończyłyby się wylaniem mnóstwa potu.