Hlavní navigace

Létající cirkus

20. 12. 2001
Doba čtení: 7 minut

Sdílet

Téměř každý programátor vyzkoušel za svůj život vícero programovacích jazyků. A také téměř každý si vysnil svůj ideální. Jednoduchý, robustní, hezký, přenositelný. A poněvadž se v poslední době čím dál více mluví a píše o jazyku, který tyto představy více než naplňuje, podíváme se na něj v našem seriálu. Dámy a pánové, přichází pan Python...

Jazyk Python začal vznikat v roce 1989 ve výzkumném ústavu v Amsterodamu. Při jeho zrodu stál Guido van Rossum a je vidět, že u návrhu dostatečně přemýšlel. Vznikl promyšlený jazyk, který je stále ve vývoji. Jméno dostal podle pořadu BBC Monty Python's Flying circus. V současné době běží na mnoha platformách (Linux, Win, Mac, WinCE, OS2, Java). Stejně tak programy v něm napsané lze na těchto systémech téměř vždy spouštět bez úprav.

A jaký Python vlastně je? Čistý objektový jazyk se správou výjimek, kompilací do bytecodu, mnoha vysokoúrovňovými typy (řetězce, seznam, asociativní pole), plně podporující Unicode, lze jej doplnit o vlastní vestavěné typy a funkce pomocí C/C++, nebo naopak lze interpret začlenit do programu v jiném jazyce. Základní balík obsahuje velké množství modulů, které lze ihned používat ve vašem programu. Jmenujme moduly pro přístup k databázím, GUI, službám operačního systému, HTTP, FTP, POP3, SMTP a mnohým jiným protokolům. Samozřejmostí jsou regulární výrazy. Definuje také několik modulů pro přístup k vnitřním mechanismům Pythonu (garbage collector, parser, kompiler). V Pythonu je taktéž napsán debugger a profiler tohoto jazyka. Slibuji, že v některém z příštích dílů se na ně také podíváme.

Domovskou stránkou Pythonu je www.python.org; najdete zde velké množství dokumentace, zdrojové tarbally i předkompilované balíky pro různé systémy. Aktuální verze je 2.2 (přesněji řečeno existuje momentálně release candidate pro verzi 2.2, vydání finální verze je očekáváno každým dnem – pozn. redakce), která obsahuje množství změn oproti starším verzím, zmiňme jen možnost dědit od vestavěných typů. Pro pochopení základů Pythonu budou stačit i starší verze (1.5.2 nebo 2.0), které jsou ponejvíce obsaženy v nejnovějších distribucích.

Nyní, pokud již máme všechny balíčky nainstalované, si poprvé spustíme interaktivní interpret Pythonu. Na příkazové řádce stačí zadat příkaz python (za předpokladu, že ho máte v cestě) a okamžitě se nám objeví výzva příkazového řádku „>>>“. Python zná ještě sekundární výzvu „…“, kterou používá při zadávání složených konstrukcí. Python ihned vyhodnocuje zadávané výrazy, pouze v případě, že jde o složenou konstrukci, vyčká až na její ukončení. Interpret ukončíme kombinací Ctrl-D nebo zadáme:

>>> import sys
>>> sys.exit()

Komenáře začínají vždy znakem #. Stejně jako v jiných interpretovaných jazycích lze na začátek souboru s kódem programu uvést magickou sekvenci „#! /usr/bin/en­v python“ a v případě, že soubor má nastaven executable bit a ve vaší cestě se nachází příkaz python, spustí se tento soubor stejně jako jakýkoli skript. Zavedenou konvencí jsou zdrojové soubory Pythonu s příponou „.py“. Po spuštění zdrojového kódu ze souboru Python transparentně zkompiluje celý soubor na bytecode, který uloží do souboru s příponou „.pyc“. Ten je použit pro urychlení příštího startu programu, odpadá parsování a kompilace. Jestliže soubor „.pyc“ svým obsahem neodpovídá souboru „.py“, je ignorován a vytvořen znovu. Soubory „.pyc“ je možné spouštět samostatně, tj. je možné vyvíjet i closed-source programy :( Používají se ještě soubory s příponou „.pyo“, ve kterých je uložen optimalizovaný bytecode. V současných verzích se ale žádných velkých optimalizací nedočkáte, jsou pouze vynechány některé ladicí informace.

