Základní syntaxe
Syntaxe v Pythonu je velmi jednoduchá (alespoň pokud to jde). Python je bezesporu jedním ze syntakticky nejpřirozenějších jazyků vůbec.
Komentáře¶
Komentáře v Pythonu jsou velice jednoduché. My je v celém kurzu používáme celkem hustě, takže jen pár ukázek:
# - Takto vypadá komentář.
# - Začíná vždy znakem "#" (hash)
# - Je víceméně ekvivalentní // v C++
a = 1 + 2 # Komentář na řádku s kódem
"""V Pythonu nejsou žádné víceřádkové komentáře, které by
odpovídaly /* */ z C++ či Javy, nicméně často se místo nich
používají víceřádkové řetězce, které se jen nepřiřadí do
žádné proměnné a dále nepoužijí. Obvyklé je to zejména u
tzv. docstringů (viz dále)."""
Jednoduché příkazy¶
Zkuste si následující příkazy a nějaké jejich obměny.
a = 1 + 1.1 / 2 # jednoduchý výpočet, vytvoření a přiřazení do proměnné a
print(type(a)) # výpis do terminálu (stdout)
a # IPython ukáže výstup, pokud ho neuložíme do proměnné
a = "Hello" + " world!" # jednoduchá práce s řetězci
print(a)
print("type(a) = %s, len(a) = %i" % (type(a), len(a))) # formátovaný výstup
import math # chceme načíst vestavěný modul math
a = math.cos(math.pi / 4) # použijeme funkci cos a konstantu pi
print('a = %.3g' % a)
from math import sin, pi # import pouze některých položek
a = sin(pi / 4)
print('a = %.3g' % a)
a = cos(pi / 2) # tohle asi nebude fungovat --> výjimka
Některé důležité vestavěné funkce¶
Vestavěných funkcí, nebo Built-in functions, je v Pythonu minimum. Zde zmíníme některé z nich (s některými jsme se už setkali):
-
dir
-- seznam jmen (funkcí, proměnných, metod) v daném kontextu -
eval
-- vrátí hodnotu výrazu zadanou řetězcem (to je možné, protože Python je interpretovaný jazyk) -
help
-- nápověda (neboli zobrazení 'docstring' -
len
-- délka (počet položek) proměnné (řetězce, pole apod.) -
open
-- otevření souboru -
print
-- výpis řetězce do stream -
raw_input
-- načtení vstupu od uživatele (stdin) -
str
,repr
-- text reprezentující daný objekt -
type
-- vrátí typ argumentu
Blíže se s těmito a dalšími vestavěnými funkcemi se seznámíme brzy.
print(str(dir()) + "\n")
print(repr(dir("a")))
a = 2
e = input("Zadejte výraz s proměnnou a: ")
print("%s = %s, a = %s" % (e, str(eval(e)), str(a))) # použití funkce eval na předem neznámý výraz
Podmínky a další bloky v Pythonu¶
V Pythonu začínají funkční bloky (neboli složené výrazy - compound statements klíčovým slovem, následovaným dvojtečkou a vymezují se odsazením (tj. žádné begin-end nebo dvojice závorek). Toto odsazení je libovolné, musí být ale konzistentní (tj. vždy stejný počet mezer). Silně se doporučuje používat čtyři mezery, jak říká PEP 8 (PEP 8 -- Style Guide for Python Code). Tento dokument obsahuje i další důležité konvence, např. pojmenovávání proměnných, funkcí, tříd atd., používání mezer a další. Ukážeme si to na if
bloku.
if 2 > 1:
print("Platí 2 > 1")
if 1 > 2:
print("Platí 2 > 1 a 1 > 2")
else:
print("Platí 2 > 1 a neplatí 1 > 2")
else:
print("Neplatí 2 > 1")
V Pythonu máme k dispozici trojici podmínkových klíčových slov if
- elif
- else
. Zato zde nenajdete nic, co by se podobalo klíčovým slovům switch
/case
z jiných jazyků (musíte si vystačit s if
, elif
, else
).
a = 5
if a > 10:
print("Tolik prstů na rukou nemáme")
elif a > 5:
print("Na to potřebujeme prsty na obou rukách")
elif a >= 0:
print("To dokážu spočítat na jedné ruce")
else:
print("Záporná čísla neumím")
Pro while
blok platí stejná pravidla pro odsazení:
a = 0
while a < 5:
print(a)
a += 1
while
blok (stejně tak for
, o tom ale bude řeč později, protože funguje krapet jinak než v jiných běžných jazycích) může mít také else
část, která se spustí ve chvíli, kdy je podmínka False
.
a = 0
while a < 5:
print("a = %i" % a)
a += 1
else:
a = 1
print("Konec, a = %i" % a)
Dále existují klíčová slova break
a continue
. break
přeruší cyklus, zatímco continue
skočí na začátek další iterace, tj. přeskočí příkazy pod sebou.
a = 0
while a < 5:
a += 1
# sudá čísla nebudeme vypisovat
if a % 2 == 0:
continue
print("a = %i" % a)
else:
a = 1
print("Konec, a = %i" % a)
# pomocí break najdeme největší trojciferené číslo dělitelné 19ti
a = 999
while a > 0:
if a % 19 == 0:
print("Výsledek je: %i" % a)
break
a -= 1
else:
# break nespustí else část
print("Nic jsme nenašli")
Víceřádkové výrazy¶
V Pythonu je možné dlouhé řádky rozdělit pomocí zpětného lomítka na konci řádku. Další řádek by se pak měl odsadit.
dlouhy_nazev_promenne = "pomoci plus vytvorime pro ukazku nejaky dlouhy retezec znaku, " + \
"ktery nedava zadny velky smysl ..."
dlouhy_nazev_promenne
Použití \ je ovšem ve většině případů zbytečné (a obecně se ndoporučuje), protože u výrazů v závorkách je zpětné lomítko nepovinné.
dlouhy_nazev_promenne = (10000000000000 + 2222222222222222 + 9999999999999999 + 3987493874 +
444444444444444 + 23987342978 + 9874 + 555555555555555555 +
987349987 - 9999999999999999999)
dlouhy_nazev_promenne
Obecně se doporučuje mít řádky kratší než 80 znaků (viz PEP8), tato konvence je ale v některých případech ne zcela vyhovující.
Definice funkcí¶
Základem pro definici funkcí je klíčové slovo def
. Opět to ukážeme na příkladech.
# definice jednoduché funkce bez parametrů a návratové hodnoty
def hello():
print("Hello Python!")
# tady funkci zavoláme
hello()
Taková funkce je ale celkem neužitečná, u funkcí potřebujeme obvykle vstupy a/nebo výstupy.
# what je argument funkce hello
def hello(subj):
phrase = "Hello %s!" % subj
# return ukončí funkci a případně vrátí hodnotu
return phrase
print(hello("Prague"))
Rozlišujeme poziční a keyword (pojmenované) argumenty. Argumenty mohou mít i implicitní hodnoty, čímž se stanou nepovinnými.
# greet je argument s implicitní hodnotou
def hello(subj, greet="Hello"):
phrase = "%s %s!" % (greet, subj)
# return ukončí funkci a případně vrátí hodnotu
return phrase
# ponecháme implicitní hodnotu greet
print(hello("Prague"))
# použijeme greet jako keyword argument
# poziční argumenty musí být vždy jako první
print(hello("Praho", greet="Nazdar"))
# subj můžeme také použít jako keyword argument
print(hello(greet="Nazdar", subj="Praho"))
Funkce mohou mít i proměnný počet argumentů, o tom si ale povíme později, až se naučíme používat základní kontejnery a iterace.
Cvičení: Přepiště výpočet obsahu lichoběžníku do funkce
a = 3.5
b = 2.1
v = 77e-1
S = (a + b) * v / 2
print("Obsah lichoběžníku a=%g, b=%g, v=%g je: %g" % (a, b, v, S))
Z toho bychom rádi funkci - doplňte:
def trapezoid_area(...):
...
S = trapezoid_area(a, b, v)
Vedlejší efekty u funkcí¶
Funkce v Pythonu mohou mít vedlejší efekty, tj. mohou měnit vstupní argumenty, pokud jsou argumenty tzv. mutable. Co znamená mutable a immutable, se dozvíme později. V každém případě se silně doporučuje vyhnout se funkcím s vedlejšími efekty (pokud z pojmenování a účelu funkce jasně nevyplývá, že je má). Ukážeme si příklad funkce, která má vedlejší efekty.
def do_not_do_this(l):
# předpokládáme, že l je list
l.append("I'm here")
print("l inside the function")
print(l)
print("original list")
x = ["in my list"]
print(x)
do_not_do_this(x)
print("x after calling the function")
print(x)
# Toto už je lepší, neboť je zřejmé, že funkce vedlejší efekty má (a jaké asi jsou).
# Ale i tak by se to dalo vyřešit lépe.
def insert_item_into_list(l, item):
l.append(item)
Nemilé překvapení nás také může čekat, pokud implicitní hodnoty nějakého parametru jsou mutable.
def foo(l=[]):
# tady se mění l
l.append("appended")
print(l)
# zavoláme s explicitním argumentem
foo([])
# pak zavoláme s implicitní hodnotou - výsledek by měl být stejný
foo()
# zkusíme stejná dvě volání, očekáváme, že výsledky budou stále stejné, ale ...
foo([])
foo()
Vedleším efektům můžeme předcházet pomocí kopírování (modul copy
, některé třídy obsahují metodu copy
). Lépe je ale přímo generovat výsledky do nové proměnné, tedy např.
def foo(l=[]):
p = l + ["appended"]
print(p)
# zavoláme s explicitním argumentem
foo([])
# pak zavoláme s implicitní hodnotou - výsledek by měl být stejný
foo()
# zkusíme stejná dvě volání, výsledky už snad budou stejné
foo([])
foo()
Použití modulů¶
Jakýkoliv složitější kód (od stovek řádků výše) je obvykle dělen do tzv. modulů. Zatím je považujeme za jednoduché schránky se znovupoužitelnými funkcemi a objekty (o jejich vytváření si povíme později), nicméně už od samého počátku práce s Pythonem se bez použití (cizích) modulů neobejdeme. Celá bohatá základní knihovna Pythonu je vlastně ohromná množina modulů.
# Načte modul "math" a zpřístupní objekty v něm obsažené
import math
# cos je funkce definovaná v modulu "math"
print(math.cos(0))
Kromě importu modulů jako takových lze importovat i některé jejich části, v našem případě:
# Budeme s funkcí "cos" z modulu "math" zacházet, jako kdyby byla definována v aktuálním souboru
from math import cos
print(cos(0))
# Importuje všechny objekty, které v modulu najde. Obvykle se nedoporučuje používat, protože
# nevíme, co všechno modul obsahuje, a spousta pojmenovaných funkcí, tříd a proměnných by
# mohla kolidovat s něčím v aktuálním skriptu.
from math import *
Komentáře
Comments powered by Disqus