V příkladu načteme standardní modul sys a použijeme funkci v něm obsaženou exit(). Tato funkce ukončí program kdekoliv ji zavoláte.
Po zavolání příkazu sys.exit() se Váš program ukončí. V případě, že pracujete v interaktivním módu, ukončí se interpret Python a vrátíte se do příkazové řádky.>>> import sys >>> sys.exit() rimmer: $
>>> import sys as s >>> s.exit() rimmer: $
Chcete-li takto načíst více funkcí z modulu, napište je za příkaz import a oddělte je čárkou. Chcete-li takto načíst všechny funkce z modulu, napište místo jmena_funkce hvězdičku. Použití hvězdičky na vestavěné moduly se silně nedoporučuje, protože při importování několika modulů tímto způsobem by se mohly přepsat globální proměnné z modulů, které by měli v modulech stejné jméno, ale jinou hodnotu (i význam).>>> from sys import exit >>> exit() rimmer: $
Funkce exit() pracovala tak jak má. Proč ale přiřazení ps1=":-) " nefungovalo a přiřazení sys.ps1=":-) " ano? Odpověď je jednoduchá. Python se při vypisování promptu obrací na standardní modul sys. Příkazem from sys import ps1,ps2 se zkopírovaly proměnné ps1 a ps2 do našeho programu a změna "našich proměnných" neměla na modul sys pražádný vliv. Druhý přiřazení však již s modulem sys pracuje a tak se dostavil kýžený výsledek. Život je holt pes a na takové věci je třeba dávat pozor.rimmer: $ python Python 2.1.3 (#1, Apr 20 2002, 10:14:34) [GCC 2.95.4 20011002 (Debian prerelease)] on linux2 Type "copyright", "credits" or "license" for more information. >>> from sys import ps1,ps2,exit >>> ps1 '>>> ' >>> ps2 '... ' >>> ps1=":-) " >>> import sys >>> sys.ps1=":-) " :-) exit() rimmer: $
Všimněte si, že je potřeba skutečně vytvořit nový objekt (například použitím slice viz. b = b[:]) a nestačí jen změnit hodnotu oběktu (viz. b += [4]).>>> a = 5 >>> b = a >>> a is b 1 >>> b = 3 >>> a is b 0 >>> a = [5] >>> b = a >>> b += [4] >>> a is b 1 >>> b = b[:] >>> a is b 0
| copy(arg) | - vytvoří kopii oběktu arg, oběkty v arg budou tytéž, jako v původním objektu. |
|---|---|
| deepcopy(arg) | - vytvoří kopii oběktu arg a z oběktů v arg budou vytvořeny také kopie (rekurzivně se vytvářejí kopie všech oběktů v nalezených oběktech ...). |
Proč je x.cislo1 stejný objekt jako y.cislo1? Protože je součástí oběktu, který deklaruje třídu trida, nikoliv objěktu x (ani y), které jsou instancemi této třídy.>>> class trida: ... cislo1 = [1] ... def __init__(self): ... self.cislo2 = [1] ... >>> x = trida() >>> y = x >>> x is y 1 >>> x.cislo2 is y.cislo2 1 >>> import copy >>> y = copy.copy(x) >>> x is y 0 >>> x.cislo2 is y.cislo2 1 >>> y = copy.deepcopy(x) >>> x is y 0 >>> x.cislo2 is y.cislo2 0 >>> x.cislo1 is y.cislo1 1
#
# modul pokus.py
#
x = 'Hello World'
def pozdrav(pocet):
try:
for i in range(pocet):
print x
except TypeError:
print 'Argumentem funkce pozdrav musi byt cele cislo'
return
except:
print 'Neocekavana chyba'
Tím jste vytvořily modul pokus a můžete jej používat:
Porovnejte s následujícím příkladem:>>> import sys,pokus >>> pokus.pozdrav(2) Hello World Hello World >>> pokus.x = 'Ahoj' >>> pokus.pozdrav(1) Ahoj >>> sys.exit()
Všiměte si, že v aktuálním adresáři vznikl soubor pokus.pyc. To je zkompilovaný modul pokus.py. Python jej vytváří automaticky, aby se tím urychlila práce s moduly. Při příštím načtení modulu pokus se načte pokus.pyc, což je výrazně rychlejší. V případě, že soubor pokus.py upravíte Python si toho všimne sám od sebe a modul znovu skompiluje.>>> from pokus import * >>> print x Hello World >>> pozdrav(1) Hello World >>> x = 'Ahoj' >>> pozdrav(1) Hello World
