programování:python

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
programování:python [2012/08/01 19:30]
Ubuntu
programování:python [2019/02/25 18:21] (aktuální)
Řádek 1: Řádek 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
  • Poslední úprava: 2019/02/25 18:21
  • (upraveno mimo DokuWiki)