← Lekcje
Python · lekcja 11

Napisy: znak po znaku

  1. Napis po znaku: indeks, len, wycinek
  2. Sklejanie +, powielanie *, napis niezmienny
  3. Metody upper, lower, count i operator in
  4. f-string: wstawianie wartości do tekstu
Rozgrzewka · 3 minuty

Co pamiętacie z lekcji o listach?

  1. Pod jakim indeksem siedzi pierwszy element listy?
  2. Co oddaje len(numbers)?
  3. Lista to [3, 7, 2]. Ile wynosi sum, ile max, a ile średnia?
Część 1 · Indeks i długość

Napis to ciąg znaków z numerami

Napis (typ str) to ciąg znaków ustawionych w kolejce. Każdy znak ma swój numer, czyli indeks. Liczymy od zera, jak w liście. Indeks ujemny liczy od końca.

indeks od końca 012345 Python -6-5-4-3-2-1
word = "Python"
word[0]    # "P"
word[5]    # "n"
word[-1]   # "n"
word[-2]   # "o"
len(word)  # 6
docs.python.org, The Python Tutorial, rozdz. 3.1.2 (Text)
Część 1 · Wycinek

Wycinek: od tego do tego

Wycinek to kawałek napisu: word[a:b] bierze znaki od indeksu a (wchodzi) do indeksu b (już nie wchodzi). Jak bieg od słupka 2 do słupka 5: mijasz słupki 2, 3 i 4, a przy piątym kończysz.

012345 Python word[2:5] to "tho" indeks 5 już nie wchodzi
word[0:2]   # "Py"
word[:2]    # "Py", od początku
word[4:]    # "on", do końca
word[-2:]   # "on", dwa ostatnie
word[42:]   # "", pusty napis
word[42]    # IndexError, błąd
docs.python.org, The Python Tutorial, rozdz. 3.1.2 (Text)
Część 2 · Sklejanie i niezmienność

Plus skleja, gwiazdka powiela

name = "Ala"
name + " Nowak"   # "Ala Nowak"
3 * "ab"          # "ababab"
"-" * 20          # linia z 20 kresek

word = "Python"
word[0] = "J"     # TypeError
"J" + word[1:]    # "Jython"

Operator + na napisach skleja je w jeden, a * z liczbą powiela napis.

Napis jest niezmienny: pojedynczego znaku nie da się podmienić, jak na wydrukowanej kartce. Python zgłasza wtedy TypeError. Nowy napis budujemy ze sklejonych kawałków.

docs.python.org, The Python Tutorial, rozdz. 3.1.2 (Text) · Podręcznik Informatyka na czasie 2 (Nowa Era), s. 223 (dodatek 6, operator złączania napisów)
Część 2 · Metody napisu

Cztery polecenia po kropce

Metoda to polecenie wydane konkretnemu napisowi: piszemy je po kropce, np. text.upper(). Metoda nie zmienia napisu, tylko oddaje nowy.

ZapisWynikCo robi
text.upper()"ALA MA KOTA"same wielkie litery
text.lower()"ala ma kota"same małe litery
text.count("a")3ile razy występuje małe „a” (duże „A” się nie liczy)
text.replace("kota", "psa")"Ala ma psa"oddaje kopię z podmienionym fragmentem
"kot" in textTrueczy taki fragment jest w napisie
"pies" in textFalsenie ma go, więc fałsz

Wszystko dla text = "Ala ma kota". Po replace zmienna text dalej trzyma „Ala ma kota”.

docs.python.org, Biblioteka standardowa, Text Sequence Type str (String Methods: upper, lower, count, replace) oraz Common Sequence Operations (x in s)
Część 3 · f-string

f-string: wartość wprost w zdaniu

f-string to napis z literą f przed cudzysłowem. W klamrach {} wpisujemy nazwę zmiennej albo działanie, a Python wstawia tam wynik.

name = "Ola"
age = 16
print(f"{name} ma {age} lat.")
# Ola ma 16 lat.

price = 4.5
print(f"Cena: {price:.2f} zł")
# Cena: 4.50 zł

Zapis :.2f po dwukropku to format: pokaż liczbę z dwoma miejscami po przecinku. Dlatego 4.5 wypisuje się jako 4.50, tak jak cena w sklepie.

Bez litery f Python wypisze dosłownie {name} ma {age} lat., razem z klamrami.

docs.python.org, The Python Tutorial, rozdz. 7.1.1 (Formatted String Literals)
Część 3 · Porównywanie napisów

„Ala” to nie to samo co „ala”

Znak == sprawdza, czy napisy są dokładnie takie same, znak po znaku. Wielkość liter ma znaczenie. Znaki < i > układają napisy jak w słowniku: porównują pierwszy znak, a przy remisie drugi i kolejne.

PorównanieWynikDlaczego
"Ala" == "Ala"Truekażdy znak taki sam
"Ala" == "ala"Falsepierwsza litera raz duża, raz mała
"Ala".lower() == "ala".lower()Trueobie strony sprowadzone do małych liter
"Ala" < "Ola"True„A” stoi w słowniku przed „O”

W praktyce: Python porządkuje znaki według numerów z tablicy Unicode, a wielkie litery mają tam mniejsze numery niż małe. Dlatego porównanie "Z" < "a" daje True, choć w alfabecie „z” jest po „a”.

docs.python.org, The Python Tutorial, rozdz. 5.8 (Comparing Sequences and Other Types)
Ćwiczenie · przy komputerze · 12 minut

Ćwiczenie: trzy małe programy

  1. Napisz program, który pyta o imię, a potem wypisuje jego pierwszą literę, liczbę liter i całe imię wielkimi literami. Sprawdź go dla imienia Ola.
  2. Zapisz word = "informatyka". Wypisz wycinek, który da słowo forma, potem trzy ostatnie litery, a na końcu pierwszą i ostatnią literę w jednej linii.
  3. Napisz program, który pyta o adres e-mail i sprawdza operatorem in, czy jest w nim znak @. Wypisz „Wygląda na adres e-mail.” albo „Brakuje znaku @.”.
Wskazówka do wszystkich trzech

Uruchamiaj program po każdej dopisanej linijce, a nie dopiero na końcu. Gdy zobaczysz IndexError, sprawdź, czy nie sięgasz po znak spoza napisu: ostatni znak ma indeks len(text) - 1, a najprościej wziąć go jako text[-1].

Sprawdzenie

Trzy pytania na koniec

  1. Jak sięgnąć po pierwszy, a jak po ostatni znak napisu?
  2. Napis to "Python". Co da word[2:5] i dlaczego nie ma tam znaku o indeksie 5?
  3. Czy da się podmienić pojedynczy znak zapisem word[0] = "J"?
Podsumowanie

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
"@" in emailFormularz rejestracji odrzuca adres bez małpy, zanim wyśle cokolwiek na serwercodziennie
.lower() przed porównaniemLogowanie działa tak samo dla Ola@firma.pl i ola@firma.plstandard w firmach
Wycinek text[:100]Zapowiedź artykułu na liście: pierwsze sto znaków i trzy kropkicodziennie
"*" * len(password)Hasło i numer karty pokazane jako gwiazdki, żeby nie trafiły na zrzut ekranuwymóg bezpieczeństwa