Známe spoustu matematických operací, které se zapisují symboly – třeba plus a minus. Python se snaží používat stejné symboly jako matematici:
S násobením a dělením už je to složitější, matematický zápis se na běžné klávesnici nedá napsat:
V Pythonu si ale pořád vystačíme se symbolem, byť trochu jiným – *
, /
.
Matematici ale píšou na papír, a tak si můžou dovolit vymýšlet stále zajímavější klikyháky, které se pak na klávesnici píšou dost špatně:
Ne že by neexistovaly programovací jazyky, na které je potřeba speciální klávesnice. Třeba program v jazyce APL laik jednoduše ani nenapíše, ani nepřečte:
⍎’⎕’,∈Nρ⊂S←’←⎕←(3=T)∨M∧2=T←⊃+/(V⌽”⊂M),(V⊖”⊂M),(V,⌽V)⌽”(V,V←1¯1)⊖”⊂M’
Expert v APL může být vysoce produktivní, ale Python se zaměřuje spíš na to, aby se dal snadno naučit. A tak používá symboly jen pro ty nejčastější operace. Je jich dokonce tak málo, že už jich zhruba půlku znáš!
Pro zajímavost, tady jsou všechny operátory v Pythonu, které používají symboly:
==
!=
<
>
<=
>=
|
^
&
<<
>>
+
-
*
@
/
//
%
~
**
[ ]
( )
{ }
.
Všechno ostatní vyjádříme slovně.
Jedna operace, na kterou v Pythonu není symbol, je zjištění délky řetězce.
Matematik by něco takového napsal třeba pomocí svislých čárek (s poznámkou, co přesně ty čárky reprezentují):
V Pythonu má operace „délka řetězce“ místo symolu název.
Jmenuje se len
(z angl. length, délka), a píše se len(s)
:
s = 'Ahoj'
delka = len(s) # Vypočítání délky
print(delka)
Ono len(s)
výraz – operace, která něco udělá podle hodnoty s
a výsledek
dá k dispozici.
Funguje podobně jako jiné výrazy – třeba a + b
, což je operace, která něco
udělá podle hodnot a
a b
a výsledek dá k dispozici.
V první případě je výsledkem délka; ve druhém součet.
To len
je funkce a zápisu len(s)
se říká volání funkce.
Pojďme se si je popsat trochu zevrubněji.
Pro matematičky
Máš-li ráda matematiku, dej pozor! Funkce v Pythonu je něco jiného než funkce v matematice, i když se stejně jmenují a podobně zapisují. Pythonní funkce může např. dávat pro jeden argument různé hodnoty.
Funkci voláme jménem, například len
.
Je to jméno jako u proměnných. (Vlastně to je proměnná, jen místo čísla nebo řetězce označuje funkci.)
Za jméno funkce patří závorky,
do nichž uzavřeme argument (neboli vstup) funkce.
To je informace, se kterou bude naše funkce
pracovat – třeba len
ze svého argumentu vypočítá délku.
Volání funkce je výraz a jeho výsledek, takzvaná návratová hodnota (angl. return value) se dá třeba přiřadit do proměnné.
# jméno funkce
# │
# ╭┴╮
x = len('Ahoj!')
# ▲ ╰──┬──╯
# │ argument
# │
# ╰── návratová hodnota
Nebo se volání funkce dá použít místo čísla v součtu:
delka = len('Ahoj') + len('!')
Nebo v podmínce ifu:
if len('Ahoj!') < 3:
Nebo dokonce jako argument jiné funkce:
print(len('Ahoj'))
Nebo to zkombinovat dohromady:
print(len('Ahoj') + 1)
… a podobně.
Možná sis všimla, že příkaz print(x)
vypadá podobně jako volání funkce.
To není vůbec náhoda – print
je totiž taky funkce!
Stejně jako len
dostává v závorkách argument – hodnotu, se kterou pracuje.
Na rozdíl od len
ane print
nic nevrací.
Výsledek volání print('Ahoj')
není žádná smysluplná hodnota.
Místo vypočítání nějaké hodnoty print
něco udělá – vypíše text na obrazovku.
Funkcím, které nic nevrací (jen něco udělají) se občas říká procedury. V Pythonu není hranice mezi „normální“ funkcí a procedurou příliš ostrá, ale přesto se hodí tento koncept znát. Pár příkladů:
Na rozdíl od ostatních termínů, které se tu učíš, není „procedura“ v Pythonu zavedený pojem. Je vypůjčený z jazyka Pascal. Kdybys o něm diskutovala s nějakým zkušeným programátorem, odkaž ho prosím na tyto materiály.
Argument je to, co funkci „předhodíš“ – dáš k dispozici.
Chceš-li délku řetězce Ahoj!
, použiješ funkci len
která umí vypočítat
délku jakéhokoli řetězce – a jako argument, v závorkách, jí dáš tu svoji
konkrétní hodnotu: len('Ahoj!')
.
Podobně funkce print
umí vypsat jakoukoli hodnotu.
Tu, kterou má vypsat v tvém konkrétním případě, jí předáš jako argument.
Některým funkcím můžeš předat i více argumentů.
Třeba zrovna funkci print
, která všechny své argumenty vypíše na řádek.
Jednotlivé argumenty se oddělují čárkami:
print(1, 2, 3)
print("Jedna plus dva je", 1 + 2)
Některé funkce nepotřebují žádný argument.
Příkladem je zase print
.
Je ale nutné napsat závorky – i když jsou prázdné.
Hádej, co tohle volání udělá?
print()
Některé funkce umí pracovat i s pojmenovanými argumenty. Píšou se podobně jako přiřazení do proměnné, s rovnítkem, ale uvnitř závorek.
Třeba funkce print
normálně ukončí výpis novým řádkem,
ale pomocí argumentu end
se dá vypsat i něco jiného.
Tenhle příklad je potřeba napsat do souboru; v interaktivní konzoli nebude výstup vypadat, jak má.
print('1 + 2', end=' ') # Místo přechodu na nový řádek jen napiš mezeru
print('=', end=' ')
print(1 + 2, end='!')
print()
Pozor na to, že když nenapíšeš závorky, funkce se nezavolá!
Výraz len(s)
je volání funkce, ale len
bez závorek označuje
funkci samotnou.
Výsledek len(s)
je číslo; len
je funkce.
Čísla můžeš sečítat, můžeš tedy napsat len(s) + 1
.
Funkce ale sečítat nejde – len + 1
nedává smysl.
Často se ale stane, že závorky prostě zapomeneš. Zkus si, co dělají následující příklady, a pozorně si přečti výsledky a chybové hlášky, abys pak podobné chyby poznala:
print(len('a')) # Volání funkce (a vypsání výsledku)
print(len) # Vypsání samotné funkce
print(len + 1) # Sečtení funkce a čísla
Nakonec si ukážeme pár základních funkcí, které nám Python nabízí. Můžeš si stáhnout i přehled, který se rozdává na srazech.
Tyhle funkce už známe.
print
vypíše nepojmenované argumenty, oddělené mezerou.
Pojmenovaný argument end
určuje, co se vypíše na konci (místo přechodu
na nový řádek);
sep
zase, co se vypíše mezi jednotlivými argumenty (místo mezery).
Příklad opět spusť ze souboru, ne interaktivně:
print(1, 'dvě', False)
print(1, end=' ')
print(2, 3, 4, sep=', ')
Základní funkce na načtení vstupu, input
,
vypíše otázku, počká na text od uživatele a ten vrátí jako řetězec.
input('zadej vstup: ')
Kontrolní otázky:
input
„normální“ funkce, nebo procedura?input
jako argument?input
?Co ale když nechceme pracovat s řetězcem, ale třeba s číslem?
Tady nám pomůže skupina funkcí, které umí převádět čísla na řetězce a zpátky.
Každý ze tří typů (angl. types) proměnných, které zatím známe,
má funkci, která vezme nějakou hodnotu a vrátí podobnou hodnotu „svého“ typu.
Na celá čísla je funkce int
(z angl. integer), na reálná čísla je float
(z angl. floating-point), a pro řetězce str
(z angl. string).
int(x) # převod na celé číslo
float(x) # převod na reálné číslo
str(x) # převod na řetězec
Příklady:
3 == int('3') == int(3.0) == int(3.141) == int(3)
8.12 == float('8.12') == float(8.12)
8.0 == float(8) == float('8') == float(8.0)
'3' == str(3) == str('3')
'3.141' == str(3.141) == str('3.141')
Ne všechny převody jsou možné:
int('blablabla') # chyba!
float('blablabla') # chyba!
int('8.9') # chyba!
…a jak si poradit s chybou, která nastane, když použiješ špatnou hodnotu, si řekneme později.
input
Převádění typů se často používá při načítání vstupu, třeba jako:
cislo = int(input('Zadej číslo: '))
Jak Python vyhodnotí tento výraz?
Zadá-li uživatel 42, funkce input
vrátí řetězec'42'
.
Ten pak funkce int
vezme jako argument, udělá z něj číslo a to číslo vrátí:
cislo = int(input('Zadej číslo: '))
# ╰─────────┬─────────╯
cislo = int( '42' )
# ╰────────────┬────────────╯
cislo = 42
Matematika je občas potřeba, takže se pojďme podívat, jak v Pythonu pracovat s čísly.
Jedna zajímavá matematická funkce je k dispozici vždy:
round(cislo) # zaokrouhlení
Spousta dalších není k dispozici od začátku programu.
Ne každý má rád matematiku, a ne ve všech druzích programu jsou takové operace
potřeba.
Proto musíme předem – typicky na začátku souboru – říct, že je budeme používat.
To se dělá naimportováním z modulu math
:
from math import sin, cos, tan, sqrt, floor, ceil
Naimportované funkce pak můžeš použít:
sin(uhel) # sinus
cos(uhel) # kosinus
tan(uhel) # tangens
sqrt(cislo) # druhá odmocnina
floor(cislo) # zaokrouhlení dolů
ceil(cislo) # zaokrouhlení nahoru
Import a pojmenování souborů
Při importování je potřeba si dávat pozor na pojmenování souborů:
importuješ-li from math
, nesmí se tvůj program jmenovat math.py
.
Proč? Když Python v adresáři, ze kterého program pouštíš, najde soubor
math.py
, bude se snažit importovat sin
z něho místo
z předpřipravené sady matematických funkcí.
Nakonec si ukážeme dvě funkce, které vrací náhodná čísla:
randrange
a uniform
.
Jsou užitečné třeba pro hry, ve kterých se hází kostkou nebo tahají
náhodné karty.
Opět nejsou potřeba tak často a je potřeba je naimportovat.
Tentokrát z modulu random
:
from random import randrange, uniform
Pak už se dají použít:
randrange(a, b) # náhodné celé číslo od a do b-1
uniform(a, b) # náhodné reálné číslo od a do b
Pozor na to, že randrange(a, b)
nikdy nevrátí samotné b
.
Pokud potřebujeme náhodně vybrat ze tří možností,
použij randrange(0, 3)
,
což vrátí 0
, 1
, nebo
2
:
from random import randrange
cislo = randrange(0, 3) # číslo je od 0, 1, nebo 2
if cislo == 0:
print('Kolečko')
elif cislo == 1:
print('Čtvereček')
else: # 2
print('Trojúhelníček')
Pamatuj, když importuješ z modulu random
, nesmí se tvůj soubor
jmenovat random.py
.
Python dává k dispozici obrovské množství dalších funkcí a modulů, i když ne všem budeš ze začátku rozumět. Všechny jsou – anglicky – popsány v dokumentaci Pythonu, např. vestavěné funkce, matematika.