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)