Blog JSystems - uwalniamy wiedzę!

Szukaj
Łańcuch znaków - indeksy i wycinki
Łańcuch to ciąg znaków - sięgasz po indeksie i robisz wycinki, jak w liście

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="Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch"
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])

Usuwanie przedrostka i przyrostka - removeprefix i removesuffix (Python 3.9 i nowsze)

Częstym zadaniem jest odcięcie z tekstu stałego początku lub końca - na przykład przedrostka "https://" albo rozszerzenia pliku. Do Pythona 3.9 robiło się to zwykle metodą "replace" albo cięciem po znakach, co bywało zawodne. Od 3.9 mamy dwie precyzyjne metody: "removeprefix" i "removesuffix":

adres = 'https://jsystems.pl'
print(adres.removeprefix('https://'))

plik = 'raport.csv'
print(plik.removesuffix('.csv'))
jsystems.pl
raport

W odróżnieniu od "replace" te metody usuwają tekst tylko wtedy, gdy faktycznie znajduje się on na początku (removeprefix) lub na końcu (removesuffix). Jeśli podanego przedrostka nie ma, tekst wraca bez zmian - nie ma ryzyka, że wytniemy coś przypadkiem ze środka.

Samodokumentujące się f-stringi - zapis ze znakiem = (Python 3.8 i nowsze)

Przy szukaniu błędów w kodzie często wypisujemy nazwę zmiennej i jej wartość. Od Pythona 3.8 można to skrócić - wystarczy w f-stringu dopisać znak "=" tuż za nazwą zmiennej, a Python sam wypisze i nazwę, i wartość:

x = 42
nazwa = 'żaba'
print(f'{x=}')
print(f'{nazwa=}')
x=42
nazwa='żaba'

To drobiazg, ale przy diagnostyce kodu oszczędza dużo pisania i pilnuje, żeby etykieta zawsze zgadzała się z nazwą zmiennej.

Szkolenie Python od podstaw, przez analizę danych, do machine learning w JSystems

Ten kurs daje Ci solidne podstawy Pythona. Jeśli chcesz pójść dalej i pod okiem trenera dojść od pierwszej linijki kodu do własnego modelu uczenia maszynowego, sprawdź nasze pięciodniowe szkolenie Python od podstaw, przez analizę danych, do machine learning. Pierwsze trzy dni to Python w praktyce: typy i kolekcje, instrukcje warunkowe i pętle, funkcje, moduły i pakiety, pliki tekstowe, usługi sieciowe oraz praca z bazą PostgreSQL. Czwarty dzień to analiza danych w pandas (wczytywanie CSV, TSV i XLS, filtrowanie, agregacje, statystyki) i wizualizacja w Matplotlib, Seaborn oraz Plotly. Piąty dzień to uczenie maszynowe w scikit-learn: regresja liniowa i logistyczna, drzewa decyzyjne, las losowy, XGBoost, walidacja predykcji, dobór hiperparametrów i przeciwdziałanie przeuczeniu. Szkolenie ma terminy gwarantowane, czyli odbywa się niezależnie od wielkości grupy.

Szkolenie Python od podstaw, przez analizę danych, do machine learning

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

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
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:

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...