Programování v Pythonu


1 ƒeské vysoké u ení technické v Praze FIT Programování v Pythonu Ji í Znamená ek P &iacu...
Author:  Miloš Matějka

0 downloads 1 Views 240KB Size

Recommend Documents


Programování v Pythonu
1 ƒeské vysoké u ení technické v Praze FIT Programování v Pythonu Ji í Znamená ek P &iacu...

Programování v Pythonu
1 ƒeské vysoké u ení technické v Praze FIT Programování v Pythonu Ji í Znamená ek P &iacu...

Programování v Pythonu
1 ƒeské vysoké u ení technické v Praze FIT Programování v Pythonu Ji í Znamená ek P &iacu...

C. Bor burgerraadslid v v v v v v J.B.M. Karens burgerraadslid v v v v v v. J. Loeve burgerraadslid v v v v v v
1 Besluitenlijst Oordeelsvormende bijeenkomst gemeenteraad Sliedrecht op dinsdag 14 april 2015 Aanwezig/woordvoering SGP-ChristenUnie M. Visser raadsl...

Manual. MultiPlus Compact V V V V V V
1 Manual CZ Appendix MultiPlus Compact V V V V V V2 3 1. BEZPEČNOSTNÍ POKYNY Obecné pokyny Než začnete produkt používat, seznamte...

