int21h

Základy Pythonu

1. Skripting, interpret Pythonu, prostředí IDLE

Skripting:

Skriptování je metoda programování používaná převážně na UNIX-like systémech. (V systémech Win32 se nerozvinula kvůli zaostalosti příkazového interpretu a odlišnému pojetí OS). S příchodem moderních jazyků (jako je Perl, nebo Python) se skriptování v systému stává stále mocnějším a rozšiřuje se i na ostatní platformy.
Klasické programování je cyklus úprava/kompilace/ladění, u skriptů odpadá kompilace i oddělené ladění. Skripty se nemusí kompilovat a ladění může probíhat přímo při psaní zdrojového kódu.
Kompilované jazyky musíme přeložit do strojového kódu kompilátorem. Po přeložení je program platformně nepřenositelný, neupravitelný. Skriptovací jazyky se nepřekládají, tudíž jsou to textové soubory se zdrojovým kódem (open source). Na každém počítači musí být interpret tohoto jazyka a tímto interpretem se jazyk překládá za chodu skriptu.
Právě existence interpretů na různých platformách umožňuje přenositelnost kódu a jazyk Python má interprety pro většinu dostupných systémů (např. Win32, UNIXy, MacOSX, BeOS,...).
Rozmach skriptovacích jazyků také souvisí s rychlostí počítačů. Provoz interpretovaných jazyků je totiž technicky velmi náročný, tudíž skripty nebyly zdaleka tak výkonné jako zkompilované programy. V dnešní době však výkon počítačů zdaleka převyšuje většinu aplikačních nároků a proto jsou skripty dostatečně rychlé. Navíc je Python hodnocen jako jeden z nejrychlejších interpretovaných jazyků.

Jazyk Python je oblíbený z několika důvodů:
1. Je velmi výkonný
2. Má velké množství knihoven
3. Je multiplatformní
4. Je plně objektovým jazykem
5. Existuje pro něj nejedno příjemné uživatelské prostředí
6. Je velmi jednoduchý a má velmi elegantní syntaxi
7. Samotný jazyk má velmi silné datové typy. (Například dlouhá celá čísla, nebo dynamické seznamy omezené jen pamětí počítače)

Interpret Pythonu:

Interpet je program, jehož vstupem jsou jednotlivé řádky kódu. Jakmile obdrží řádek, ihned ho provede (u skriptů provádí syntaktickou kontrolu celého kódu ještě před spuštěním).
Jazyk Python je přímo od tvůrce (Guido van Rossum) vybaven velkým množstvím knihoven. Například pro práci s operačním systémem, internetem a různými formáty souborů. A další množství knihoven se nachází na internetu.

Prostředí IDLE:

Python obsahuje knihovnu pro programování GUI rozhraní. Tato knihovna se jmenuje Tkinter a je v ní naprogramováno GUI prostředí pro programování v jazyku Python IDLE. Prostředí existuje víc, stejně jako knihoven pro GUI. Práce v prostředí IDLE je velmi pohodlná a rychlá a na platformě Win32 usnadňuje přechod k jiné filosofii psaní kódu.

Další informace:

Další informace o skriptování a o jazyku Python naleznete na www.python.org, v češtině na www.py.cz. Velmi dobrým úvodem do skriptování je kniha Nebojte se programovat (Jiří Rubeš, Computermedia). Dobrou referenční příručkou je kniha Python (David M. Beazley).

2. Jazyk Python

Datové typy Pythonu

Python disponuje všemi základními datovými typy a přidává ještě další.
Celočíselné typy jsou int(), long(), s plovoucí řádovou čárkou float() a datový typ komplexních čísel complex().
Řetězcovým typem je str(), řetězce se uvozují a ukončují uvozovkami, apostrofy nebo trojicí uvozovek (např. "text", 'text', """Text na více řádků""").
Logickým typem je typ bool(). V podmínkách je nula nepravdou a ne-nulová hodnota pravdou.
Datový typ list() je rozšířením statických polí na dynamické seznamy. K jednotlivým položkám se přistupuje přes indexy v hranatých závorkách. Zadání seznamu o třech položkách, číslu, řetězci a dalším seznamu můžeme provést takto: [51, "text", [0,1,2]]. Seznamy se budeme hlouběji zabývat později.
Tento výčet typů je pouze informativní, jazyk Python má velmi mnoho datových typů jejichž seznam a popis najdete v originální dokumentaci.