Čísla jsou chléb programátora. Python rozlišuje mezi čísly celými (integer a long integer), reálnými a imaginárními:

>>> num1 = 123                                 # (1)
>>> num2 = 123456789L                          # (2)
>>> num3 = 987.654                             # (3)
>>> num4 = 321j                                # (4)
>>> num5 = 1 + 3.1415j                         # (5)
>>> num6 = num7 = 0                            # (6)
>>> num1 += 10                                 # (7)

Řádek (1) ukazuje použití klasického 32bitového integeru. Skvělou věcí je dlouhý integer (long integer) na řádku (2), který se od klasického liší připojením písmena l (nebo L) za číslo. Jeho velikost je omezena pouze velikostí dostupné operační paměti. Zápis reálných čísel (3) je stejný jako v jazyce C. Imaginární číslo (4) rozlišuje písmeno j připojené za hodnotu čísla, komplexní číslo dostaneme sečtením reálného a imaginárního čísla podobně jako na řádku (5). Reálnou i imaginární složku komplexního čísla získáme zápisem „num5.real“ a „num5.imag“. Jak reálná, tak imaginární složka je reálného typu. Absolutní velikost komplexního čísla vrátí funkce „abs(num5)“.

Nabídka operátorů, jejich priorita a zápis jsou stejné jako v jazyce C. Chybí ale ternární operátor a operátory inkrementace a dekrementace. Operátor přiřazení je stejný jako v céčku a lze použít i vícenásobné přiřazení (6). Stejně tak se může používat spojení operátoru a přiřazení (7). Informace o operátorech, jejich prioritě apod. je možné najít v dokumentaci dodávané s Pythonem.

Při vyhodnocování aritmetických výrazů se hodnoty nejprve převedou na společný typ podle následujících pravidel:

  • Je-li některý z argumentů komplexní číslo, ostatní argumenty jsou zkonvertovány na komplexní čísla.
  • Je-li některý z argumentů reálné číslo, ostatní argumenty jsou zkonvertovány na reálná čísla.
  • Je-li některý z argumentů dlouhý integer, ostatní argumenty jsou zkonvertovány na dlouhé integery.
  • Jinak jsou všechny argumenty obyčejné integery a žadná konverze není třeba. Výsledek je stejného typu jako společný typ:
>>> 2 + 3.0                      # (1)
5.0
>>> 3 / 2                        # (2)
1
>>> 3.0 / 2                      # (3)
1.5
>>> y = 3 * 2                    # (4)
>>> _                            # (5)
1.5

Proč interpret zobrazil po zadání výrazu jeho výsledek? Není-li hodnota nějakého výrazu přiřazena proměnné, interaktivní interpret ji uloží do speciální proměnné _. Výsledek řádku (4) nebyl zobrazen, protože byl přiřazen proměnné y. Ze stejného důvodu zobrazí Python na řádku (5) hodnotu 1.5 místo 6. Pozor: proměnná _ se používá pouze v interaktivním procesoru. Spouští-li se skript ze souboru, není definována a její použití vede k chybě.

Všechny proměnné a atributy objektů v Pythonu jsou netypové, což znamená, že proměnným můžeme přiřadit různé typy. Ke zjištění typu proměnné je vyhrazena funkce type(), vracející typ argumentu, který jí byl předán. Proměnné se nedeklarují, k jejich vytvoření dojde tehdy, když je jim přiřazena hodnota. Použití nedefinované proměnné vede k chybě.

Řetězce v Pythonu je možné zapsat několika způsoby, přičemž lze použít jak jednoduché, tak dvojité uvozovky pro uvození řetězce. Nelze je ovšem kombinovat (viz řádek (8)):

