Už umíš spojovat dohromady kratší řetězce:
spojeny_retezec = 'a' + 'b'
dlouhy_retezec = 'ó' * 100
Teď se podíváme na opačný proces: jak z dlouhého řetězce dostat kratší součásti. Začneme jednotlivými znaky.
Konkrétní znak na dané pozici se z řetězce dá vybrat operací vybrání prvku (angl. subscripting), která se píše podobně jako volání funkce, jen s hranatými závorkami. Třeba takhle se dá vybrat znak na páté pozici:
pate_pismeno = 'čokoláda'[5]
print(pate_pismeno)
Funguje to? Dostal/a jsi opravdu páté písmeno?
Jak sis možná už všiml/a, programátoři počítají od nuly. „První“ prvek má vždy číslo nula, druhý číslo jedna a tak dál.
Stejně je to i se znaky v řetězcích. První písmeno má číslo nula, druhé jedna, ... a osmé písmeno má číslo sedm.
Proč je tomu tak? K úplnému pochopení důvodů by ses potřeboval/a naučit něco o ukazatelích a polích, což nebude hned, takže pro teď nám bude stačit vědět, že programátoři jsou prostě divní.
Nebo aspoň že mají rádi divná čísla – jako nulu.
[0] [1] [2] [3] [4] [5] [6] [7]
╭───┬───┬───┬───┬───┬───┬───┬───╮
│ Č │ o │ k │ o │ l │ á │ d │ a │
╰───┴───┴───┴───┴───┴───┴───┴───╯
A když už jsme u divných čísel, co se asi stane, když budu vybírat písmena pomocí záporných čísel?
Kromě jednotlivých znaků můžeme vybírat i delší části – odborně podřetězce (angl. substrings).
Zkus, co dělá tenhle program:
retezec = 'čokoláda'
kousek = retezec[5:]
print(kousek)
Dá se použít i retezec[:5]
,
který vybere všechno až po znak číslo 5.
Ne však znak 5 samotný, což je možná trochu zarážející,
ale je potřeba s tím počítat.
Poslední prvek není ve výběru obsažen, podobně jako range(5)
neobsahuje
číslo 5.
Ačkoli je tohle chování divné, má hezké důsledky.
Všimni si třeba, že retezec[:5] + retezec[5:]
ti dá zpět původní retezec
.
Podobnému vybírání podřetězců se říká „sekání“ řetězců (angl. string slicing).
Sekání „od“ a „do“ se dá kombinovat. Zkus si to: co asi udělají následující příkazy?
retezec = 'čokoláda'
print(retezec[:4])
print(retezec[2:6])
print(retezec[-3:])
print(retezec[:])
Určování vhodných čísel, indexů, občas vyžaduje trochu zamyšlení.
U sekání (s :
) pomáhá očíslovat si „hranice“ mezi znaky,
abys v tom měl/a lepší přehled:
╭───┬───┬───┬───┬───┬───┬───┬───╮
│ Č │ o │ k │ o │ l │ á │ d │ a │
├───┼───┼───┼───┼───┼───┼───┼───┤
│ │ │ │ │ │ │ │ │
0 1 2 3 4 5 6 7 8
-8 -7 -6 -5 -4 -3 -2 -1
╰───────────────╯
'čokoláda'[:4] == 'čoko'
╰───────────────╯
'čokoláda'[2:6] == 'kolá'
╰───────────╯
'čokoláda'[-3:] == 'áda'
Zkus napsat program zamen.py
, který umí zaměnit jedno písmeno ve slově za
jiné. Například:
slovo = input('Slovo: ')
pozice = int(input('Které písmeno zaměnit (od nuly)? '))
novy_znak = input('Nové písmeno: ')
... # sem doplň kód
print(nove_slovo)
Příklad použití:
Slovo: čokoláda Které písmeno zaměnit (od nuly)? 3 Nové písmeno: u čokuláda
Slovo: kočka Které písmeno zaměnit (od nuly)? 1 Nové písmeno: a kačka
Pozor na to, že řetězce v Pythonu nelze měnit. Nemůžeš v existujícím řetězci zaměnit jeden znak za jiný; musíš vytvořit nový řetězec poskládaný z částí toho starého.