Vstup a výstup programu

Na standartní výstup programu zapisuje příkaz print. Syntaxe příkazu je jednoduchá. Za příkaz print uvedeme postupně výrazy oddělené čárkou. (print "x+y=",x+y). Příkaz print má ještě jednu možnou syntaxi podobnou funkci printf() z jazyka C ( print "formátovací řetězec" % (výrazy oddělené čárkami) ).

Ze standartního vstupu programu čte funkce raw_input(). Funkce vrací data typu řetězec. Pokud chcete docílit zadání jiných dat, výstup funkce přetypujeme. ( x=int(raw_input()) ).

Větvení programu

Větvení programu provádí příkaz if. Syntaxe if je opět jednoduchá, zadáváme podmínku, příkazy které se provedou při splnění podmínky a nepovinně příkazy, které se provedou při nesplnění podmínky. Python na označování bloků nepoužívá žádná klíčová slova (begin-end, {-}), bloky se pouze odsazují mezerami či tabulátory. Příkazy se stejným odsazením jsou zpracovávány jako jeden blok.
if (podmínka):
	příkaz
else:
	příkaz  
Cykly

Jazyk Python obsahuje dva typy cyklů. Pro pevný počet opakování for a s podmínkou na začátku while.
for i in range(n):
	příkaz  
i, je řídící proměná cyklu a nabývá postupně hodnot ze seznamu. V tomto případě je seznam vytvořen funkcí range(n). Funkce vrací seznam [0,1,...,n-1].
while (podmínka):
	příkaz  
Podmínka musí být pravdivá, aby cyklus začal a pokračoval v provádění. Při nesplnění podmínky se cyklus ukončí.

Na závěr této lekce si ještě uvedeme dva příkazy jazyka Python. Příkaz type(objekt) vypíše název datového typu objektu. Příkaz dir(objekt) vrátí seznam všech metod objektu. K metodám přistupujeme přes tečkovou notaci. Například funkce obsahují dokumentační řetězec, který je uložen v proměnné funkce.__doc__ (viz. print range.__doc__). Objektovým programováním se budeme hlouběji zabývat v jedné z příštích lekcí.
3. Funkce

Podobně jako jazyk C obsahuje jazyk Python jako prostředek pro tvorbu podprogramů pouze funkce. Stejně jako u jazyka C ale nemusíme funkční hodnotu funkce očekávat a funkce ani nemusí žádnou hodnotu vracet.
Funkce se v jazyku Python deklarují na libovolném místě kódu, musí to ovšem být před prvním voláním této funkce. Pokud funkce vrací hodnotu, může to být maximálně jedna hodnota libovolného typu a vrácení provede příkaz return. Po jeho provedení se kód funkce ukončí. Funkce jsou pojmenovány jedinečnými identifikátory a lze jim předávat parametry.
Deklarace funkce začíná klíčovým slovem def, pokračuje identifikátorem funkce a specifikováním parametrů.

Jako příklad uvedeme funkci pro výpočet třetí mocniny zadaného čísla:
def power3(n):
	return long(n*n*n)  
Funkci můžeme v kódu zavolat pomocí jejího identifikátoru.

power3(9)
819

Kód těla funkce má přístup ke globálním proměnným, ale nemůže je měnit. Pokud vytvoříme proměnnou stejného názvu, zastíníme proměnnou globální. Hodnoty parametrů jsou do funkcí kopírovány.

I když funkci nepředáváme parametry, musíme ji definovat se závorkami a se závorkami ji musíme i volat.
def pozdrav():
	print "Hello World!!!"


pozdrav()
'Hello World!!!'  
Jazyk Python podporuje rekurzivní volání funkcí. Počet rekurzivních vnoření je ale nastavením limitován (1000 vnoření). Nastavení můžeme změnit funkcí setrecursionlimit z modulu sys na libovolné číslo.

