Modul je v Pythonu něco, z čeho můžeme importovat.
Třeba z modulu math
můžeš importovat funkci sqrt
:
from math import sqrt
print(sqrt(2))
Kromě importování jednotlivých proměnných z modulu
můžeš importovat i celý modul najednou.
K tomu, co modul nabízí, se pak dostaneš pomocí
tečky – podobně jako se pomocí 'Ahoj'.upper
dostaneš k metodě, kterou nabízí
řetězec.
Například:
import turtle
turtle.left(90)
turtle.color('red')
turtle.forward(100)
turtle.exitonclick()
import math
print(math.cos(math.pi))
Hvězdičky nechceme
Možná jsi v dokumentaci nebo na jiném kurzu viděl/a příkaz import
s hvězdičkou (*
).
Pokud ano, v rámci tohoto kurzu na hvězdičku prosím
zapomeň a importuj místo toho radši celý modul.
Až začneš psát větší programy, zjednoduší ti
to práci.
A teď to hlavní! Můžeš vytvořit vlastní importovatelný modul a to jen tak, že uděláš pythonní soubor. Funkce, které v něm nadefinuješ, a proměnné, které v něm nastavíš, pak budou k dispozici tam, kde modul naimportuješ.
Zkus si to!
Vytvoř soubor louka.py
a do něj napiš:
barva_travy = 'zelená'
pocet_kotatek = 28
def popis_stav():
return 'Tráva je {barva}. Prohání se po ní {pocet} koťátek'.format(
barva=barva_travy, pocet=pocet_kotatek)
A pak v dalším souboru, třeba vypis.py
, napiš:
import louka
print(louka.popis_stav())
a pak spusť:
$ python vypis.py
Příkaz import
hledá soubory (mimo jiné) v adresáři,
ve kterém je „hlavní modul” programu – tedy soubor,
který spouštíš (u nás vypis.py
).
Oba soubory by proto měly být ve stejném adresáři.
Co přesně dělá příkaz import louka
?
Python najde příslušný soubor (louka.py
) a provede v něm všechny příkazy,
odshora dolů, jako v normálním Pythonním programu.
Všechny globální proměnné (včetně nadefinovaných funkcí) pak dá k dispozici
kódu, který „louku“ importoval.
Když pak stejný modul importuješ podruhé, už se neprovádí všechno znovu – stejná sada proměnných se použije znovu.
Zkus si to – na konci louka.py
dopiš:
print('Louka je zelená!')
A pak spusť python
(máš-li ho už spuštěný, ukonči a spusť znovu), a zadej:
>>> print('První import:')
>>> import louka
>>> print('Druhý import:')
>>> import louka
Výpis se objeví jen poprvé.
Když takhle modul při importu „něco dělá“ (něco vypíše na obrazovku,
zapíše do souboru, na něco se zeptá uživatele atp.), říká se,
že má vedlejší efekt (angl. side effect).
V modulech připravených na importování se vedlejším efektům vyhýbáme:
úloha takového modulu je dát k dispozici funkce, které něco dělají,
ne to udělat za nás.
Všimni si například, že import turtle
neukáže okýnko – to se objeví až po
zavolání turtle.forward()
.
Příkaz print
proto radši z modulu zase smaž.
Od teď budeme občas psát větší projekty, které budou obsahovat více souvisejících souborů. Je dobré pro každý takový projekt udělat zvláštní adresář.
(A to samozřejmě znamená i zvláštní gitový repozitář.)
{ "data": { "sessionMaterial": { "id": "session-material:2018/pyladies-hradec-podzim:modules:1", "title": "Moduly", "html": "\n \n \n\n <h1>Moduly</h1>\n<p>Modul je v Pythonu něco, z čeho můžeme importovat.\nTřeba z modulu <code>math</code> můžeš importovat funkci <code>sqrt</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">math</span> <span class=\"kn\">import</span> <span class=\"n\">sqrt</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n</pre></div><p>Kromě importování jednotlivých proměnných z modulu\nmůžeš importovat i celý modul najednou.\nK tomu, co modul nabízí, se pak dostaneš pomocí\ntečky – podobně jako se pomocí <code>'Ahoj'.upper</code> dostaneš k metodě, kterou nabízí\nřetězec.</p>\n<p>Například:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">turtle</span>\n\n<span class=\"n\">turtle</span><span class=\"o\">.</span><span class=\"n\">left</span><span class=\"p\">(</span><span class=\"mi\">90</span><span class=\"p\">)</span>\n<span class=\"n\">turtle</span><span class=\"o\">.</span><span class=\"n\">color</span><span class=\"p\">(</span><span class=\"s1\">'red'</span><span class=\"p\">)</span>\n<span class=\"n\">turtle</span><span class=\"o\">.</span><span class=\"n\">forward</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n<span class=\"n\">turtle</span><span class=\"o\">.</span><span class=\"n\">exitonclick</span><span class=\"p\">()</span>\n</pre></div><div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">math</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">cos</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">pi</span><span class=\"p\">))</span>\n</pre></div><div class=\"admonition note\"><p class=\"admonition-title\">Hvězdičky nechceme</p>\n<p>Možná jsi v dokumentaci nebo na jiném kurzu viděl/a příkaz import\ns hvězdičkou (<code>*</code>).\nPokud ano, v rámci tohoto kurzu na hvězdičku prosím\nzapomeň a importuj místo toho radši celý modul.\nAž začneš psát větší programy, zjednoduší ti\nto práci.</p>\n</div><h2>Vlastní moduly</h2>\n<p>A teď to hlavní!\nMůžeš vytvořit vlastní importovatelný modul\na to jen tak, že uděláš pythonní soubor.\nFunkce, které v něm nadefinuješ, a proměnné,\nkteré v něm nastavíš, pak budou k dispozici tam, kde modul naimportuješ.</p>\n<p>Zkus si to!\nVytvoř soubor <code>louka.py</code> a do něj napiš:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">barva_travy</span> <span class=\"o\">=</span> <span class=\"s1\">'zelená'</span>\n<span class=\"n\">pocet_kotatek</span> <span class=\"o\">=</span> <span class=\"mi\">28</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">popis_stav</span><span class=\"p\">():</span>\n <span class=\"k\">return</span> <span class=\"s1\">'Tráva je {barva}. Prohání se po ní {pocet} koťátek'</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n <span class=\"n\">barva</span><span class=\"o\">=</span><span class=\"n\">barva_travy</span><span class=\"p\">,</span> <span class=\"n\">pocet</span><span class=\"o\">=</span><span class=\"n\">pocet_kotatek</span><span class=\"p\">)</span>\n</pre></div><p>A pak v dalším souboru, třeba <code>vypis.py</code>, napiš:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">louka</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">louka</span><span class=\"o\">.</span><span class=\"n\">popis_stav</span><span class=\"p\">())</span>\n</pre></div><p>a pak spusť:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>python vypis.py\n</pre></div><p>Příkaz <code>import</code> hledá soubory (mimo jiné) v adresáři,\nve kterém je „hlavní modul” programu – tedy soubor,\nkterý spouštíš (u nás <code>vypis.py</code>).\nOba soubory by proto měly být ve stejném adresáři.</p>\n<h2>Vedlejší efekty</h2>\n<p>Co přesně dělá příkaz <code>import louka</code>?</p>\n<p>Python najde příslušný soubor (<code>louka.py</code>) a provede v něm všechny příkazy,\nodshora dolů, jako v normálním Pythonním programu.\nVšechny globální proměnné (včetně nadefinovaných funkcí) pak dá k dispozici\nkódu, který „louku“ importoval.</p>\n<p>Když pak stejný modul importuješ podruhé, už se neprovádí všechno\nznovu – stejná sada proměnných se použije znovu.</p>\n<p>Zkus si to – na konci <code>louka.py</code> dopiš:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Louka je zelená!'</span><span class=\"p\">)</span>\n</pre></div><p>A pak spusť <code>python</code> (máš-li ho už spuštěný, ukonči a spusť znovu), a zadej:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'První import:'</span><span class=\"p\">)</span>\n<span class=\"gp\">>>> </span><span class=\"kn\">import</span> <span class=\"nn\">louka</span>\n<span class=\"gp\">>>> </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Druhý import:'</span><span class=\"p\">)</span>\n<span class=\"gp\">>>> </span><span class=\"kn\">import</span> <span class=\"nn\">louka</span>\n</pre></div><p>Výpis se objeví jen poprvé.</p>\n<p>Když takhle modul při importu „něco dělá“ (něco vypíše na obrazovku,\nzapíše do souboru, na něco se zeptá uživatele atp.), říká se,\nže má <em>vedlejší efekt</em> (angl. <em>side effect</em>).\nV modulech připravených na importování se vedlejším efektům vyhýbáme:\núloha takového modulu je dát k dispozici <em>funkce</em>, které něco dělají,\nne to udělat za nás.\nVšimni si například, že <code>import turtle</code> neukáže okýnko – to se objeví až po\nzavolání <code>turtle.forward()</code>.</p>\n<p>Příkaz <code>print</code> proto radši z modulu zase smaž.</p>\n<h2>Adresář pro každý projekt</h2>\n<p>Od teď budeme občas psát větší projekty,\nkteré budou obsahovat více souvisejících souborů.\nJe dobré pro každý takový projekt udělat\nzvláštní adresář.</p>\n<p>(A to samozřejmě znamená i zvláštní gitový repozitář.)</p>\n\n\n " } } }