Řetězce. Vstup/výstup. Stanislav Geidl Lekce 2 Řetězce, Vstup/výstup. C2184 Řetězce a práce s nimi. Vstup a výstup. Úvod do programování ¥ Pythonu C2184 Úvod do programování v Pythonu podzim 2016 Stanislav Geidl Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady Národní centrum pro výzkum biomolekul Masarykova univerzita 2.1 Char (znak) • libovolný symbol na klávesnici i mimo ni Regular ASCII □ □□ □ 01 0 □02 e □□3 y 004 + □ 05 * □ OS * 007 ■ □ 08 □ 009 010 011 J1 012 * 013 014 É □ 15 O (nul) (soli) (stx) (etx) (eot) (enq) (ack) (bel) (tis) (tab) (If) (vt) (np) (cr ] (so] (si) □ 16 ► □ 17 -4 □ 18 J □ 19 !! □ 20 9[ □ 2 1 § □ 22 - □ 23 J □ 24 T □ 25 J □ 2 6 □ 27 - □ 28 L □ 29 „ □ 30 A □ 3 1 T (dle) (del) í de 2 j (dc3) (dc4) (nak) (syn) (etti) (can) (em) (eof) (esc) (fs) (gs) (rs) (us) Chart □ 32 s p 033 1 034 " 035 n 036 5 037 % 038 £ 039 1 040 ( 041 ) □ 42 * □ 43 + 044 , □ 45 -046 . □ 47 / (character 048 0 049 050 □ 51 052 □ 53 054 055 □ 56 8 057 9 □ 58 : 059 ; 060 < 061 = 062 > 063 1 codes 064 @ 065 A 066 E □ 67 C 068 □ 69 070 071 □ 72 073 □ 74 075 K 076 L 077 H 078 M 079 0 - 127) □ 80 P □ 81 Q □ 82 R □ 83 3 □ 84 T □ 85 U □ 8 6 V □ 87 U □ 88 □ 89 □ 90 □ 91 □ 92 □ 93 ] □ 94 A □ 95 □ 96 □ 9 7 098 □ 99 100 101 102 103 104 105 10 6 1Ü7 108 109 m 110 n 111 o b c d e f g h i 1 k 1 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 120 121 122 123 124 125 12 6 127 Extended ASCII Chart (character codes 128 - 255) 12 8 143 Č 158 172 Č 186 200 2 14 i 228 ň 242 12 9 Ü 144 É 159 Č 17 3 ? 187 Ť] 201 í 215 i 229 ň 243 ■ 13 0 é 145 Ĺ 160 á 174 188 J 202 216 ě 230 Š 244 - 13 1 á 146 i 161 í 175 v- 189 Ž 203 Ťf 217 J 231 3 245 S 13 2 ä 147 ô 162 ó 176 190 z 204 I 2 18 r 232 Ŕ 246 T 13 3 ů 148 O 163 Ú 177 I 191 1 205 219 I 233 Ú 247 13 4 c 149 Ľ 164 4 178 i 192 206 JL ir 220 ■ 234 ŕ 248 135 150 ľ 165 179 T 193 1 207 H 22 1 T 235 U 249 13 6 1 151 Š 166 Ž ISO \ 194 T 208 d 222 Ů 23 6 ý 250 137 e 152 á 167 š 181 Á 195 [ 209 D 223 ■ 237 Ý 251 Ü 138 Ö 153 Ö 168 182 Ä 196 210 Ď 224 Ó 238 c. 252 H 139 ô 154 Ü 169 e 183 Ě 197 í 211 Ě 225 ß 239 253 ŕ 140 i 155 Ť 170 —i 184 ? 198 Ä 212 ď 22 6 Ô 240 - 254 ■ 141 Ž 156 ť 171 ž 185 J| i 199 Š 213 Ň 227 w 241 - 255 142 Ä 157 í Řetězce. Vstup/výstup. Stanislav Geidl C2184 Úvod do programová v Pythonu Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady • Python nemá speciální typ pro znak, pouzí pro něj typ string • funkce chr () vrací znak pro zadanou ASCII hodnotu • funkce ord () vrací ASCII hodnotu pro zadaný znak (string of length 1) Speciální znaky, escapovaní • používá backslash backslash notace význam \a zvonek nebo alert \b Backspace \cx Control-x \C-x Control-x \e Escape \f Formfeed \M-\C-x Meta-Control-x \n Newline1 \nnn kód znaku v osmičkové sou- stave, n = 0..7 \r Carriage return \s Space \t Tab \v Vertical tab \x Character x \xnn kód znaku v šestnáctkové sou- stave, n = 0..9,a..f/A..F Řetězce. Vstup/výstup. Stanislav Geidl 1:) li 1» C21B4 do programová Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 1 zakončení řádku textového souboru záleží na OS 2.3 Rozdíly napříč OS a lokací Řetězce. Vstup/výstup. Stanislav Geidl • základní ASCII kódování 7 bitů (128 znaků), rozšířené kódování 8 bitů (256 znaků)2 C21B4 Úvod do programování Windows linux MacOS v ryrnony nový řádek \r \n \n \n Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 8-bit. kódování • 16 bitové Kódování zdr • defaultně cp1250 windows-1250 kódování utf-8 ojového soubon ascii nebo utf iso-8859-2 Iatin2 (Unicode, 65 j (skriptu) -8 mac_latin2 maccentraleurope 538 znaků) • kódování zdrojového souboru (skriptu) můžeme nastavit pomocí na prvním nebo druhém řádku souboru: # -*- coding: windows-1250 -*- 2Přehled standartního kódování: https: //docs .python. org/3/ library/codecs.html#standard-encodings 2.4 Řetězec je posloupnost znaků Python rozpoznává řetězce ohraničené uvozovkami 11 a apostrofy ' řetězec = "ja jsem řetězec" řetězce lze spojovat (řetězit) pomocí operátoru + "ahoj " + "uživateli" opakovat operátorem * "ahoj " * 10 přistupovat ke konkrétnímu znaku pomocí indexu nebo podřetězci pomocí rozsahu indexů řetězec [0] nebo řetězec[1:4] na řetězce lze volat vestavěné funkce "ja jsem řetězec".find("ja") můžeme zjišťovat délku řetězce len ("test") Řetězce. Vstup/výstup. Stanislav Geidl 1:) li 1» C21B4 do programová Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 2.5 Tvorba a změna řetězce nový řetězec vytvoříme například přiřazením3 retezecl = 'Ja jsem veta.' retezec2 = "Ja jsem druha veta." retezec3 = r"Ja jsem druha veta.\n" retezec4 = "Ja jsem veliiiiiiice \ dlouhá veta." retezec5 = """Ja jsem veliiiiiiice dlouhá veta.""" změnu provedeme libovolným použitím operátoru, např. retezec6 = retezecl + " " + retezec2 retezec7 = retezecl [:-1 ] + 11, j" + retezec2 [ 1:] Řetězce. Vstup/výstup. Stanislav Geidl 02184 Úvod do programování v Pythonu Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 3v každém příkladu mohou byt uvozovky nahrazeny za apostrof 2.6 Přístup k hodnotám Řetězce. Vstup/výstup. Stanislav Geidl • můžeme přistupovat k jakémukoliv znaku pomocí jeho indexu string [x], kde kladná čísla od nuly n určují index zleva a záporná čísla určují index zprava "Danny"[0] "Danny"[1] "Danny"[-1] • přes dvojtečku můžeme nadefinovat rozsah OD - PO string [x: y], kde tyto výrazy si odpovídají: string[:] == string string[x:] == string[x:len(string)] string[:y] == string[0:y] • pozor na číslovaní! v Pythonu začínáme od nuly! Danny Danny 01234 -5-4-3-2-1 • co bude výsledkem? "Danny" [1:4] "Danny" [2:] "Danny" [:2] "Danny" [2:2] "Danny" [-2:] "Danny" [:-2] ...... C21B4 Úvod do programová Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 2.7 Vestavěné funkce pro práci s řetězci I. • hledání count stringl.count(string2) "Danny".count("n") vrací počet výskytu string2 ve stringl find stringl.find(string2) "Danny".find("n") vrací index prvního výskytu string2 ve stringl index stringl.index(string2) funguje stejně jako find, ale je určen pro kolekce • nahrazování a rozdělení replace string.replace(old, new[, maxreplace]) "Danny".replace("an", "e") nahradí old za new v řetězci string maximálně maxreplace-krát split string.split(sep) "1 2 3".split (" ") vrací list řetězců, které vzniknou rozdělením string podle sep Řetězce. Vstup/výstup. Stanislav Geidl 02184 Úvod do programová Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 2.8 Vestavěné funkce pro práci s řetězci II Řetězce. Vstup/výstup. Stanislav Geidl • změna velikosti upper string.upper() "danny".upper() zvětší všechna písmena title string.title() "danny je pes".title() zvětší první písmena slov lower string.lower() "DANNY".lower() zmenší všechna písmena capitalize string.capitalize() "danny je pes".capitalize () zvětší první písmeno řetězce C21B4 Úvod do programová Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady swapcase string.swapcase() "Danny je Jack Russel".swapcase() zamění velikost písmen 2.9 Vestavěné funkce pro práci s řetězci odstraňování "bílých znaků"(u, \t, \n, \r) na koncích strip string.strip() "\tdanny ".strip() odebere bílé znaky z obou konců řetězce lstrip string.lstrip () "\tdanny ".lstrip() odebere bílé znaky z levého konce řetězce • spojování jinak rstrip string.rstrip() "\tdanny ".rstrip () odebere bílé znaky z pravého konce řetězce join string.join(collection) ".join("abed") proloží kolekci řetězcem string Řetězce. Vstup/výstup. Stanislav Geidl V? C21B4 Úvod do programová Řetězce Tvorba a změna řetězce I Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 2.10 Logické operace word = "Hello World" • word.isalnum() jsou všechny znaky písmena nebo čísla? • word.isalpha() jsou všechny znaky písmena? • word.isdigit() jsou všechny znaky čísla? • word.istitle() jsou všechny písmena slov velká? • word.isupper() jsou všechny písmena velká? • word.islower() jsou všechny písmena malá? • word.isspace() jsou všechny znaky bílé znaky? • word.endswith(' ď ) končí řetězec slova/znakem 'ď? • word.startswith('H') začíná řetězec slova/znakem 'ď? H • operátory in, not in Řetězce. Vstup/výstup. Stanislav Geidl 3 C2184 Úvod do programování Řetězce Tvorba a změna řetězce Vestavěné funkce ické operace Formátování řetězce Vstupy a výstupy Příklady 2.11 Formátování pomocí % • "řetězec: %s" % proměnna • formátovací znaky: %c znak, %s řetězec, %i celé číslo, %f desetinné číslo (pro booleovskou hodnotu můžeme použít %s) • modifikátory: • - zarovnání doleva • n, kde n udává celkovou délku • . m, kde m udává počet desetinných míst • Příklady: s" % "Danny" "%f" % 10.3232 20s" % "Danny" "%.2f" % 10.3232 -20s" % "Danny" "%10.2f" % 10.3232 "%s je %s." % ("Danny", "pes") "%s ma %i roku." % ("Danny", 3) "%s vazi %.lf kg." % ("Danny", 7.1) Řetězce. Vstup/výstup. Stanislav Geidl C2184 Úvod do progranmovämf v Pyíhonu Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 2.12 Formátování pomocí .format() • "řetězec: {}".formát(proměnna) • nepovinné formátovací znaky: {: s}, {: f}, {:d}, ...4 • délka: {: x}, kde x je délka • desetinná část: {: . y}, kde y je počet desetinných míst • zarovnání: {: <12} {:~12} {:>12} • výhoda oproti %, je možnost označit značky čísly 0-9 nebo přímo pojmenovat • Příklady: "{}".formát("Danny") "{:f}".formát(10.3232) " { : 20}".formát("Danny") " { : .2f}".formát(10.3232) " { :>20}".formát("Danny") "{:10.2f}".formát(10.3232) "{} je {}.".formát("Danny", "pes") "{1} ma {0} roku.".formát(3, "Danny") "{} vazi {:.lf} kg.".formát("Danny", 7.174) "{0}, {0}, ke mně. Hodnéj {0}".formát("Danny") "{j} je {r}.".formát(j="Danny", r="J. Russel") 4 Více informací: https : //docs . python . org/3 . 4 / library / st ring . html#formát-string-syntax Vstupy a výstupy Vstup: • vstup uživatele input () (v Pythonu 2.7 raw_input ()5) input() data = input (" Insert ^number ) • argumenty programu (přes modul sys) • ze souboru Výstup: • print() • sys.stdout asys.stderr • do souboru Řetězce. Vstup/výstup. Stanislav Geidl C2184 Úvod do programování v Pythonu Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Příklady 5funkce input() v Pythonu 2.7 automaticky převádí zadaný vstup na číslo apod. 2.14 Příklad I r = "Danny^je^Jack^Russel." O převeďte 'je' na 'Je' ('Danny Je Jack Russel.') © zachovejte pouze první velké písmeno řetězce r ('Danny je jack russel.') O nahraďte 'Jack Russel' za 'foxteriér' ('Danny je foxteriér.') O najděte indexy xay, tak aby r[x:y] odpovídalo řetězci MJackM('[9:13]') © CHALLENGE: nahraďte první výskyt zadaného znaku za znak napsaný velkými písmeny (např. pro 's': 'Danny je Jack RuSsel.') Řetězce. Vstup/výstup. Stanislav Geidl C2184 Úvod do programování ¥ Pythonu Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 2.15 Příklad I - řešení r = "Danny^je^Jack^Russel." O převeďte 'je' na 'Je' ('Danny Je Jack Russel.') rl = r.title () rl = r.replace("je","Je") © zachovejte pouze první velké písmeno řetězce r ('Danny je jack russel.') r2 = r.capitalize() O nahraďte 'Jack Russel' za 'foxteriér' ('Danny je foxteriér.') r3 = r.replace("Jack^Russel","foxteriér") Řetězce. Vstup/výstup. Stanislav Geidl C2184 Úvod do programování v Pythonu Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 2.16 Příklad I - řešení (pokračování) r = "Danny^je^Jack^Russel." O najděte indexy xay, tak aby r[x:y] odpovídalo řetězci MJackM('[9:13]') word = "Jack" start = r.index(word) end = start + len(word) print("[{}:{}]".formát(start,end)) print(r[9:13]) © CHALLENGE: nahraďte první výskyt zadaného znaku za znak napsaný velkými písmeny (např. pro 's': 'Danny je Jack RuSsel.') char = "s" i = r.index(char) r_challenge = r[:i] + r[i].upper() + r[i+l:] r_challenge = r.replace (char,char.upper(),1) Příklad II Pomocí funkce input () (případně funkce raw_input () v Pythonu 2.7) získtejte od uživatele tři proměnné a,bac: O zjistěte, jestli se jedná ve všech případech o čísla (např. 'Proměnna a je cislo: Falše') © zjistěte, jestli je číslo b sudé (např. 'Proměnna b je suda 0', kde 0 je sudé, 1 liché ;)) O spočítejte celočíselný podíl proměnných bac(^) O spočítejte kořeny xi a x2 kvadratické rovnice ax2 + bx + c = 0 Príklad I - řešení Řetězce. Vstup/výstup. Stanislav Geidl Pomocí funkce input () (případně funkce raw_input () v Pythonu 2.7) získtejte od uživatele tři proměnné a,bac: a = input() b = input() c = input() ...... C21B4 Úvod do programován Řetězce Tvorba a změna řetězce Vestavěné funkce O zjistěte, jestli se jedná ve všech případech o čísla (např. 'Proměnna a je cislo: Falše') Logické operace print ( "Pr . ^a^ je^cislo :,_,{ } " . formát (a . isdigit () ) f)ormátovánířetězce print ( "Pr . je^cislo :,_,{}". formát (b . isdigit () ) ústupy a výstupy print ( "Pr . ^c^ je^cislo :,_,{}'' . formát (c . isdigit () ) ^ady © zjistěte, jestli je číslo b liché (např. 'Proměnna b je lichá: I (b) I print("Pr. Jou je^liche^cislo :,_,{}".formát(bool(b%2))) 2.19 Příklad II - řešení (pokračování) Pomocí funkce input () (případně funkce raw_input () v Pythonu 2.7) získtejte od uživatele tři proměnné a,bac: a = input() b = input() c = input() O spočítejte kořeny xi a x2 kvadratické rovnice ax2 + bx + c = 0 a = int(a) D = b**2 - 4*a*c xl = (-b+D**.5) / x2 = (-b-D**.5) / print(xl) print(x2) (2*a) (2*a) Řetězce. Vstup/výstup. Stanislav Geidl 1» 02184 Úvccl do programová Řetězce Tvorba a změna řetězce Vestavěné funkce Logické operace Formátování řetězce Vstupy a výstupy Příklady 2.20