K funkcím můžeme přidávat vlastní dokumentační řetězce. Tyto řetězce potom můžeme získat přes identifikátor __doc__ (funkce.__doc__).
První řádek řetězce se také zobrazuje při automatické nápovědě k funkci prostředí IDLE.
def velikost(x, y):
	"""int x, int y
Vrati seznam s prvky x, y serazenymi vzestupne"""


	if (y>x):
		return list([x,y])
	else:
		return list([y,x])


velikost.__doc__
'int x, int y
Vrati seznam s prvky x, y serazenymi vzestupne'


velikost(5,3)
[3, 5]  
Používání dokumentačních řetězců je velmi vhodné při tvorbě balíků funkcí, takzvaných modulů. Moduly se budeme zabývat v dalších lekcích. Většina funkcí vytvořených pro jazyk Python dokumentační řetězce obsahuje. To je velmi výhodné, protože nepotřebujeme další externí dokumentaci ke knihovnám funkcí.

4. Datový typ list()

List()

Seznam list() je dynamický datový typ. Jsou to indexovaná pole s proměnlivou délkou. V každým prvku pole může být další libovolný datový typ, i další seznam. Prvky se uzavírají do hranatých závorek [] a oddělují se čárkami. Počítání indexů prvků začíná od nuly. Prázdný seznam definujeme jako l=[] nebo l=list().
Na seznamy lze aplikovat funkce len(l), min(l), max(l), del(l[i]), ... Nově vytvořený seznam je objektem, který má vlastní metody. Uvedu jen ty nejdůležitější:

append(x) - přidá nový prvek x na konec seznamu
insert(i ,x) - vloží prvek x na i-tou pozici v seznamu
index(x) - vrátí index prvního výskytu rovného x
count(x) - vrátí počet výskytů prvku rovného x
remove(x) - smaže první prvek rovný x
sort() - provede seřazení seznamu
reverse() - obrátí pořadí prvků

Tuple()

V jazyce Python existuje ještě typ tuple(). Tento typ je velmi podobný typu list(). Typ tuple() je ale neměnný. Jakmile jednou vytvoříme sekvenci tuple(), nemůžeme měnit ani její délku ani její hodnoty. Tuple sekvence jsou používány při vracení hodnot funkcemi. Definice tuple() je t=(a,b,c), nebo t=tuple(a,b,c). Pokud chceme vytvořit tuple() jen o jednom prvky musíme uvést za tímto prvkem čárku t=(a,). Jazyk Python tak pozná, že se jedná o tuple() a ne jen obyčejný výraz. Přístup k prvkům sekvence je stejný jako u typu list().

Na tomto místě je ještě vhodné upozornit, že s typem str() může pracovat podobně jako s typem list(). Přístup je ale omezen pouze na čtení.

Přístup k sekvenčím typům.

Přístup k sekvenčním typům není v jazyce Python omezen pouze na zpracování jednoho prvku (l[i]). V jazyce Python můžeme použít tzv. slice.
Slovní popis slice je obtížnější, proto použiji příklady:
l = [0, 'text', [2, 2, 2], -100]


len(l)
4


l[3]
-100


l[1:2]			# podseznam od 1. do 2. prvku
['text', [2, 2, 2]]


l[2:]			# podseznam od 2. prvku do konce seznamu
[[2, 2, 2], -100]


l[1:-1]			# podseznam od 1. prvku do predposledniho prvku
['text', [2, 2, 2]]  
Jednotlivým výrazům můžeme také přiřazovat hodnoty:
l[-2]='text2'		# l == [0, 'text', 'text2', -100]


l[len(l):] = [x]	# ekvivalent k l.append(x)


Stejně můžeme zpracovat typ str():


s = "Hello World!!!"


len(s)
14


s[6:-3]
'World'  
Více informací o sekvencích list() a tuple() se dozvíte v originální dokumentaci k jazyku Python. Mimo list() a tuple() existuje ještě jeden zajímavý datový typ dict(), takzvaný dictionary neboli slovník, dict() je moderní vysokoúrovňový datový typ, podrobnosti opět najdete v dokumentaci.

