6. Základní typy#

Dnes se naučíte používat základní typy v Pythonu:

  • numerické typy jako je int nebo float,

  • řetězce (string).

6.1. Numerické typy#

Python má zabudované čtyři základní numerické typy:

  1. celá čísla: int (Python 2 měl ještě long)

  2. desetinná čísla: float (odpovídá double v C)

  3. komplexní čísla: complex

  4. logické (boolean): bool

1 + 2 - 3     # int - celá čísla
0
int1 = 10     # desítková soustava
int2 = 0b10   # binární
int3 = 0x10   # hexadecimální
int4 = 0o10   # osmičková
print("%i, %i, %i, %i" % (int1, int2, int3, int4))
print("To samé binárně")
print("%s, %s, %s, %s" % (bin(int1), bin(int2), bin(int3), bin(int4)))
10, 2, 16, 8
To samé binárně
0b1010, 0b10, 0b10000, 0b1000
print(2 / 3)  # dělení s desetinnou čárkou (vždy v Pythonu 3)
print(2 // 3)  # operátor pro celočíselné dělení
print(2.0 // 3.0)  # a pro desetinná čísla
0.6666666666666666
0
0.0
print("type(1) = %s" % type(1))
# Pro velká celá čísla máme long
print("type(10000000000000000000) = %s" % type(10000000000000000000))
# Velká celá čísla mohou být faaakt veliká.
velke_cislo = 999**999
print("999^999 = %d" % velke_cislo)
print("999 ^ 999 má {} cifer.".format(len(str(velke_cislo))))
type(1) = <class 'int'>
type(10000000000000000000) = <class 'int'>
999^999 = 368063488259223267894700840060521865838338232037353204655959621437025609300472231530103873614505175218691345257589896391130393189447969771645832382192366076536631132001776175977932178658703660778465765811830827876982014124022948671975678131724958064427949902810498973271030787716781467419524180040734398996952930832508934116945966120176735120823151959779536852290090377452502236990839453416790640456116471139751546750048602189291028640970574762600185950226138244530187489211615864021135312077912018844630780307462205252807737757672094320692373101032517459518497524015120165166724189816766397247824175394802028228160027100623998873667435799073054618906855460488351426611310634023489044291860510352301912426608488807462312126590206830413782664554260411266378866626653755763627796569082931785645600816236891168141774993267488171702172191072731069216881668294625679492696148976999868715671440874206427212056717373099639711168901197440416590226524192782842896415414611688187391232048327738965820265934093108172054875188246591760877131657895633586576611857277011782497943522945011248430439201297015119468730712364007639373910811953430309476832453230123996750235710787086641070310288725389595138936784715274150426495416196669832679980253436807864187160054589045664027158817958549374490512399055448819148487049363674611664609890030088549591992466360050042566270348330911795487647045949301286614658650071299695652245266080672989921799342509291635330827874264789587306974472327718704306352445925996155619153783913237212716010410294999877569745287353422903443387562746452522860420416689019732913798073773281533570910205207767157128174184873357050830752777900041943256738499067821488421053870869022738698816059810579221002560882999884763252161747566893835178558961142349304466506402373556318707175710866983035313122068321102457824112014969387225476259342872866363550383840720010832906695360553556647545295849966279980830561242960013654529514995113584909050813015198928283202189194615501403435553060147713139766323195743324848047347575473228198492343231496580885057330510949058490527738662697480293583612233134502078182014347192522391449087738579081585795613547198599661273567662441490401862839817822686573112998663038868314974259766039340894024308383451039874674061160538242392803580758232755749310843694194787991556647907091849600704712003371103926967137408125713631396699343733288014254084819379380555174777020843568689927348949484201042595271932630685747613835385434424807024615161848223715989797178155169951121052285149157137697718850449708843330475301440373094611119631361702936342263219382793996895988331701890693689862459020775599439506870005130750427949747071390095256759203426671803377068109744629909769176319526837824364926844730545524646494321826241925107158040561607706364484910978348669388142016838792902926158979355432483611517588605967745393958061959024834251565197963477521095821435651996730128376734574843289089682710350244222290017891280419782767803785277960834729869249991658417000499998999
999 ^ 999 má 2997 cifer.

Výpočty s desetinnými čísly jsou standardní, pozor na konečnou přesnost

3.1 * (0.2 - 0.1)**2
0.031000000000000007

Python umí komplexní čísla

abs(1 - 1j)
1.4142135623730951

S boolovskými hodnotami se pracuje snadno

b = True      # boolean
print(not b)  # logický operátor not
False

6.2. Řetezce – string a unicode#

Python obsahuje typy str a unicode (Python 3 je sjednocuje do builtins.str) a bohatou sadu funkcí pro práci s nimi. Ty jsou implementovány jednak jako metody (o třídách a metodách více později), jednak v modulech string, StringIO, re a dalších.

a = 3 * ("Abc%i" % 3) + "!"  # string lze vytvořit například takto
print(a)
Abc3Abc3Abc3!

Můžeme přistupovat k jednotlivým částem řetězce pomocí indexů

print(a[0])        # první znak řetězce
print(a[0:-1])     # všechny znaky kromě posledního
print(a[-1:None])  # poslední znak (None lze vynechat)
A
Abc3Abc3Abc3
!

Metoda format umožňuje pokročilé formátování textu.

a = '{0}{1}{0}'.format('abra', 'cad')  # metoda format
print(a)
print(a.upper())  # metoda upper
print(a.find("ra"))  # jednoduché hledání
print(a.upper().split('A'))  # rozdělení dělícím znakem
abracadabra
ABRACADABRA
2
['', 'BR', 'C', 'D', 'BR', '']

Modul string obsahuje další funkce.

import string       # načtení modulu string
print(dir(string))  # výpis obsahu modulu
['Formatter', 'Template', '_ChainMap', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_sentinel_dict', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']

vyzkoušíme capwords

print(string.capwords("titles in english use capital first letters."))
Titles In English Use Capital First Letters.

6.3. Konverze typů#

Python je silně typovaný, pamatujete? Typy lze ale převádět.

# str -> int
int("2")
2
# str -> float
float("2")
2.0
# float -> str
str(3.14)
'3.14'

Projekt - oko bere#

(kredit https://naucse.python.cz/course/pyladies/beginners/while/)

  1. Cílem hry je získat součet karet co nejblíže k 21, ale nepřekročit tuto hodnotu

  2. Hráč dostává postupně karty (hodnoty 2-10) a rozhoduje se, zda chce další

  3. Pokud součet karet přesáhne 21, hráč prohrává (“přetáhl”)

  4. Pokud hráč získá přesně 21 bodů, vyhrává

  5. Pokud se hráč zastaví pod 21 bodů, vyhrává pouze pokud má více bodů než protihráč

Doplňte chybějící části označené ??? a opravte chyby, aby fungoval program na hru oko bere (zjednodušená verze bez protihráče):

import random

soucet = 0
while ???:
    print('Máš', soucet, 'bodů')
    odpoved = input('Otočit kartu? ')
    if odpoved == 'ano':
        ??? = random.randrange(2, 11)
        print('Otočil/a jsi', karta)
        soucet = ???
    elif ???:
        break
    else:
        ???

if soucet == 21:
    print('Gratuluji! Vyhrál/a jsi!')
???
    print('Smůla!', soucet, 'bodů je moc!')
else:
    print('Chybělo jen', 21 - soucet, 'bodů!')

Vylepšete předchozí kód, aby

  1. se zeptal na počet otáčených karet

  2. hráč vyhrál, pokud má součet méně nebo rovno 21 a soupoeř (počítač) má méně bodů než hráč. Skóre počítače generujte pomocí random.normalvariate.

Nápověda - použijte konverzi str na int.