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í) – 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 |