5. Moduly

Python je strukturovaný jazyk. Jednotlivé struktury se objevují v syntaxi jazyka, ale důležitá je i strukturovanost kódu do jednotlivých na sobě nezávislých bloků. Těmito bloky jsou například funkce. Může mít také soubor funkcí podobného zaměření, z těchto funkcí potom můžeme vytvářet moduly. Moduly umožňují opakované použití kódu, což je v dnešní době a hlavně v open source velmi žádané. Ve srovnání s jinými jazyky jsou moduly podobné knihovnám unit v Pascalu, nebo hlavičkovým souborům a knihovnám v jazyku C.

V jazyce Python je modul obyčejným textovým souborem, ve kterém jsou obsaženy definice a kódy objektů (např. proměnné, funkce, objektové třídy, ...). Každý dokument může obsahovat i dokumentační řetězec. Opět je to řetězec na prvním řádku modulu.

Použití modulu ve skriptu je velmi jednoduché. Modul takzvaně importujeme pomocí příkazu import. V globálním prostoru jmen se vytvoří objekt modulu, a k objektům uvnitř modulu přistupujeme pomocí tečkové notace (pro pochopení vám velmi pomůže funkce dir()).

Pro názornost uvedu zdrojový kód modulu a jeho použití ve skriptu:
### soubor: math.py
"""Modul math obsahuje matematické funkce"""


pi=float(3.141592654)		# definovani konstanty pi


def odmocnina(r,n):
	"n-ta odmocnina z r"
	return float(r ** (1.0/n))


def mocnina(r,n):
	"n-ta mocnina r"
	return float(r ** n)


def obvodkruhu(r):
	"obvod kruhu o polomeru r"
	return float(2*pi*r)


def obsahkruhu(r):
	"obsah kruhu o polomeru r"
	return float(pi*mocnina(r,2))


# Konec modulu math.py


### skript priklad.py


import math


print math.pi


r=float(raw_input("Zadej polomer kruhu: "))
print "Obvod kruhu je %.3f
Obsah kruhu je %.3f" % (math.obvodkruhu(r), math.obsahkruhu(r))


print "2 na 10 je ", mocnina(2,10)


### Konec souboru priklad.py  
Importovaný modul se musí nacházet v systémových adresářích Pythonu nebo v aktuálním adresáři. Moduly se můžou importovat mnoha způsoby (doporučuji referenci příkazu import). Hlavní způsob import modul, jsme si už uvedli. Můžeme ale chtít importovat jen některé objekty z modulu, potom použijeme konstrukci from modul import funkce1, funkce2. Funkce se importují do globálního oboru jmen.

Standardní moduly jazyka Python

Jazyk Python obsahuje velmi mnoho zabudovaných modulů. Jejich seznam a popis najdete v referenční příručce jazyka Python. Uvedu jen ty nejdůležitější:

__builtins__ je základním modulem jazyka Python. Dosud jsme ho používali aniž bychom věděli, že je to modul. Obsahuje základní funkce, a datové typy.

sys je modul, pomocí kterého můžeme přistupovat k samotnému jádru interpretu Pythonu. Obsahuje proměnné sys.path (systémová cesta souborům interpretu), sys.platform (označení platformy na které interpret běží), sys.argv (argumenty se kterými byl interpret spuštěn), sys.version (verze interpretu), sys.stdout, sys.stdin, sys.stderr (soubory standardního vstupu a výstupu), atd...

os je modul umožňující práci s operačním systémem, funkce os.mkdir, os.listdir, os.system a slovník os.environ,...

random modul, který obsahuje funkce na generování náhodných čísel, např.: random.randrange

Tkiner je modul obsahující funkce pro vytváření GUI aplikací v Pythonu.

6. OOP

Objektově orientované programování v Pythonu

Python obsahuje většinu nejdůležitějších vlastností OOP (Object Oriented Programming). Tato kapitola nebude úvodem do objektového programování obecně. Ukážeme si pouze základní vlastnosti objektů v Pythonu a naučíme se vytvořit jednoduchou objektovou třídu.

