Znakové řetězce (string) v Pythonu jsou posloupnost jednotlivých znaků. K jednotlivým prvkům posloupnosti, v tomto případě ke znakům znakového řetězce, je možné přistoupit pomocí jejich indexu. Index určuje pořadí konkrétního znaku ve znakovém řetězci. Čísluje se od 0.
0 1 2 3 4 5
a n a n a s
s = "ananas"
Např. znak "a"
má index 0. K jednotlivým znakům je možné přistoupit pomocí jejich indexu zapsaného v hranatých závorkách.
s[0]
'a'
S jednotlivými znaky potom můžeme pracovat - vypisovat je, porovnávat...
Pokud bychom tedy chtěli vypsat postupně všechny znaky řetězce s
museli bychom napsat:
print(s[0])
print(s[1])
print(s[2])
print(s[3])
print(s[4])
print(s[5])
a n a n a s
Pokud se dostaneme mimo rozsah řetězce, dojde k chybě IndexError: string index out of range
.
s[6]
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_14552/2893730839.py in <module> ----> 1 s[6] IndexError: string index out of range
Pokud použijeme záporný index, berou se znaky z konce řetězce. Např. na indexu -1 je tedy znak "s"
.
s[-1]
's'
Vypisovat ručně znaky je ale nešikovné, práci za nás může udělat Python. Výpis dáme do cyklu, kde se nám bude automaticky zvětšovat index. Použijeme k tomu proměnnou, kterou jsme si pojmenovali i
.
i = 0
while i < 6:
print(s[i])
i = i + 1
a n a n a s
Můžeme chtít vypsat znaky z řetězců, které mají různou délku. Je tedy výhodnější použít místo konkrétní délky funkci len
, která nám zjistí délku znakového řetězce.
delka = len(s)
V následujícím příkladě navíc ke každému znaku vypíšeme jeho index.
i = 0
while i < delka:
print(i, s[i])
i = i + 1
0 a 1 n 2 a 3 n 4 a 5 s
Všiměte si, že délka je 6 a indexy jsou pouze do 5.
Vypište indexy, na kterých je ve znakovém řetězci "ananas"
znak "a"
?
Znaky ve znakovém řetězci nemusí být jen písmena, mohou to být jakékoliv znaky, např.
znaky = "@#$%^&*()"
nebo číslice
cislice = "1024"
in
¶V Pythonu je kromě běžných operátorů, jako <
, >
, ==
, !=
, <=
, >=
také operátor in
(a not in
).
Operátor in
zjistí, zda je nějaký konkrétní prvek v sekvenci prvků a vrátí True
nebo False
.
"a" in "ananas"
True
"x" in "ananas"
False
"a" not in "ananas"
False
Funguje to také pro pod-řetězce:
"nana" in "ananas"
True
Jak to funguje:
Python za nás projde celý řetězec a porovnává jednotlivé jeho části. (A dá mu to stejnou práci, jako kdybychom to procházeli my "ručně".)
Chceme zjistit, zda je v řetězci s
znak "a"
:
if "a" in s:
print("Je tam a!")
else:
print("Není tam a.")
for
cyklus - první seznámení¶for
cyklus v Pythonu prochází prvky nějaké posloupnosti.
Pokud nám nezáleží na konkrétních indexech prvků posloupnosti a potřebujeme pouze projít její prvky, můžeme použít místo while
cyklu for
cyklus.
for znak in s:
print(znak)
a n a n a s
Jak to funguje:
for znak in s:
"pro každý znak v "ananas" proveď následující kód"
Python do proměnné znak
dosadí nejprve první znak řetězce s
, potom druhý a tak dále, dokud nedojde až na konec řetězce.
S proměnnou znak
se dá uvnitř cyklu pracovat jako s jakoukoliv jinou proměnnou, tedy např. ji můžeme vypsat.
Jméno proměnné si můžete zvolit, jaké chcete. Já jsem zvolila jméno znak
proto, aby byl kód pokud možno co nejlépe čitelný.
Kolikrát je ve znakovém řetězci "ananas"
použit znak "a"
?
Nápověda:
Počítejte si znaky "a"
, jejich počet si pamatujte v proměnné soucet
.
Projděte všechny znaky, pokud se znak rovná znaku "a"
, zvětšte proměnnou soucet
o 1.
Nakonec vypište obsah proměnné soucet
.