| Obě strany předchozí revize Předchozí verze |  | 
| programování:python [2013/04/05 18:01]  –  188.120.195.244 | programování:python [2019/02/25 17:21] (aktuální)  – upraveno mimo DokuWiki 127.0.0.1 | 
|---|
|  | ====== Python ====== | 
|  |  | 
|  |  | 
|  | {{.:linpython1.png}} {{.:python-logo.jpg}} | 
|  |  | 
|  | Stručné info pro zájemce o programování ve skriptovacím jazyce Python. | 
|  |  | 
|  | ===== Proč Python? ===== | 
|  | Protože je intuitivní a překvapivě jednoduchý k psaní kódu. | 
|  |  | 
|  | Protože je vstřícný pro porozumění a přitom dostatečně bohatý pro řešení mnoha úkolů. | 
|  |  | 
|  | Protože může pracovat jako interpret i compiler. | 
|  |  | 
|  | Protože je to už svou podstatou objektový jazyk. | 
|  |  | 
|  | Protože umí pracovat s mnoha vysokoúrovňovými typy (řetězce, seznamy, asociativní pole, množiny). | 
|  |  | 
|  | Protože má základnu k vyhledání řešení problémů na českém internetu. | 
|  |  | 
|  | A nakonec je nutno k jeho kladům přičíst přenositelnost mezi Lin, Win, MAC, OS2, WinCE platformami. | 
|  |  | 
|  | ===== Instalace jazyka Python ===== | 
|  | {{.:apt.png}} **Python** je implicitně dodáván s distribucí Ubuntu takže není třeba jej instalovat. | 
|  |  | 
|  | ===== Spuštění ===== | 
|  | {{.:navigate.png}} V terminálu zadejte jméno jazyka  [[:Terminál|příkazem]] ''python''. Obdržíte kupříkladu takovouto odpověď: | 
|  | <code> | 
|  | Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) | 
|  | [GCC 4.5.2] on linux2 | 
|  | Type "help", "copyright", "credits" or "license" for more information. | 
|  | >>> | 
|  | </code>Tři znaky ''>>>'' oznamují, že je interpret Python připraven vykonat zadávané příkazy. I když okno terminálu vypadá stejně jako předtím, vkládané příkazy bude zpracovávat Python, takže kupříkladu  ''ls'' či ''cd'' nyní fungovat nebude. K ukončení Pythonu a návratu řízení zpět terminálu poslouží ''Ctrl+D'' či příkaz | 
|  | <code> | 
|  | >>> quit() | 
|  | </code> | 
|  | ===== První krůčky ===== | 
|  | Světoznámé úvodní zvolání v Pythonu může mít takovýto tvar: | 
|  | <code> | 
|  | >>> print  "Hello, World!" | 
|  | </code>Po stisku klávesy ''Enter'' se příkaz provede a program odpoví vypsáním **Hello, World!**. Není-li specifikováno jinak, slouží jako standardní výstup okénko terminálu. | 
|  |  | 
|  | **Program** aneb posloupnost více příkazů lze zapsat libovolným textovým editorem ve formě prostého textu a uložit do souboru. Textové editory mívají podporu Pythonovské syntaxe, což činí psaní zdrojového kódu výrazně pohodlnější. I když to není povinné, bývá zvykem značit si jej příponou **.py**. Spuštění takového programu lze docílit prostým napsáním jména programu do příkazové řádky, kupříkladu | 
|  | <code> | 
|  | >>> MujPrvniPokus.py | 
|  | </code>Program je možno spustit i z terminálu zavoláním interpretu Python s parametrem jména programu, např. [[:Terminál|příkazem]] | 
|  | <code> | 
|  | Python MujPrvniPokus.py | 
|  | </code>Pokud se nedaří, možná chybí specifikace cesty k programu. V takovém případě lze buď přejít do složky s programem pomocí příkazu ''cd'' nebo připsat cestu před jméno programu. Má-li uživatel jménem //uzivatel// program umístěn v adresáři //programy//, příkaz bude ''python /home/uzivatel/programy/MujPrvniPokus.py''. | 
|  |  | 
|  |  | 
|  | ===== Něco se nepovedlo ===== | 
|  | {{.:root.png}} Může se stát že program přestane odpovídat a neustále pracuje. K tomu může dojít kupříkladu díky chybě v programu jež způsobí běh v nekonečné smyčce, takzvané zacyklení. | 
|  | <code> | 
|  | >>> while true: true | 
|  | </code>Tento ukázkově chybný příkaz bude mít za následek vypsání ''...'' a program se dostane do nekonečné smyčky.  Obvykle by mělo fungovat ''Ctrl+c'', ale může se stát že program nebude reagovat. Jak z toho ven? Stisk ''Ctrl+z'' program pozastaví, řízení se předá zpět příkazové konzoli a objeví se hlášení: | 
|  | <code> | 
|  | >>> while true: true | 
|  | ... | 
|  | [1]+  Pozastaven       python | 
|  | </code>Číslo v hranaté závorce je číslem procesu. Obvyklým příkazem ''kill -9 %N'' lze daný program násilně ukončit. Za N nutno dosadit číslo ze závorky, v daném příkladu to bylo číslo 1. | 
|  |  | 
|  | ===== Malý ukázkový program ===== | 
|  | <code> | 
|  | #ukazkovy program - prumer cisel | 
|  | #jak vidno, radky zacinajici znakem "#" jsou programatorske poznamky. | 
|  | #Pro samotny interpreter Pythonu nemaji zadny vyznam, | 
|  | #presto zvlaste v rozsahlejsich programech maji sve dulezite misto | 
|  | #nebot zvysuji pochopitelnost kodu. V tomto pripade je poznamek opravdu hodne, | 
|  | #nebot jde o pokus osvetlit cely programek krok za krokem. | 
|  |  | 
|  | import string #pripoji k programu preddefinovanou knihovnu string, | 
|  | #ktera se hodi pro urceni typu obsahu promenne vstup | 
|  |  | 
|  | #inicializace promennych, kupr. promenna soucet bude celociselny typ s vychozi hodnotou nula | 
|  | soucet=0 | 
|  | vkladu=0 | 
|  | vstup="1" #promenna vstup bude typu znaku - pro pripad ze by uzivatel vlozil chybne zadani | 
|  |  | 
|  | """ (aneb viceradkovy komentar) | 
|  | Strukturovani Pythonu je excelentne jednoduche - zadne zavorkove silenstvi... | 
|  | ridi se prostym odsazovanim mezerami nebo tabulatory zleva | 
|  | coz samosebou znamena, ze kod jazyku Python musi byt psan zodpovedne od zacatku. | 
|  | Je jedno zda se zvoli mezery ci tabelatory, ale v prubehu programu uz | 
|  | nelze metodu odsazeni menit. | 
|  | Zde vypada kod programu sedive a nehezky, ale textove editory prostredi Ubuntu | 
|  | dokazi zobrazovat kod hezky barevne odliseny a tudiz mnohem prehlednejsi. | 
|  | """ | 
|  |  | 
|  | #pocatek smycky while (dělej dokud); prikazy se budou opakovat tak dlouho dokud v promenne vstup | 
|  | #nebude znak "0". Vyraz != zamena neni rovno. | 
|  | while vstup != "0": | 
|  | #vlozeni hodnoty z klavesnice do promenne vstup | 
|  | vstup = raw_input ("Vloz nejake cele cislo, 0 vkladani ukonci: ") | 
|  | #nasleduje test zda uzivatel vlozil skutecne cislo | 
|  | #zde se pouziva preddefinovana funkce isdigit z importovane knihovny string | 
|  | if  not (str.isdigit(vstup)): | 
|  | #pokud v promenne vstup neni korektni numericky obsah, vypise se upozorneni | 
|  | print "Ocekavam cele cislo, zkus to znovu." | 
|  | else: #a pokud je v promenne vstup vlozeno korektni cislo, tak program pokracuje zde | 
|  | if vstup != "0": #jen v pripade ze nebyla vlozena ukoncujici nula | 
|  | soucet = soucet + int(vstup) #program spocita to co chceme | 
|  | vkladu = vkladu + 1#a v teto promenne se uchovava pocet spravne vlozenych cisel | 
|  |  | 
|  | #mezera nad touto radkou rika interpreteru, ze zde konci smycka while | 
|  | #pro spocteni desetinneho vysledku z integer hodnot, lze pouzit funkci pretypovani | 
|  | #integer na float, tedy celociselne promenne na promennou s pohyblivou desetinnou carkou | 
|  | prumer=soucet/float(vkladu) | 
|  | #zbyva vypsat vysledky | 
|  | print "Vlozeno bylo ",vkladu," hodnot, soucet je ",soucet,", prumer je ",prumer,"." | 
|  | </code>Samotný kód programu (v tomto případě v editoru KrViewer) vypadá mnohem střízlivěji a přehledněji: | 
|  | {{.:ukazka1.jpg}} | 
|  |  | 
|  | ===== Jde to i lépe ===== | 
|  | Python samozřejmě umožňuje a podporuje tvorbu mnohem efektivnějšího a elegantnějšího kódu. Různé věci se v něm dají dělat zábavně prostě. Např. vypsání souboru. | 
|  | <code> | 
|  | print(open("priklad_souboru.txt").read()) | 
|  | </code> | 
|  | Je-li třeba vypsat soubor po řádcích, stačí malá úprava. | 
|  | <code> | 
|  | for radek in open("priklad_souboru.txt"): | 
|  | print radek | 
|  | </code>anebo | 
|  | <code> | 
|  | print(open("priklad_souboru.txt").readlines()) | 
|  | </code> | 
|  | Výše uvedený zdlouhavě rozepsaný prográmek lze kupříkladu zjednodušit do pouhých dvou řádků: | 
|  | <code> | 
|  | pole=map(float, raw_input("Vloz cisla oddelena mezerou <Enter>").split()) | 
|  | print "Vlozeno:",len(pole),"hodnot, soucet je",sum(pole), ", prumer je",sum(pole)/len(pole),"." | 
|  | </code> | 
|  | O efektivnosti tvorby v Pythonu je možno se přesvědčit např. v ukázce která díky využití různých užitečných schopností Pythonu najde všechna prvočísla v rozmezí od 2 do daného čísla (ono populární Eratosthenovo síto). | 
|  | <code> | 
|  | nums = range(2, 2000) | 
|  | for i in range(2, 8): | 
|  | nums = filter(lambda x: x == i or x % i, nums) | 
|  | print nums | 
|  | </code>Python je dobře vybaven na boj s vysokou aritmetikou - typ ''integer'' v něm má přesnost která je omezena pouze pamětí počítače. Příkaz | 
|  | <code> | 
|  | from math import factorial;print(factorial(70)*113) | 
|  | </code>vrátí výsledek spočítaný na plný počet platných řádů, v tomto případě 103 míst. Pro práci v plovoucí desetinné čárce s libovolnou přeností slouží modul Decimal. | 
|  |  | 
|  | Ačkoliv při tvorbě kódu není programátor tlačen k používání tříd, Python plně podporuje objektově orientované programování. Dalo by se říci, že je svou podstatou dovedeno k nejvyšší jednoduchosti. | 
|  | <code> | 
|  | class MojeTrida: | 
|  | def CoJsi(self): | 
|  | print("Já jsem MojeTrida") | 
|  | </code>I takto průzračná deklarace třídy Pythonu postačí, dokonce ani parametr se nemusí nezbytně nutně jmenovat ''self''. | 
|  |  | 
|  | Podporu Pythonu poskytuje velké množství knihoven - knihovny grafických rozhraní, přístupu k databázím, zpracování grafů, neuronových sítí, kryptografie, ke službám operačního systému, GUI, HTTP, FTP, POP3, SMTP a jiným protokolům. Pro nebojsy je připraven např. modul regulárních výrazů či multithreadingu. Určeno je i několik modulů pro přístup k vnitřním mechanismům Pythonu (garbage collector, parser, kompiler). Mnoho knihoven je obsaženo již v implicitní instalaci jazyka, další se dají snadno instalovat přímo z repozitářů pomocí ''Synapticu'', anebo získat z různých internetových zdrojů. | 
|  |  | 
|  | {{.:tip.png}}  Ve výchozím stavu Python nepodporuje české kódování. Naštěstí se dá snadno přemluvit - na začátek programu stačí uvést druh kódování (v tomto případě UTF-8). | 
|  | <code> | 
|  | # -*- coding: utf-8 -*- | 
|  | </code>Práci s Unicode Python samozřejmě podporuje. U verzí 2.x k tomu slouží označení **u** | 
|  | <code> | 
|  | >>> type("žšč");type(u"žšč") | 
|  | <type 'str'> | 
|  | <type 'unicode'> | 
|  | </code>Python 3.x již prefix **u** nevyžaduje. | 
|  |  | 
|  | ===== Zvláštnosti hroznýše ===== | 
|  | {{.:info.png}} Python má - řekněme si otevřeně - i svá jistá specifika, jejichž znalost bude pro začátečníka nepochybně velmi užitečná. | 
|  | Některé postřehy: | 
|  | ==== Dělení nefunguje! ==== | 
|  | <code> | 
|  | >>> a=5; b=2; print a/b | 
|  | 2 | 
|  | </code>No toto...! Důvod je však prostý. Python2.x podporuje nativně celočíselnou aritmetiku. Pro získání správného výsledku je potřeba použít buď funkce float(), nebo jednomu z argumentů prostě připsat desetinnou čárku: | 
|  | <code> | 
|  | >>> a=5; b=2.0; print a/b | 
|  | 2.5 | 
|  | </code>Python 3.x již tuto otázku má vyřešenou, běžné dělení funguje "lidsky". | 
|  | ==== Nedopočítává to cykly! ==== | 
|  | <code> | 
|  | >>> for i in range(1,4): print i, | 
|  | 1 2 3 | 
|  | </code>Kde je čtyřka? Inu, Python bere rozsah (a,b) ve smyslu matematického zápisu <a,b), tedy pro hodnoty i: a<=i<b. Pokud není nezbytně potřeba přesně daný rozsah hodnot, je výhodnější použít cykl ve formě např. | 
|  | <code> | 
|  | >>> for i in range(4):print i, | 
|  | 0 1 2 3 | 
|  | </code>==== Mění to něco jiného než chci! ==== | 
|  | Mějme případ kdy  seznam **sez1** obsahuje jediné písmeno. A protože chceme tento seznam zachovat, uděláme si prostým přiřazením jeho kopii do seznamu **sez2**, se kterým pak budeme pracovat v domnění, že původní obsah **sez1** zůstane nezměněn: | 
|  | <code> | 
|  | >>> sez1=["a"];sez2=sez1;sez2.append("b");print sez1,sez2 | 
|  | ['a', 'b'] ['a', 'b'] | 
|  | </code>Jakto že se změnil i sez1? Je to tím že názvy proměnných ukazují na datový obsah, a ten je v případě přiřazení nezměněn; tudíž ''sez2=sez1'' vytvoří odkaz jménem sez2 na ten samý datový objekt. Netřeba zde bádat a rozebírat nakolik je to logické či ne, stačí vědět jak se tomu vyhnout. | 
|  | <code> | 
|  | >>> sez1=["a"];sez2=[]+sez1;sez2.append("b");print sez1,sez2 | 
|  | ['a'] ['a', 'b'] | 
|  | </code>Kopii objektu lze vytvořit též pomocí modulu **Copy** | 
|  | <code> | 
|  | >>>from copy import copy | 
|  | >>> sez1=["a"];sez2=copy(sez1);sez2.append("b");print sez1,sez2 | 
|  | ['a'] ['a', 'b'] | 
|  | </code> | 
|  | ===== Odkazy ===== | 
|  | * [[http://www.python.org]] domovská stránka Pythonu | 
|  | * [[http://howto.py.cz]] opravdu skvělé české stránky pro každého začátečníka | 
|  | * [[http://www.linuxsoft.cz/article_list.php?id_kategory=217]] jiné hezké stránky pro začínající Pythonýry | 
|  | * [[http://k-prog.wz.cz/python/tkinter1.php]] nenásilný úvod do grafického rozhraní Tkinter | 
|  | * [[http://www.openbookproject.net/pybiblio/gasp/course/G-gasp.html]] stránky o grafickém rozhraní GASP | 
|  | * [[http://programujte.com/?akce=diskuze&kam=diskuze&sekce=40-python]] diskuzní fórum o otázkách kolem programování v Pythonu | 
|  | * [[http://python.wraith.cz/uvod-vykon.php]] velmi zajímavé stránky o modulu, který dovede v některých případech zmnohonásobit rychlost Pythonu |