Blog JSystems - z miłości do programowania

Łańcuchy znaków



 


Zmienne typu "string" będąc tak naprawdę obiektami klasy string posiadają wbudowane funkcje, pozwalające nam na wykonywanie na tych zmiennych różnorakich operacji.


 


Funkcje wbudowane


W poniższym zestawieniu prezentuję tylko wybrane funkcje wbudowane, te które uznałem za użyteczne. Pełniejsze zestawienie można znaleźć na przykład tu: https://www.w3schools.com/python/python_ref_string.asp


 


Upper


Funkcja upper powiększa ciąg znaków:


napis="ministerstwo do spraw niezbyt istotnych spraw"
print(napis.upper())


powyższy kod wydrukuje na konsoli tekst:


MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW


Zwróć uwagę, że funkcja upper zwraca powiększony ciąg znaków, a nie zmienia zawartości zmiennej napis!


 


Lower


Funcja lower pomniejsza ciąg znaków:


napis="MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW"
print(napis.lower())


Wynikiem działania tej funkcji będzie poniższy ciąg tekstowy na konsoli:


ministerstwo do spraw niezbyt istotnych spraw


Zwróć uwagę, że funkcja lower zwraca pomniejszony ciąg znaków, a nie zmienia zawartości zmiennej napis!


 


Title


Funkcja title powiększa pierwsze litery wszystkich wyrazów w ciągu, a pomniejsza pozostałe litery.


napis="MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW"
print(napis.title())


Powyższy kod wydrukuje na konsoli komunikat o takiej treści:


Ministerstwo Do Spraw Niezbyt Istotnych Spraw


 


Replace


Ta funkcja pozwala zamieniać wybrane znaki lub ciągi na inne:


napis="MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW"
print(napis.replace("I","X"))


W ten sposób wydrukujemy na konsoli to:


MXNXSTERSTWO DO SPRAW NXEZBYT XSTOTNYCH SPRAW


 


len w kontekście ciągów tekstowych


Funkcja len nie jest związana bezpośrednio z klasą string, nie jest funkcją wbudowaną. Jest jednak często wykorzystywana w odniesieniu do łańcuchów tekstu, dlatego tu się pojawia. Jeśli do funkcji len podamy ciąg tekstowy, zwróci nam ona ilość znaków zawartych w tym ciągu.


x=len("MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW")
print(x)


wyświetli nam na konsoli 45.


 


Count


Count zlicza ilość wystąpień danego ciągu lub znaku w łańcuchu tekstowym:


napis="MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW"
print(napis.count('IS'))


Powyższy kod drukuje na konsoli liczbę 2, ponieważ tyle razy występuje w ciągu "IS". Uwaga - ta funkcja zwraca uwagę na wielkość liter!


 


Strip


Funkcja strip służy do usuwania białych (domyślnie bez parametru) lub wskazanych znaków lub ciągów.


napis="           MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW  "
print(napis.strip())


Przykładowy kod wyświetli na konsoli napis pozbawiony na początku i na końcu spacji. Funkcja strip może też przyjąć argument:


napis="MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW"
print(napis.strip("MINI"))


W takim wypadku na konsoli zostanie wypisane:


STERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW


Ponieważ z początku (i ewentualnie z końca jeśli taki ciąg tam też występuje) napisu został usunięty ciąg podany jako parametr funkcji strip. Uwaga - ta funkcja zwraca uwagę na wielkość liter!


 


split i join - zamiana tekstu na listę i listy na tekst


Funkcja split służy do dzielenia łańcuchów tekstowych na części i zwraca pod postacią listy wyrazów. Jeśli do funkcji split nie podamy argumentu, funkcja przyjmie że poszczególne wyrazy rozdzielane są spacją. Taki kod:


napis="MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW"
print(napis.split())


zwraca


['MINISTERSTWO', 'DO', 'SPRAW', 'NIEZBYT', 'ISTOTNYCH', 'SPRAW']


Być może widzisz taki format danych po raz pierwszy - to jest lista, rodzaj zbioru zmiennych w Pythonie. Ten typ będziemy jeszcze bardzo szczegółowo omawiać.


Funkcja split może także przyjąć argument, który będzie wskazywał czym poszczególne wyrazy są rozdzielane.


napis="MINISTERSTWO;DO;SPRAW;NIEZBYT;ISTOTNYCH;SPRAW"
print(napis.split(";"))


Powyższy przykład również wyświetli na konsoli ten sam zestaw co wcześniej, przy czym teraz wyrazy były rozdzielane średnikami.


['MINISTERSTWO', 'DO', 'SPRAW', 'NIEZBYT', 'ISTOTNYCH', 'SPRAW']


 


Łańcuchy funkcji


Ponieważ każda z funkcji łańcuchów tekstowych zwraca zmodyfikowany obiekt tej samej klasy (string), można wywoływać funkcje kaskadowo:


napis="MINISTERSTWO DO SPRAW NIEZBYT ISTOTNYCH SPRAW"
print(napis.strip("MINI").title().replace('i','X'))