>>> str1 = 'zluta'                           # (1)
>>> str2 = "cervena"                         # (2)
>>> str3 = '''modra                          # (3)
... a zelena'''                              # (4)
>>> str4 = 'znak noveho radku: \n'           # (5)
>>> str5 = r'toto jsou dva znaky: \n'        # (6)
>>> str6 = u'Unicodovy\u0020retezec'         # (7)
>>> str7 = 'chybny zapis"                    # (8)

Řádky (1) a (2) jsou podobné jako v jiných jazycích. Na řádku (3) je vidět víceřádkový řetězec. Všimněte si, že jsou do něho zahrnut i znaky „# (3)“. Víceřádkový řetězec začíná ''' (nebo """) a pokračuje, dokud není ukončen dalšími třemi uvozovkami. Proto také interpret zobrazil sekundární prompt na řádku (4). V Pythonu lze podobně jako v C užívat speciální znaky v podobě \n, \t atd. (5). Pro vložení bytu lze použít sekvence \000, kde místo 000 je index znaku v ASCII tabulce v osmičkové soustavě a podobně zápis v šestnáctkové soustavě vypadá takto: \x00. Výjimkou jsou raw řetězce uvozené písmenem r (nebo R) (řádek (6)), v nichž se ruší význam escape znaků a řetězec je uložen stejně, jako byl zapsán. Na řádku (7) je vidět příklad unicodových řetězců. Ty jsou uvozeny písmenem u (nebo také U). Protože unicode používá 16bitové kódování, je tu pro zadání 16bitového znaku sekvence \u0000. Unicodové řetězce také mohou být zapsány jako raw. Podobně víceřádkové řetězce můžou být také raw a unicode. V Pythonu neexistuje zvláštní typ char, jeden znak je prostě řetězec o délce 1. Délku řetězce (počet znaků) zjistíme pomocí funkce „len()“, které jako argument předáme řetězec.

Řetězce v Pythonu lze spojovat použitím operátoru „+“. Jsou-li dva řetězce umístěny hned za sebou, dojde k jejich spojení. Podobně jako v shellu, i zde je možné rozdělit jeden dlouhý řádek za použití zpětného lomítka:

>>> 'Linux: ' + 'try' ' or ' 'die'
'Linux: try or die'
>>> 'Dobry ' \
... 'den'
'Dobry den'

Nováčky v tomto jazyce si ihned získá možnost vynásobit řetězec celým číslem n. Výsledkem je původní řetězec nakopírovaný n-krát za sebe. Trošku předběhnu, celým číslem lze vynásobit jakýkoli sekvenční typ (tuple, seznam), více ale v dalším dílu našeho seriálu.

>>> 'trikrat ' * 3
'trikrat trikrat trikrat '

Další velice používanou konstrukcí je print. Ta postupně vyhodnotí všechny výrazy, které jsou za ní zapsány, oddělené čárkou, poté je převede na řetězce a nakonec vypíšen na standardní výstup. Je-li za posledním výrazem umístěna čárka, nedojde k vložení znaku nového řadku.

>>> print 'soucet 2 + 3 je:', 2 + 3
'soucet 2 + 3 je: 5'

Jak vlastně dojde k převedení výrazu na řetězec? V Pythonu je pro tyto účely určena funkce „str()“, která vrátí svůj argument převedený na řetězec. Další možností je uzavřít výraz mezi obrácené apostrofy:

>>> print 'toto je retezec: Ahoj a toto je cislo: ' + 2 + 5 toto je retezec: Ahoj a toto je cislo: 7

root_podpora

Pozor: Použití str() a `` není ekvivalentní. K rozdílu dojde, je-li argument řetězec. Zatímco str() ho vrátí beze změny, `` ho „obloží“ uvozovkami.

Příště se podíváme na složitější typy: tuple, seznam, asociativní pole, vysvětlíme si slice konstrukce a možná si povíme něco o definování funkcí.

Byl pro vás článek přínosný?