Objekt je datový typ, který obsahuje datové složky i vlastní funkce. Datové složky se nazývají atributy objektu, funkce jsou metody objektu. K jednotlivým složkám uvnitř objektu se přistupuje pomocí tečkové notace. Prohlédnout objekt si můžeme pomocí funkce dir(). Každý objekt má takzvanou inicializační část, která se provede při prvním použití objektu (metoda __init__). Například při přiřazení čísla proměnné x se vytváří objekt x typu int() a jeho inicializační část provede přiřazení hodnoty. Proto nemůžeme použít proměnnou dřív než jí přiřadíme nějakou hodnotu. Objekt x potom obsahuje metody jako __abs__, __float__, __div__, ... Metody, které jsou uzavřeny mezi dvě dvojice podtržítek, jsou takzvané interní metody objektu. Tyto metody bychom neměli používat přímo. Jejich využití si ukážeme později. Jako další příklad uvedeme datový typ seznam. Tento typ má jak interní metody, tak metody veřejné. Jsou to nám známé metody append, count, index, ...

Interní metody jsou metody, které používá samotný objekt, aniž bychom o tom věděli. Některé interní metody ale používáme i my. Jsou to například metody __abs__, __str__, __len__. Pokud existuje funkce stejného jména (abs(), str(), len()), tak ji můžeme použít na jakýkoli objekt který obsahuje korespondující metodu. Proto můžeme ve své vlastní objektové třídě vytvořit tyto interní metody a naše třída bude spolupracovat se zabudovanými funkcemi Pythonu.

Definice třídy

Objektovou třídu definujeme pomocí příkazu class. V příkladu vytvořím třídy pro geometrické útvary trojúhelník, čtverec, kruh. Slovo self charakterizuje samotný objekt. Objekt musí být předáván každé metodě a musí stát jako první parametr. Při používání metody slovo self neužíváme.
class trojuhelnik:
	"""Utvar trojuhelnik"""
	def __init__(self, a=0, b=0, c=0):
		self.__strany__=list[3]
		self.__strany__[0]=a
		self.__strany__[1]=b
		self.__strany__[2]=c
	def obvod(self):
		O=self.__strany__[0]+self.__strany__[1]+self.__strany__[2]
		return O
	def obsah(self):
		s=self.obvod()/2.0
		S=(s*(s-a)*(s-b)*(s-c))**(0.5)
		return S


class ctverec:
	"""Utvar ctverec"""
	def __init__(self, a=0):
		self.__strana__=a
	def obvod(self):
		return 4*self.__strana__
	def obsah(self):
		return self.__strana__**2


class kruh:
	"""Utvar kruh"""
	def __init__(self, r=0):
		self.__r__=r
		self.__pi__=float(3.14159265)
	def obvod(self):
		return 2*self.__pi__*self.__r__
	def obsah(self):
		return self.__pi__*(self.__r__**2)  
Použití v interpretu je následující:
>>> t=trojuhelnik()	# parametry muzeme vynechat, potom se dosadi implicitni hodnoty
>>> c=ctverec(4)
>>> k=kruh(2)


>>> print t.obvod()
0
>>> print c.obsah()
16
>>> t=trojuhelnik(3,4,5)


>>> for i in [t, c, k]:				# jednotlive objekty priradime promenne i
...	print "Obsah utvaru je: ", i.obsah()	# vyvolame metodu obsah() pro konkretni objekt
...
Obsah utvaru je: 6.0
Obsah utvaru je: 16
Obsah utvaru je: 12.5663  
Tato kapitola je opravdu jen ukázkou použití objektů v jazyce Python. Pro další studium doporučuji referenci jazyka Python, nebo tutoriál Létající cirkus od Jana Švece. O OOP programování existuje řada publikací, pro vážnější zájemce bude velmi vhodné si nějakou knihu přečíst.
2006-11-30 | Jasco
Reklamy:
„Vždy odpouštějme svým nepřátelům, nic je nedokáže víc rozzuřit.“ Oscar Wilde