Każda z tych funkcji będzie wywoływana na ciągu zwróconym przez poprzednią. Z napisu najpierw zostanie usunięte początkowe "MINI", następnie w zwróconym ciągu zostają powiększone pierwsze litery każdego wyrazu, by na końcu podmienić wszystkie małe i na duże X. Powyższy kod wyświetli na konsoli ciąg:


Sterstwo Do Spraw NXezbyt Istotnych Spraw


 


Iterowanie po łańcuchach tekstowych


Po literach w łańcuchach tekstowych można iterować. Jest nawet specjalny rodzaj pętli który przechodzi po literach:


nazwa="Llanfairpwllgwyngyllgogerychwyrndrobwlll­lantysiliogogogoch"
for n in nazwa:
    print(n)


W wyniku działania tego kodu na konsoli zostaje wyświetlona każda z liter z ciągu w kolejnych liniach. "n" jest niejawnie deklarowaną w ramach pętli (i widoczną tylko w jej ramach) zmienną reprezentującą przy każdym obrocie pętli kolejną literę z ciągu. Ciekawostka - ten ciąg który przypisałem do zmiennej "nazwa", nie jest jak może się wydawać przypadkowym ciągiem znaków. To najdłuższa na świecie nazwa miejscowości. Mieści się ona w Walii.


 


Mnożenie tekstu. Ale jak?


kriszna= "rama "*5+" "+5*"hare "
print(kriszna)


Wygląda to tak, jakbyśmy mnożyli tekst razy liczbę, a to przecież nie możliwe. Chodzi jednak o co innego. Wydruk zmiennej kriszna wyrzuca na konsolę:


rama rama rama rama rama  hare hare hare hare hare


....i teraz wszystko powinno być jasne. Mnożenie oznacza po prostu powtórzenie danej frazy n razy.


 


Wygodne sprawdzanie czy tekst zawiera frazę


Czasem musimy sprawdzić czy gdzieś w tekście znajduje się jakiś znak lub fraza. Jest do tego bardzo wygodna konstrukcja:


if ("X" in "SpaceX"):
    print("ten ciąg zawiera X!")


W miejsce X możesz podstawić też dowolną frazę. Ten sam efekt można osiągnąć na przykład wbudowaną funkcją count.


 


Czy Python>Java?


Tytuł tego podrozdziału to trochę trolling, ale w Pythonie faktycznie można to sprawdzić (z przewidywalnym skutkiem ;) ). Sprawdźmy zatem:


if("Python">"Java"):
    print("to chyba jasne :) Tu jest miejsce na hejt: ...............")
else:
    print("coś się spsuło...")


Z jakiegoś powodu ten kod wyświetlił na konsoli komunikat:


to chyba jasne :) Tu jest miejsce na hejt: ...............


I to wcale nie jest jakiś żart twórców Pythona. To jest po prostu sprawdzenie czy fraza "Python" znalazłaby się po frazie "Java" gdyby ułożyć je alfabetycznie.


 


Cięcia, cięcia - o cięciu łańcuchów tekstowych słów kilka


Z łańcuchów stosunkowo łatwo jest wycinać fragmenty na podstawie pozycji znaków. Zaczniemy od wycięcia pojedynczego znaku:


lancuch="123456789"
print(lancuch[2]


Zadeklarowałem łańcuch "łańcuch". Dla wygody umieściłem w nim kolejne cyfry, by można było szybko weryfikować działanie wycinania.  Wszystkie kolejne przykłady w tym podrozdziale będę opierał na tej samej zmiennej. Korzystając z nawiasów kwadratowych, podając między nimi liczbę mogę pobrać pojedynczy znak z wskazanej pozycji. Pisząc [2] nie wyciągam jednak znaku z drugiej, a z trzeciej pozycji. Pamiętać należy o tym że w Pythonie liczymy od zera.


W ten sam sposób możemy podawać pozycję od końca.


print(lancuch[-2])


Taki zapis  będzie oznaczał pobranie drugiego znaku od końca. W naszym przypadku będzie to 8.


print(lancuch[2:5])


Powyższy przykład wycina znaki "345". To jest wycinanie na zasadzie - od pozycji do pozycji. Tutaj obowiązuje ta sama zasada niedomkniętego z prawej strony zbioru jak w przypadku funkcji range.


W taki sposób:


print(lancuch[:5])


wytniemy początek łańcucha - do piątej (czyli szóstej) pozycji bez niej samej, czyli w tym przypadku będzie to "12345"  Możemy też podawać pozycję od końca. Poniższy kod wytnie ciąg "123456", czyli bez ostatnich trzech pozycji.


print(lancuch[:-3])


Możliwe jest też też przeskakiwanie co któryś znak. W poniższym przykładzie z ciągu wyciętego od pierwszej do siódmej pozycji wycinam co drugi znak. Uruchomienie tego kodu spowoduje wyświetlenie ciągu "135":


print(lancuch[0:6:2])


Gdybyśmy chcieli wyciąć z całego tekstu co drugi znak, moglibyśmy to zrobić w sposób mało czytelny:


print(lancuch[0:len(lancuch):2])


Albo nieco bardziej przaśny:


print(lancuch[::2])


 

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!