V'^V':^-\ :;'-'':. -^V' V<>^' ^!::'^:>:;V ( ")
1 2 ~'\ >'-:-'/V'^V':^-\ :;'-'':. -^V' V^' ^!::'^:>:;V ( ")3 4 i5 ONZE KUNST DEEL XXIII6 Digitized by the Internet Archive in 2010 ...

A V v v v v V v. Tabel KarahertstlkModelyang Dltiembangkan Penelithn Tahp I
1 BAB I PENDAHULUAN2 BAB I PEITDAIIULUAN 1.1. Lahr Belakang fuar dapat beradaptasi dalam lingl$ngan persaingan yang semakin dinamis, p rusahaan pedu m...

V."- [' ".".1 >,' -' (t - V.''\ ("V"
1 [' ".".1 >,' -' V."- vn ("V" (t - V.''\2 24 BAB III Penqembangan Desa Pampang Sebagai Obyek Desa Wisata 3.1. Batasan Pen...

V EEEETTEEEELLTT V V LLEEEESS
1 Acht vleesveerassen gekeurd zonder gekr a NVM-formule staat 6 VEETEELTVLEES NOVEMBER OKTOBER2 akeel in en om de showring te Zwolle als een kleurrijk ...



ƒeské vysoké u£ení technické v Praze FIT

Programování v Pythonu Ji°í Znamená£ek

P°íprava studijního programu Informatika je podporována projektem nancovaným z Evropského sociálního fondu a rozpo£tu hlavního m¥sta Prahy. Praha & EU: Investujeme do va²í budoucnosti

Python (2011-03-24) : Moduly

1 of 9

Python – Moduly Úvod S moduly jsme se nejviditelněji už několikrát setkali v souvislosti s příkazem import: import math import sys.argv from pprint import pprint Tento slouží k zavedení jakýchsi „doplňkových“, do té doby nedostupných částí jazyka (knihoven, konstant, funkcí...), do aktuálního pracovního paměťového prostoru. Co však moduly konkrétně jsou? I. Ve skutečnosti je modulem každý soubor *.py. V jeho rámci je společná globální úroveň viditelnosti pro proměnné, funkce apod. v něm definované. II. Skutečná struktura modulu však může (a samozřejmě často bývá) mnohem složitější – obsahuje nejen více souborů, ale většinou jsou tyto soubory i uspořádány do hierarchické struktury vhodně pojmenovaných adresářů. Modul v nejjednodušším případě importujeme pod jeho jménem. Pak můžeme používat v něm definované objekty (funkce, proměnné atd.). Přitom obsahuje-li modul proveditelné příkazy, ty se provedou při jeho prvním importu. Typicky tak slouží třeba k jeho inicializaci a podobně.

Import Moduly a objekty z nich můžete naimportovat a používat několika různými způsoby:

Python (2011-03-24) : Moduly

2 of 9

– zpřístupní objekty modulu MODUL pomocí „tečkové“ notace (tj. například math.sin(), math.pi apod.) import MODUL

– OBJEKT bude dostupný v aktuálním kontextu jako globální, tj. přímo pod svým názvem

from MODUL import OBJEKT

– OBJEKT bude dostupný v aktuálním kontextu jako globální, ale pod názvem NÁZEV

from MODUL import OBJEKT as NÁZEV

sys.path otázka: Kde Python hledá moduly? odpověď: Na místech vyjmenovaných v proměnné

sys.path.

Sama proměnná sys.path se skládá z místa umístění aktuálního spouštěného skriptu (tj. adresáře „tečka“), dále obsahu proměnné prostředí PYTHONPATH a základní cesty závislé na instalaci (typicky adresář Lib/sitepackages instalace Python'u):

Python (2011-03-24) : Moduly

3 of 9

>>> import sys >>> sys.path ['', 'C:\\Program Files\\DreamPie\\share\\dreampie', 'c:\\home\\DJANGO\\Django-1.0.2', 'c:\\home\\DJANGO\\django-evolution', 'C:\\WINDOWS\\system32\\python31.zip', 'c:\\Program Files\\Python31\\DLLs', 'c:\\Program Files\\Python31\\lib', 'c:\\Program Files\\Python31\\lib\\plat-win', 'c:\\Program Files\\Python31', 'c:\\Program Files\\Python31\\lib\\site-packages', 'c:\\Program Files\\Python31\\lib\\site-packages\\win32', 'c:\\Program Files\\Python31\\lib\\site-packages\\win32\\lib', 'c:\\Program Files\\Python31\\lib\\site-packages\\Pythonwin', 'c:\\Program Files\\Python31\\lib\\site-packages\\setuptools-0.6c11-py3.1.e ..přičemž při dotazu jsou prohledávána všechna vyjmenovaná umístění popořadě. Za zmínku stojí zvláště dvě věci: Aktuální adresář je na prvním místě, z čehož vyplývá, že moduly vhodných jmen v aktuálním adresáři mohou zcela „zakrýt“ moduly vestavěné. Je to obyčejný seznam, a proto si ho můžete upravit přidáním vlastních cest na vhodná místa.

__name__ Jelikož vlastně každý pythonovský zdrojový soubor může sloužit zároveň jako modul i jako skript, potřebujeme mezi těmito použitími rozlišit. K tomu slouží globální proměnná aktuálního modulu/skriptu __name__, která obsahuje: řetězec __main__ – v případě skriptu; tj. pokud jsme soubor *.py spustili jako „hlavní“, např. z příkazové řádky jméno souboru (bez přípony) – v případě modulu; tj. pokud jsme soubor *.py naimportovali pomocí příkazu import SOUBOR Chceme-li tedy, aby se modul při použití jako skript (tj. tehdy, když není importován) nějak rozumně choval, stačí na jeho konec přidat kód: if __name__ == "__main__": # kód pro užití modulu jako skriptu

Python (2011-03-24) : Moduly

4 of 9

dir() I. Pro ukázání „obsahu“ modulu, tj. objektů dostupných v rámci příslušného modulu, slouží globální funkce dir(): – vrátí seřazený seznam řetězců představujících jména objektů dostupných v modulu MODUL dir(MODUL)

– vypíše jména aktuálně definovaných objektů (tj. například v rámci daného sezení)

dir()

Příklad čerstvě spuštěného pythoního shellu: >>> dir() ['__builtins__', '__doc__', '__name__', '__package__'] >>> xs = [1, 2, 3,] >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'xs'] >>> import sys >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'sys', 'xs' >>> dir(sys) ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__' II. Z tohoto seznamu získáme pouze jméno objektu (jako řetězec). Objekt samotný pak dostaneme pomocí globální funkce getattr() takto: objekt = getattr(MODUL, JMÉNO_JEHO_OBJEKTU)

Příklad navazující na předchozí:

Python (2011-03-24) : Moduly

>>> argvs = getattr(sys, 'argv') >>> type(argvs) >>> argvs ['']

*.pyc, *.pyo I. Úspěšně naimportované moduly jsou Python'em bajtově zkompilovány, a to buď do souborů *.pyc (standardně) nebo *.pyo (byl-li interpretr spuštěn s parametrem pro optimalizaci). Jejich výhodou je, že se rychleji načítají => při příštím použití budou dříve k dispozici. II. Python pozná, může-li použít některý ze zkompilovaných souborů nebo byl-li jejich zdrojový *.py soubor mezitím modifikován.

III. *.pyo vzniknou vyvoláním interpretru s přepínačem -O. V dané době to znamená pouze jediné – z kódu jsou odstraněny všechny příkazy assert.

Poznámky Python má zabudovanou ochranu proti cyklickým importům. Pokusíte-li se například naimportovat „sami sebe“.. #!/usr/bin/env python # -*- coding: utf-8 -*# soubor: test.py import test print("Ahoj!") ..vypíše se nápis Ahoj! pouze dvakrát.

5 of 9

Python (2011-03-24) : Moduly

6 of 9

„Balíčky“ (packages) Definovat všechny potřebné objekty v rámci jednoho modulu je při čemkoliv jen trošku větším velmi nešikovné. Python má pro tento případ k dispozici velmi jednoduchý a elegantní „balíčkovací“ mechanizmus: Rozdělte objekty do jednotlivých modulů a ty do jednotlivých podadresářů hlavního adresáře (tj. balíčku, package) podle jejich zaměření a hierarchie. Jednotlivé moduly a jejich objekty jsou pak dostupné pomocí klasické tečkové notace, jak ukazuje následující příklad:

sound/ __init__.py formats/ __init__.py wavread.py wavwrite.py ... effects/ __init__.py echo.py reverse.py ... filters/ __init__.py equalizer.py ...

# top-level package # inicializace balíčku sound # subpackage

# subpackage

# subpackage

I. Moduly z balíčku se pak importují naprosto standardně a průhledně (a absolutně), například.. import sound.effects.echo ..a podobně i pomocí všech ostatních dříve uvedených způsobů importu. II. Na posledním místě importu tedy může být buď modul nebo nějaký jeho objekt (funkce, proměnná...).

Python (2011-03-24) : Moduly

7 of 9

III. Podobným způsobem na sebe mohou odkazovat moduly uvnitř balíčku. Jde to buď absolutně (tj. od kořene balíčku).. # Nechť se právě nacházíme v modulu sound.filters.equalizer: from sound.effects import echo ..nebo relativně (tj. vůči aktuální pozici): # Nechť se právě nacházíme v modulu sound.effects.reverse: from . import echo from .. import formats from ..filters import equalizer

__init__.py Soubor __init__.py je vyžadován, aby byl adresář rozpoznán jako balíček! Je to mimo jiné z toho důvodu, aby se náhodným importem čehokoliv nezastínily například systémové balíčky Python'u (obecně balíčky na pozdějších místech sys.path). Ve většině případů tedy stačí, aby soubor __init__.py byl prázdný. Jelikož je ale čten (a vykonán) při importu balíčku (tedy právě jednou), může též s výhodou obsahovat například jeho inicializační kód (je-li nějaký potřeba). Jednoduchý balíček tak bude vypadat přibližně takto: balíček/ __init__.py soubor1.py soubor2.py ...

# # # #

top-level package inicializace balíčku "balíček" modul "balíček.soubor1" modul "balíček.soubor2"

__main__.py Jako přítomnost souboru __init__.py zajišťuje, že je balíček vůbec pokládán za balíček, tak přítomnost souboru __main__.py zajišťuje, že je balíček pokládán za spustitelný z příkazové řádky pod svým jménem. I. Mějme kupříkladu balíček foo s následující strukturou:

Python (2011-03-24) : Moduly

foo/ __init__.py __main__.py bar.py

8 of 9

# 'foo' je možnou naimportovat # 'foo' je možno spustit

Přitom soubor __main__.py obsahuje.. import bar bar.fce('MAIN') ..a soubor bar.py zase: def fce( txt="SVĚTE" ): s = "Ahoj, " + txt + "!" print(s) if __name__ == "__main__": import sys try: arg = sys.argv[1] except: arg = "KDOSI" fce( arg ) Budeme-li stát na úrovni adresáře (a tedy balíčku) foo, příslušná volání budou mít následující efekty: # python3 foo Ahoj, MAIN! # python foo/bar.py Ahoj, KDOSI! # python foo/bar.py Pavle Ahoj, Pavle! II. Jde to dokonce ještě dál – z adresáře foo můžete vyrobit zip-archív (resp. ze souborů v něm obsažených; adresář bude efektivně nahrazen archívem).. foo.zip/ __main__.py bar.py a chovat se k němu velmi podobně: # python foo.zip Ahoj, MAIN!

Python (2011-03-24) : Moduly

Poznámky Vyhledávání metod (v rámci balíčku) je vyhodnocováno za běhu. Proto bude (o něco málo) rychlejší, ale hlavně asi také čitelnější, místo.. modul1.podmodul11.funkce1() modul1.podmodul11.funkce2() ..použít.. pracovni_modul = modul1.podmodul11 pracovni_modul.funkce1() pracovni_modul.funkce2() Tím spíš, bude-li podobný kód uvnitř smyčky.

9 of 9

Life Enjoy

" Life is not a problem to be solved but a reality to be experienced! "

Get in touch

Social

© Copyright 2013 - 2018 TIXPDF.COM - All rights reserved.