V sobotu 2. listopadu proběhla mohutná oslava naší plnoletosti !!
Multimediaexpo.cz je již 18 let na českém internetu !!

Python

Z Multimediaexpo.cz

Verze z 10. 12. 2015, 11:07; Sysop (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Logo jazyka Python

Python je dynamický objektově orientovaný programovací jazyk, který v roce 1991[1] navrhl Guido van Rossum. Python je vyvíjen jako open source projekt, který zdarma nabízí instalační balíky pro většinu běžných platforem (UnixWindowsMac OS); ve většině distribucí systému Linux je Python součástí základní instalace.

Mimo jiné je v něm implementován aplikační server Zope, instalátor a většina konfiguračních nástrojů Linuxové distribuce firmy Red Hat.

Obsah

Vlastnosti

Python je dynamický interpretovaný jazyk. Někdy bývá zařazován mezi takzvané skriptovací jazyky. Jeho možnosti jsou ale větší. Python byl navržen tak, aby umožňoval tvorbu rozsáhlých, plnohodnotných aplikací (včetně grafického uživatelského rozhraní — viz například wxPython, který využívá wxWidgets).

Python je hybridní jazyk (nebo také víceparadigmatický), to znamená, že umožňuje při psaní programů používat nejen objektově orientované paradigma, ale i procedurální a v omezené míře i funkcionální, podle toho komu co vyhovuje nebo se pro danou úlohu hodí nejlépe. Python má díky tomu vynikající vyjadřovací schopnosti. Kód programu je ve srovnání s jinými jazyky krátký a dobře čitelný.

K význačným vlastnostem jazyka Python patří jeho jednoduchost z hlediska učení. Bývá dokonce považován za jeden z nejvhodnějších programovacích jazyků pro začátečníky. Tato skutečnost je dána tím, že jedním z jeho silných inspiračních zdrojů byl programovací jazyk ABC, který byl jako jazyk pro výuku a pro použití začátečníky přímo vytvořen. Python ale současně bourá zažitou představu, že jazyk vhodný pro výuku není vhodný pro praxi a naopak. Podstatnou měrou k tomu přispívá čistota a jednoduchost syntaxe, na kterou se při vývoji jazyka hodně dbá.

Význačnou vlastností jazyka Python je produktivnost z hlediska rychlosti psaní programů. Týká se to jak nejjednodušších programů, tak aplikací velmi rozsáhlých. U jednoduchých programů se tato vlastnost projevuje především stručností zápisu. U velkých aplikací je produktivnost podpořena rysy, které se používají při programování ve velkém, jako jsou například přirozená podpora jmenných prostorů, používání výjimek, standardně dodávané prostředky pro psaní testů (unit testing) a dalšími. S vysokou produktivností souvisí dostupnost a snadná použitelnost široké škály knihovních modulů, umožňujících snadné řešení úloh z řady oblastí.

Python se snadno vkládá do jiných aplikací (embedding), kde pak slouží jako jejich skriptovací jazyk. Tím lze aplikacím psaným v kompilovaných programovacích jazycích dodávat chybějící pružnost. Jiné aplikace nebo aplikační knihovny mohou naopak implementovat rozhraní, které umožní jejich použití v roli pythonovského modulu. Jinými slovy, pythonovský program je může využívat jako modul dostupný přímo z jazyka Python (tj. extending, viz sekce Spolupráce s jinými aplikacemi).

Programování v Pythonu klade velký důraz na produktivitu práce programátora. Myšlenky návrhu jazyka jsou shrnuty ve filosofii Pythonu.

Spolupráce s jinými programovacími jazyky

C a C++

Klasický Python je implementován v jazyce C (označuje se někdy jako CPython). V něm probíhá další vývoj jazyka Python. Verze jazyka Python jsou zveřejňovány jak v podobě zdrojového kódu, tak v podobě přeložených instalačních balíků pro různé cílové platformy.

Dostupnost zdrojového kódu a vlastnosti jazyka C umožňují zabudovat interpret jazyka Python do jiné aplikace psané v jazycích C nebo C++. Takto zabudovaný interpret jazyka Python pak představuje nástroj pro pružné rozšiřování funkčnosti výsledné aplikace zvenčí. Existuje i projekt pro užší spolupráci s C++ nazvaný Boost.Python

Z těchto důvodů — a s přihlédnutím k obecně vysokému výkonu aplikací psaných v jazyce C — je CPython nejpoužívanější implementací jazyka Python.

Java

Existuje implementace Pythonu v jazyce Java, která se jmenuje Jython. Kód napsaný v Jythonu běží v JVM Javy a může používat všechny knihovny prostředí Java. V Javě lze naopak používat všechny knihovny napsané v Jythonu.

Implementace Jython zaostává za implementací CPython. Řada význačných vlastností jazyka Python se však objevuje již ve verzi Python 2.2 a stabilní verze Jython 2.2.1 byla uvolněna v roce 2007. Při používání Jython z javovských aplikací navíc nemusí být otázka nedostupnosti novějších rysů tak palčivá. 31. října 2008 byla uvolněna beta verze Jython 2.5b0. Po vypuštění stabilní verze tedy i Jython dosáhne vlastností dosud nejpoužívanějších verzí jazyka Python.

Prostředí .NET/Mono

Pracuje se na implementaci Pythonu pro prostředí .NET/Mono. Ta je známa pod jménem IronPython.

Za výhody lze považovat to, že se Python tímto stává jedním z jazyků pro platformu .NET. To současně znamená, že jej lze přímo využívat ve všech jazycích platformy .NET. Vzhledem k významu, jaký platformě .NET přikládá firma Microsoft, lze očekávat, že význam implementace IronPython dále poroste. Vzhledem k vlastnostem jazyka Python lze také předpokládat, že se implementace IronPython stane dlouhodobě podporovanou.

Verze IronPython 2.0 funkčně odpovídá Python 2.5, čímž dosahuje všech podstatných rysů jazyka. (Verze Python 2.6 má pomoci k přechodu mezi Python 2.5 a Python 3.0. (Python 3.0 realizuje větší změny). Negativně může být vnímána skutečnost, že implementace IronPython je vyvíjena firmou Microsoft pod Microsoft Public License.

Výkon

Výkon aplikací napsaných v Pythonu je dobrý, protože výkonově kritické knihovny jsou implementovány v jazyce C, s kterým Python výborně spolupracuje. I samotný jazyk je na tom v porovnání s jinými interpretovanými jazyky dobře. Je např. 3 až 5 krát rychlejší než PHP. Pro Python navíc existuje snadno použitelná knihovna Psyco, která transparentně optimalizuje kód Pythonu na výkon. Některé operace jsou pomocí Psyco urychleny až řádově[2].

Spolupráce s jinými aplikacemi

Jak již bylo řečeno, Python se snadno vkládá do jiných aplikací, kde pak slouží jako jejich skriptovací jazyk. Lze ho najít např. v 3D programu Blender,v počítačové hře Civilizace IV, v kancelářském balíku OpenOffice.org, v textovém editoru Vim. Lze jej alternativně použít jako skriptovací jazyk aplikace GIMP, existují pythonovská aplikační rozhraní pro celou řadu dalších projektů — například pro ImageMagick. Varianta Jython (implementace Pythonu v Javě — viz dále) jej umožňuje používat jako skriptovací jazyk všude tam, kde lze používat skripty v Javě — například v editoru jEdit.

Příklady

Ukázkový program Hello world vypadá velmi jednoduše:

print "Hello, World!"

Program pro výpočet obsahu kruhu ze zadaného poloměru by mohl vypadat například takto:

# toto je komentář a interpret jej ignoruje
 
import math         # zpřístupní modul s matematickými funkcemi a konstantami (sin, cos, pi atp.)
 
vstup = raw_input("Zadejte polomer: ") # zobrazí výzvu a načte nějaký řetězec
r = float(vstup)                       # převede řetězec na desetiné číslo
S = r**2 * math.pi                     # umocní r na 2 a vynásobí jej pí
print "Výsledek je:", S                # zobrazí výsledek

Výpočet faktoriálu v porovnání s jazykem C:

Program v jazyce Python Odpovídající program v jazyce C
def factorial(x):
    if x <= 0:
        return 1
    else:
        return x * factorial(x - 1)
 
def factorial_kratsi(x):
    return 1 if x <= 0 else x * factorial_kratsi(x - 1)
 
int factorial(int x) {
    if (x <= 0)
        return 1;
    else
        return x * factorial(x - 1);
}
 
int factorial_kratsi(int x) {
    return x <= 0 ? 1 : x * factorial_kratsi(x - 1);
}
 

Charakteristika a použití jazyka

Proměnná je pojmenovaným odkazem na objekt

Každá proměnná se chápe jako pojmenovaný odkaz na objekt. Přesněji řečeno, jméno proměnné je svázáno s jinak bezejmenným objektem. Příkaz přiřazení nezajistí okopírování hodnoty navázaného objektu. Provede se pouze svázání nového jména s původním objektem.

a = [1, 2]
b = a

Jména a i b jsou nyní svázána se stejným objektem. Pokud objekt může být měněn, pak se změna provedená přes jméno b projeví i při následném přístupu přes jméno a. Příklad – zrušíme první prvek seznamu přes jméno b a zobrazíme obsah seznamu přes jméno a:

del b[0]
print a

Zobrazí se

 [2]

Funkce se uchovává jako objekt

Funkce se chová jako běžný objekt, dokud není zavolána.

def funkce():
    print 'Python'
 
f = funkce
p = [1, 2, 'test', f]
p[3]()

Lze s ní manipulovat, ukládat do proměnných, polí, objektů. Přesněji řečeno, manipuluje se s odkazem na objekt funkce. S objektem funkce je možné podle potřeby svázat i nové jméno, případně ji i kdykoliv předefinovat.

Do složených datových struktur se ukládají odkazy

Do složených datových struktur se ukládají odkazy na objekty, nikoliv objekty samotné. Typ objektu není vázán na odkaz, ale je svázán až s odkazovaným objektem. Z toho vyplývá, že například do jednoho seznamu je možné současně uložit odkazy na objekty libovolného typu:

a = [1, 2, 'pokus', u"UNICODE", ('a tak', u'dále...'), {'4':44, 5:55}]

Jinými slovy, z technického hlediska jsou odkazy všechny stejného typu (interního), který nemá žádný vztah k typu odkazovaného objektu. Technicky lze tedy seznam považovat za homogenní datový typ. Z uživatelského pohledu to vypadá, že do seznamu můžeme vkládat hodnoty různého typu. Ještě jednou — do seznamu se nevkládají hodnoty daných typů, ale jen beztypové odkazy na příslušné objekty.

Proměnné není nutné deklarovat

V jiných jazycích se při deklaraci proměnné uvádí souvislost jména proměnné s typem ukládané hodnoty. V jazyce Python je proměnná jen pojmenovaným odkazem na nějaký objekt. Typ objektu je ale vázán na odkazovaný objekt, nikoliv na jméno. Potřeba deklarace proměnné ve významu určení souvisejícího typu dat tedy odpadá.

Existence, či neexistence jména přímo nesouvisí s existencí či neexistencí hodnotového objektu. Význam deklarace proměnné ve smyslu popisu existence související hodnoty tedy rovněž odpadá. Proměnná, jako pojmenovaný odkaz, vzniká v okamžiku, kdy se jméno objeví na levé straně přiřazovacího příkazu. Jméno proměnné může být později svázáno dalším přiřazením s jiným objektem zcela jiného typu.

p = 1
p2 = ""
p3 = p # Kopie odkazu p

Členské proměnné tříd mohou vznikat až za běhu

Mezi běžné praktiky při vytváření objektu patří i založení používaných členských proměnných. Tento obrat se ale v jazyce Python chápe jako užitečná technika, nikoliv jako nutnost. Členské proměnné (čili proměnné uvnitř objektu) mohou vznikat až za běhu.

class pokus: pass #prázdná třída
 
obj = pokus()
obj.field1 = 33
obj.field2 = 'str'

Existují ale techniky, které umožňují prostředky jazyka zamezit možnost dodatečného přidávání členských proměnných.

Typy nelze libovolně míchat

Při operacích nad objekty se provádí silná typová kontrola. Na rozdíl od kompilovaných jazyků se ale provádí až za běhu aplikace.

Ortogonalita operátorů

Při vývoji jazyka se kladl a klade důraz na to, aby operátory nebyly vázány na specifické datové typy (pokud je to možné). Přípustnost použití operátoru pro konkrétní operandy se navíc vyhodnocuje až za běhu. Prakticky to znamená, že například následující funkci, která v těle používá operátor plus, je možné předat jednak číselné a jednak řetězcové argumenty:

def dohromady(a, b):
	return a + b
 
dohromady(2, 3)              # vrátí 5
dohromady("ahoj", ' nazdar') # vrátí 'ahoj nazdar'

Nejde jen o zajímavou hříčku. Běžné pythonovské funkce tím získávají vlastnosti, kterými se zabývá generické programování.

Interaktivní režim překladače

Interpret jazyka Python můžeme spustit v interaktivním režimu. Tento režim se používá především pro rychlé pokusy. Řádkový vstup je v takovém případě uvozen znaky >>>.

Je-li očekáván pokračovací řádek zápisu dosud nedokončené konstrukce, pak je vstupní řádek uvozen znaky .... Dokončení zápisu konstrukce vyjadřujeme v interaktivním režimu zadáním prázdného řádku.

>>> def f(c, n):
...     return c * n
... 
>>> f(a, 5)
15

V interaktivním režimu většinou nepoužíváme příkaz print (ale nic nám v tom nebrání). Pokud chceme zobrazit obsah proměnné, stačí za úvodní znaky zapsat její jméno.

>>> a = 1 + 2
>>> a
3

Proměnná _ obsahuje poslední takto použitou hodnotu.

>>> f('x', a)
'xxx'
>>> len(_)
3

Python 3.0

Python je vyvíjen s důrazem na pragmatičnost. To znamená, že vývoj jeho verzí je spíše evoluční. Přirozeným důsledkem takového přístupu je i zpětné hodnocení dobrých a horších vlastností jazyka. Jeho výsledkem byl projekt Python 3000 (Py3k)[3][4] jako základ vývoje přelomové verze Python 3.

Stabilní verze Python 3.0 byla vypuštěna v 3. prosince 2008. Je zpětně nekompatibilní. Přechodovou verzí mezi Python 2.x a Python 3.0 představuje Python 2.6 (varování při použití syntaxe, která nebude ve verzi 3.0 platná). Současně byly vyvinuty nástroje pro usnadnění konverze starších zdrojových textů do podoby pro verzi Python 3.0.

Jednou z nejviditelnějších změn v Python 3.0 (pragmatický pohled z hlediska prostého uživatele) je převedení příkazu print na funkci. Konstrukce print "hello" bude neplatná, správný zápis bude print("hello").

Velmi významnou změnou je důsledné oddělení abstrakcí řetězec a posloupnost bajtů. Řetězce se důsledně mění na typ unicode ("hruška" bude ekvivalentní s dnešní u"hruška"). Pro posloupnosti bajtů je zaveden nový typ bytes (immutable) a bytearray (mutable). Při vzájemném převodu mezi řetězcem a posloupností bajtů je nutné vždy uvádět požadované kódování. To by mělo vést k důslednému vyřešení problémů, které se projevovaly v souvislosti se znaky národních abeced.

Funkce raw_input bude přejmenována na input (současný input() zmizí), také iterativní varianty funkcí a metod nahradí svoje předchůdce, které vracely seznamy, takže například funkce range bude v podstatě dnešní xrange, analogicky tomu bude s file.readlines()/file.xreadlines(). Podobně další funkce, vracející list, budou vracet iterátor - např. dict.keys():

# python 2.x
>>> d = { 'a': 1, 'b': 7 }
>>> d.keys()
['a', 'b']
 
# python 3.x
>>> d.keys()
<dict_keys object at 0xb7c08540&>
>>> [ x for x in d.keys() ]  # nebo list(d.keys())
['a', 'b']

Další viditelnější změnou je chování operátoru dělení / při použití s celými čísly:

# python 2.x
>>> 5 / 2
2
>>> 5 / 2 == 5 // 2
True
 
# python 3.x
>>> 5 / 2
2.5
>>> 5 // 2
2

Zmizí dict.has_key(). Zápis množin se zjednoduší, set([1, 2]) bude možné napsat {1, 2}. Dále například přibyde řetězcům nová metoda format jako alternativa ke současnému formátování řetězců procentovou notací.

"ID: %s (%s, %s)" % ("0s9d8f", 0, 3)
# či
"ID: %(id)s (%(x)s, %(y)s)" % ('x': 0, 'y': 3, 'id': "0s9d8f")
 
# bude možné psát jako
 
"ID: {0} ({1}, {2})".format("0s9d8f", 0, 3)
# a
"ID: {id} ({x}, {y})".format(x=0, y=3, id="0s9d8f")

Dalším příkladem porušení zpětné kompatibility je zavedení nové syntaxe pro oktalová čísla. Ta se doposud zapisují s nulou na začátku, např. 0777. Tento formát se stane neplatným a nový bude analogický se zápisem hexadecimálních čísel (0x1ff). Správný zápis bude tedy 0o777. Podobně bude možné zapisovat i čísla v binární soustavě.

>>> 012
  File "<stdin>", line 1
    012
      ^
SyntaxError: invalid token
>>> 10 == 0xa == 0o12 == 0b1010
True

Podrobnější seznam změn najdete (anglicky) v dokumentu What’s New In Python 3.0.

Reference

  1. VAN ROSSUM, Guido. Python - zdrojové kódy. Python Foundation. http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY. [online]. [cit. 2010-04-12]. Dostupné online.  
  2. http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=all&lang=python&lang2=psyco
  3. http://www.artima.com/weblogs/viewpost.jsp?thread=208549
  4. http://www.python.org/dev/peps/pep-3000/

Externí odkazy


Flickr.com nabízí fotografie, obrázky a videa k tématu
Python