previous up next hi englisch index

10. Moduly a soubory

  1. Moduly
  2. pydoc
  3. Vytváření modulů
  4. Jmenné prostory
  5. Atributy a tečkový operátor
  6. Metody na řetězcích a seznamech
  7. Čtení a zápis textových souborů
  8. Textové soubory
  9. Adresáře
  10. Počítání písmen
  11. Modul sys a proměnná argv
  12. Glosář
  13. Cvičení

10.1 Moduly

Modul je soubor, obsahujicí definice a příkazy určené pro použití v jiných programech Pythonu. Mnohé moduly jsou standardní součástí Pythonu a jsou uloženy v jeho standardní knihovně. Dosud jsme poznali dva, modul doctest a modul string.

10.2 pydoc

K prohledávání knihoven Pythonu, instalovaných na počítači, slouží příkaz pydoc. Na příkazový řádek napíšeme:

$ pydoc -g
a mělo by se objevit následující:

(poznámka: v případě nezdaru viz cvičení 2)

Stiskem tlačítka open browser otevřeme okno webového prohlížeče, které obsahuje seznam modulů a jejich objektů:

Je to výčet všech knihoven Pythonu na vašem počítači. Klikem na jménu modulu otevřeme novou stránku s dokumentací o vybraném modulu. Například, klik na slovu keyword otevře následující stánku:

Dokumentace pro většinu modulů obsahuje tři barevně označené sektory:

O třídách budeme hovořit v pozdějších kapitolách.

Modul keyword obsahuje jedinou funkci iskeyword, která - jak její jméno naznačuje - je booleovskou funkcí, vracející True je-li zadaný řetězec klíčovým slovem:

>>> from keyword import *
>>> iskeyword('for')
True
>>> iskeyword('all')
False
>>>

Datový prvek kwlist obsahuje seznam všech současných klíčovych slov Pythonu:

>>> from keyword import *
>>> print kwlist
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif',
'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import',
'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try',
'while', 'with', 'yield']
>>>

Doporučujeme časté používání služby pydoc ke zkoumání rozsáhlých knihoven Pythonu. Mnoho pokladů čeká na své objevení!

10.3 Vytváření modulů

K vytvoření modulu nám stačí textový soubor s příponou .py :

#  seqtools.py
#
def remove_at(pos, seq):
return seq[:pos] + seq[pos+1:]

Náš modul můžeme nyní používat jak ve skriptech, tak v interaktivním rozhraní. Nejprve musíme modul importovat. Jsou tři způsoby:

>>> from seqtools import remove_at
>>> s = "A string!"
>>> remove_at(4, s)
'A sting!'
>>> import seqtools
>>> s = "A string!"
>>> seqtools.remove_at(4, s)
'A sting!'

a

>>> from seqtools import*
>>> s = "A string!"
>>> remove_at(4, s)
'A sting!'

V prvním příkladě je fce remove_at volána již známým způsobem. Ve druhém příkladě je před funkcí napsáno jméno modulu s tečkou (.) Třetí je podoben prvnímu, ale nebývá doporučován.

Přesto, že přípona .py je součástí jména, při importu modulu ji neuvádíme, neboť ji Python předjímá.

Použití modulů umožňuje rozložení velkých programů na zvládnutelné malé části a souvislé části ukládat pohromadě.

10.4 Jmenné prostory

Jmenný prostor (namespace) je syntaktický kontejner, který umožňuje použití stejného jména v různých modulech nebo funkcích - a jak brzy uvidíme, také v třídách a metodách.

Každý modul vymezuje svůj vlastní jmenný prostor, takže můžeme totéž jméno použít ve více modulech bez vyvolání problémů s identifikací.

# module1.py
question = "What is the meaning of life, the Universe, and everything?"
answer = 42
# module2.py
question = "What is your quest?"
answer = "To seek the holy grail."

Můžeme nyní oba moduly importovat a zajistit si v každém přístup k proměnným question a answer :

>>> import module1
>>> import module2
>>> print module1.question
What is the meaning of life, the Universe, and everything?
>>> print module2.question
What is your quest?
>>> print module1.answer
42
>>> print module2.answer
To seek the holy grail.
>>>

Kdybychom byli použili from module1 import* a from module2 import*, dospěli bychom k jmenné kolizi (naming collision) a neměli bychom přístup ke jménu question a answer z modulu module1.

Funkce mají také své jmenné prostory:

def f():
    n = 7
    print "printing n inside of f: %d" % n

def g():
    n = 42 
    print "printing n inside of g: %d"  % n

n = 11
print "printing n before calling f: %d"  % n
f()
print "printing n after calling f: %d"  % n
g()
print "printing n after calling g: %d"  % n

Běh tohoto programu vytvoří následující výstup:

printing n before calling f: 11
printing n inside of f: 7
printing n after calling f: 11
printing n inside of g: 42
printing n after calling g: 11

Ona tři n zde nezpůsobí kolizi, protože každé n je z jiného jmenného prostoru.

Jmenné prostory umožňují pracovat více programátorům na stejném projektu bez obavy ze jmenných kolizí.

10.5 Atributy a tečkové operátory

Proměnné, definované uvnitř modulu, se nazývají atributy modulu. Jsou dostupné s použitím tečkového operátoru (.). Atributy question modulu module1 a module2 jsou přístupné použitím příkazu module1.question a module2.question.

Moduly obsahují funkce stejně jako atributy a jsou rovněž dostupné použitím tečkového operátoru. Zápis seqtools.remove_at ukazuje na funkci remove_at v modulu seqtools.

V kapitole 7 jsme uvedli funkci find z modulu string. Modul string obsahuje mnoho dalších užitečných funkcí:

>>> import string
>>> string.capitalize('maryland')
'Maryland'
>>> string.capwords("what's all this, then, amen?")
"What's All This, Then, Amen?"
>>> string.center('How to Center Text Using Python', 70)
'                   How to Center Text Using Python                    '
>>> string.upper('angola')
'ANGOLA'
>>> 

Měli bychom využít pydoc k prohlížení dalších funkcí a atributů v modulu string.

10.5 Metody na řetězcích a seznamech

Během vývoje jazyka Python byla většina funkcí z modulu string uvedena také jako metoda na řetězcích coby objektech. Metoda působí téměř stejně jako funkce, ale syntaxe jejího volání je malinko odlišná:

>>> 'maryland'.capitalize()
'Maryland'
>>> "what's all this, then, amen?".title()
"What'S All This, Then, Amen?"
>>> 'How to Center Text Using Python'.center(70)
'                   How to Center Text Using Python                    '
>>> 'angola'.upper()
'ANGOLA'
>>>

Metody na řetězcích jsou invokovány (volány) zápisem řetězce s tečkovým operátorem a jménem metody .

V pozdějších kapitolách se naučíme vytvářet vlastní objekty s vlastními metodami. Prozatím se spokojíme s metodami, které jsou součástí vestavěných objektů.

Tečkový operátor může být také použit pro přístup k vestavěným metodám seznamů:

>>> mylist = []
>>> mylist.append(5)
>>> mylist.append(27)
>>> mylist.append(3)
>>> mylist.append(12)
>>> mylist
[5, 27, 3, 12]
>>>

Append je metoda seznamu (metoda objektu typu seznam), která připojí zadaný argument na jeho konec. Následují ukázky několika dalších metod seznamu:

>>> mylist.insert(1, 12)
>>> mylist
[5, 12, 27, 3, 12]
>>> mylist.count(12)
2
>>> mylist.extend([5, 9, 5, 11])
>>> mylist
[5, 12, 27, 3, 12, 5, 9, 5, 11])
>>> mylist.index(9)
6
>>> mylist.count(5)
3
>>> mylist.reverse()
>>> mylist
[11, 5, 9, 5, 12, 3, 27, 12, 5]
>>> mylist.sort()
>>> mylist
[3, 5, 5, 5, 9, 11, 12, 12, 27]
>>> mylist.remove(12)
>>> mylist
[3, 5, 5, 5, 9, 11, 12, 27]
>>>

Pohrávej si s uvedenými metodami seznamu tak dlouho, dokud nebudeš mít pocit, že rozumíš tomu jak pracují.

10.7 Čtení a zápis textových souborů

Při běhu programu jsou data ukládána v prostoru RAM (náhodně přístupná paměť). Paměť RAM je rychlá a laciná, ale je také nestálá, čímž je míněno to, že když program skončí nebo se vypne počítač, RAM zmizí. Abychom měli data k disposici i při příštím spuštění počítače a programu, musíme je zapsat na stálejší záznamové medium, jako je pevný disk, USB nebo CD-RW.

Data na těchto nosičích jsou uložena v pojmenovaných souhrnech, zvaných soubory (files). Do těchto souborů mohou programy informace zapisovat a z nich je také načítat.

Práce se soubory je velmi podobná práci se sešitem. Před použitím sešitu jej musíme otevřít. Po ukončení práce jej musíme zavřít. Když je sešit otevřen, můžeme do něho psát, nebo z něho číst. V obou případech vždy víme na kterém místě sešitu se nalézáme. Sešit můžeme číst celý popořádku nebo napřeskáčku.

Totéž platí i pro soubory. Pro otevření souboru zadáme jeho jméno a udáme, zda chceme soubor číst nebo zapisovat.

Otevření souboru vytvoří objekt typu soubor. V naší ukázce odkazuje proměnná myfile na nový objekt test.dat.

>>> myfile = open('test.dat', 'w')
>>> print myfile
<open file 'test.dat', mode 'w' at 0x2aaaaab80cd8>

Funkce open přijímá dva argumenty. První je jméno souboru, druhý je mód činnosti. Mód 'w' říká, že otevíráme soubor pro zápis.

Neexistuje-li soubor se jménem test.dat, bude vytvořen. Jestliže takový soubor již existuje, bude nahrazen souborem, který píšeme.

Příkaz print vrátí jméno souboru, mód a jeho umístění v paměti.

Při vkládání dat do souboru vyvoláme metodu write na objektu soubor:

>>> myfile.write("Now is the time")
>>> myfile.write("to close the file")

Zavření souboru říká systému, že jsme skončili zapisování a soubor je možné číst:

>>> myfile.close()

Nyní můžeme soubor opět otevřít, tentokrát pro čtení, a přenést obsah do řetězce v našem programu. Argumentem pro parametr mód je 'r', od slova reading (čtení):

>>> myfile = open('test.dat', 'r')

Pokusíme-li se otevřít soubor, který neexistuje, dostaneme chybové hlášení:

>>> myfile = open('test.cat', 'r')
IOError: [Errno 2] No such file or directory: 'test.cat'

Nepřekvapí nás, že metoda read čte data ze souboru. Bez zadaných argumentů přečte celý obsah souboru do jediného řetězce:

>>> text = myfile.read()
>>> print text
Now is the timeto close the file

Mezi time a to není mezera, protože jsme ji mezi řetězce nenapsali.

Metoda read může také přijmout argument, který říká kolik znaků má být čteno:

>>> myfile = open('test.dat', 'r')
>>> print myfile.read(5)
Now i

Zadáme-li číslo větší než je počet znaků v souboru, vrátí read jen zbývající znaky. Došlo-li se na konec souboru, vrátí read prázdný řetězec:

>>> print myfile.read(1000006)
s the timeto close the file
>>> print myfile.read()
   
>>>

Následující funkce kopíruje soubor tak, že přečte a zapíše nejvíce 50 znaků najednou. První argument je jméno originálního souboru, druhý argument je jméno nového souboru:

def copy_file(oldfile, newfile):
    infile = open(oldfile, 'r')
    outfile = open(newfile, 'w')
    while True
        text = infile.read(50)
        if text == "":
            break
        outfile.write(text)
    infile.close()
    outfile.close()
    return

Tato funkce cyklicky čte 50 znaků z infile a zapisuje je do outfile až je dosaženo konce a text je prázdný řetězec, čímž se vyvolá provedení příkazu break.

10.8 Textové soubory

Textový soubor je soubor, který obsahuje tisknutelné znaky a mezery uspořádané do řádků, oddělených znaky pro nový řádek (newline characters). Protože Python byl navržen zejména pro zpracování textových souborů, poskytuje metody, které tento úkol usnadňují.

Pro ukázku vytvoříme textový soubor se třemi řádky textu, oddělenými znaky pro newlines:

>>> outfile = open("test.dat","w")
>>> outfile.write("line one\nline two\nline three\n")
>>> outfile.close()

Metoda readline přečte všechny znaky z prvního řádku včetně znaku newline:

>>> infile = open("test.dat","r")
>>> print infile.readline()
line one
                  # znak \n vytvořil prázdný řádek   
>>>

Metoda readlines vrátí všechny zbyvající řádky jako seznam řetězců:

>>> print infile.readlines()
['line two\012', 'line three\012']

Řetězce v seznamu jsou uvedeny v uvozovkách (či apostrofech) a znaky newline jsou tisknuty jako escape sequence: \\012.

Na konci souboru vrací readline prázdný řetězec a readlines prázdný seznam:

>>> print infile.readline()
   
>>> print infile.readlines()
[]

Následuje ukázka programu, který zpracovává řádky textu. Funkce filter vytvoří kopii oldfile, přičemž vypustí všechny řádky, které začínají znakem #:

def filter(oldfile, newfile):
    infile = open(oldfile, 'r')
    outfile = open(newfile, 'w')
    while True:
        text = infile.readline()
        if text == "":
           break
        if text[] == '#':
           continue
        outfile.write(text)
    infile.close()
    outfile.close()
    return

Příkaz continue končí aktuální průchod smyčkou (iteraci), ale nekončí cyklování. Tok provádění se přesune na vrchol smyčky, přezkoumá podmínku a pokračuje příslušnou cestou.

Tedy, je-li text prázdný řetězec, smyčka končí. Je-li prvním znakem řetězce dvojitý křížek (#), tok provádění přechází na počátek smyčky. Pouze při nesplnění obou podmínek je text kopírován do nového souboru.

10.9 Adresáře

Soubory uložené na trvalých paměťových nosičích jsou uspořádány podle souboru pravidel, známého jako systém souborů. Tento systém se skládá ze souborů a složek (folders) neboli adresářů (directories), což jsou obálky jak pro soubory, tak pro další složky.

Nově vytvořený soubor se po otevření a zápisu uloží do stávajícího adresáře (to jest do toho, ve kterém se nalézáme při provádění programu). Nebo naopak, otevíráme-li soubor pro čtení, hledá jej Python ve stávajícím adresáři.

Chceme-li otevřít soubor někde jinde, musíme k němu určit cestu, například:

>>> wordsfile = open('/usr/share/dict/words.txt', 'r')
>>> wordlist = wordsfile.readlines()
>>> print wordlist[:5]
['\n', 'A\n', "A's\n", 'AOL\n', "AOL's\n", 'Aachen\n']

Tento příklad otevírá soubor se jménem words.txt, který je uložený v adresáři se jménem dict jenž se nalézá v adresáři share, kterýžto je uložen v adresáři usr, jenžto sídlí v nejvyšším systémovém adresáři, označeném /. Program potom načítá jednotlivé řádky do seznamu se jménem wordlist s použitím metody readlines a posléze vytiskne prvních pět položek vytvořeného seznamu.

Znak / nelze použít jako součást jména souboru; je vyhrazen jako oddělovač mezi jmény adresářů a souborů.

Soubor /usr/share/dict/words.~ by měl existovat na unixových systémech a obsahuje abecedně uspořádaný seznam slov.

10.10 Počítání písmen

Funkce ord vrací číselnou presentaci písmene:

>>> ord('a')
97
>>> ord('A')
65
>>>

Tento příklad vysvětluje, proč se 'Apple' < 'apple' vyhodnotí jako True.

Funkce chr je inverzní k fci ord. Přijme jako argument celé číslo a vrátí jeho písmennou presentaci:

>>> for i in range(65, 71):
...     print chr(i)
...
A
B
C
D
E
F
>>>

Následující program countletters.py počítá množství výskytů jednotlivých písmen v knize Alice in Wonderland (Alenka v říši divů):

#
# countletters.py
#

def display(i):
    if i == 10: return 'LF'
    if i == 13: return 'CR'
    if i == 32: return 'SPACE'
    return chr(i)

infile = open('alice_in_wonderland.txt', 'r')
text = infile.read()
infile.close()

counts = 128 * [0]

for letter in text:
    counts[ord(letter)] += 1

outfile = open('alice_counts.dat', 'w')
outfile.write("%-12s%s\n" % ("Character", "Count"))
outfile.write("=================\n")

for i in range(len(counts)):
    if counts[i]:
        outfile.write("%-12s%d\n" % (display(i), counts[i]))

outfile.close()

Spusť si tento program a prohlédni si výstupní soubor v textovém editoru. V závěrečných cvičeních bude žádána analýza programu.

10.11 Modul sys a proměnná argv

Modul sys obsahuje funkce a proměnné, které poskytují přístup k prostředí, ve kterém běží překladač Pythonu. Následující příklad ukazuje výstupní hodnoty několika příkazů, zadaných na některém z našich počítačů:

>>> import sys
>>> sys.platform
'linux2'
>>> sys.path
['', '/home/jelkner/lib/python', '/usr/lib/python25.zip', '/usr/lib/python2.5',
'/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk',
'/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages',
'/usr/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages/Numeric', 
'/usr/lib/python2.5/site-packages/gst-0.10',
'/var/lib/python-support/python2.5', '/usr/lib/python2.5/site-packages/gtk-2.0',
'/var/lib/python-support/python2.5/gtk-2.0']
>>> sys.version
'2.5.1 (r251:54863, Mar  7 2008, 04:10:12) \n[GCC 4.1.3 20070929 (prerelease)
(Ubuntu 4.1.2-16ubuntu2)]'
>>> 

Na jiném počítači může být výsledek odlišný:

>>> import sys
>>> sys.platform
'win32'
>>> sys.path
['d:\\PyScripter',
 'D:\\ActivePython',
 'D:\\ActivePython\\lib\\site-packages',
 'D:\\ActivePython\\lib\\site-packages\\win32',
 'D:\\ActivePython\\lib\\site-packages\\Pythonwin',
 'D:\\ActivePython\\lib\\site-packages\\wx-2.8-msw-unicode']
>>> sys.version
'2.5.2 (r252:60911, Mar 27 2008, 17:57:18) [MSC v.1310 32 bit (Intel)]'
>>> 

Na vašem počítači budou výsledky také odlišné.

Funkce argv vytvoří seznam položek, načtených z příkazové řádky při spuštění skriptu. Tyto argumenty příkazové řádky mohou být použity k zadání informace pro program ve stejném okamžiku, kdy tento program je invokován.

Vytvoříme-li například skript demo_argv.py

#
# demo_argv.py
#
import sys

print sys.argv

Spustíme jej z unixové příkazové řádky zároveň s argumenty (viz), obdržíme:

$ python demo_argv.py this and that 1 2 3
- - -
['demo_argv.py', 'this', 'and', 'that', '1', '2', '3']

Případně z příkazové řádky Windows (Start > Spustit> cmd; d: > cd PyScripter):

python demo_argv.py this and that 1 2 3
- - -
['demo_argv.py', 'this', 'and', 'that', '1', '2', '3']

Funkce argv ve skriptu vytvoří seznam řetězců. Všimneme si, že první položka je jméno programu. Argumenty jsou odděleny mezerou a uspořádány do seznamu stejným způsobem jako při operaci string.split. Chceme-li zadat argumenty s mezerami, použijeme uvozovky:

$ python demo_argv.py "this and" that "1 2" 3
- - -
['demo_argv.py', 'this and', 'that', '1 2', '3']

Pomocí argv můžeme psát užitečné programy, které přijímají vstupy přímo z příkazové řádky. Zde je například program, který určí součet zadané řady čísel:

#
# sum.py
#
from sys import argv

nums = argv[1:]

for index, value in enumerate(nums):
    nums[index] = float(value)

print sum(nums)

V tomto programu používáme způsob importu from <module> import <attribute>, při kterém je funkce argv přenesena do hlavního jmenného prostoru modulu.

Nyní můžeme spouštět program z příkazové řádky takto:

$ python sum.py 3 4 5 11
- - -
23
python sum.py 3.5 5 11 100
- - -
119.5

Jako cvičení si napiš podobné prográmky.

10.12 Glosář

modul (module)
Soubor obsahující definice a příkazy Pythonu určené pro použití v jiných pythonovských programech. Obsah modulu je zpřístupněn použitím příkazu import .
standardní knihovna (standard library)
Knihovna je kolekce programů, používaných jako nástroje při vytváření jiných programů. Knihovny jsou nedílnou součástí programovacích jazyků. Python má bohatou standardní knihovnu.
pydoc
Generátor dokumentace, který je součástí standardní knihovny Pythonu.
výzva k zadání příkazu (command prompt)
Řetězec, zobrazený v rozhraní příkazové řádky (command line interface, CLI), naznačující že má být zadán příkaz.
příkaz k importu (import statement)
Příkaz, který zpřístupní objekty ze zadaného modulu. Jsou tři formy tohoto příkazu (jméno mymod je fiktivní):
import mymod
importuje celý modul mymod,
from mymod import *
importuje vše z modulu mymod,
from mymod import f1, v1
importuje z modulu mymod jen objekt f1 a v1.
jmenný prostor (namespace)
Syntaktický kontejner, který umožňuje aby totéž jméno bylo součástí různých jmenných prostor bez víceznačností. Jmenné prostory v Pythonu tvoří moduly, třídy, funkce a metody.
jmenná kolize (naming collision)
Situace, při které nelze od sebe rozlišit dvě nebo více jmen v daném jmenném prostoru. Použítí
import string
místo
from string import *
zabrání jmenné kolizi.
atribut (attribute)
Proměnná, která je definovaná uvnitř modulu (nebo třídy či instance, jak uvidíme později). Atributy modulů jsou přistupné s použitím tečkového operátoru (.).
metoda (method)
Funkci podobný atribut objektu. Metody na objektu jsou invokovány (volány) s použitím tečkových operátorů, například:
>>> s = "this is a string"
>>> s.upper()
'THIS IS A STRING'
>>>
Říkáme, že metoda upper je invokována na řetězci s . Řetězec s je implicitně první argument pro metodu upper.
nestálá paměť (volatile memory)
Paměť, která k zachování stavu potřebuje stálý příkon elektrické energie. Hlavní paměť počítače, neboli RAM je nestálá. Informace, uložená v paměti RAM se ztratí při vypnutí počítače.
trvalá paměť (non-volatile memory)
Paměť, která svůj stav udržuje bez elektrické energie. Pevné disky, měnitelné disky a přepisovatelné kompaktní disky (CD-RW) jsou příklady nosičů s trvalou pamětí.
soubor (file)
Pojmenovaná záznamová entita, uložená na nosiči s trvalou pamětí, která obsahuje proud znaků.
mód (mode)
Určitý způsob operace v počítačovém programu. Soubory v Pythonu mohou být otevřeny v jednom ze tří módů: číst~read ('r'), psát~write ('w'), připojit~append ('a').
textový soubor (text file)
Soubor, který obsahuje tisknutelné znaky uspořádané do řádků oddělených znaky newline.
adresář či složka (directory or folder)
Pojmenovaná kolekce souborů či dalších adresářů. Adresáře uvnitř adresářů jsou označovány jako podadresáře (subdirectories).
argument příkazové řádky (command line argument)
Hodnota zadaná programu společně s jeho invokací z příkazové řádky (CLI).
argv
Zkratka pro argument vector a proměnná modulu sys, která obsahuje seznam argumentů, zadaných při běhu programu.

10.13 Cvičení

  1. Proveď následující:
    • Spusť server pydoc příkazem pydoc -g na příkazovém řádku.
    • Stiskni tlačítko open browser v okně pydoc tk.
    • Vyber modul calendar.
    • Ze sektoru Funkctions vyber a vyzkoušej:
      >>> import calendar
      >>> year = calendar.calendar(2008)
      >>> print year  # What happens here?
      
    • Experimentuj s funkcí calendar.isleap. Co očekává jako argument? Co vrací jako výsledek? O jaký druh funkce se jedná?
    Zapiš si poznatky, získané z tohoto cvičení.
  2. Nemáš-li na svém počítači instalován Tkinter, potom pydoc -g vrátí chybové hlášení, protože k otevření grafického okna Tkinter potřebuje. Jinou možnosí je spustit webový server přímo:

    $ pydoc -p 7464
    

    Toto spustí webový server pydoc na portu 7464. Nyní nasměruj svůj webový prohlížeč na:

    http://localhost:7464
    

    a budeš si moci prohlížet knihovny Pythonu instalované na svém pořítači.

    Použij tento postup ke spuštění pydoc a vyhledej modul math.

    1. Kolik funkcí je v modulu math?
    2. Co dělá math.ceil? A co dělá math.floor? (nápověda: jak floor tak ceil očekávají argument v plovoucí čárce.)
    3. Popiš, jak jsme počítali stejnou hodnotu jako math.sqrt bez použití modulu math.
    4. Jaké jsou dvě datové konstanty v modulu math?

    Dělej si podrobné poznámky o svém zkoumání v tomto cvičení.

  3. Použj pydoc k prozkoumání modulu copy. Co dělá deepcopy? Ve kterém cvičení z předchozí kapitoly by se nám deepcopy hodila?
  4. Vytvoř modul mymodule1.py. Přidej atribut myage se zadaným vlastním věkem a year se zadaným současným letopočtem. Vytvoř další modul mymodule2.py. Přidej atribut myage s nastavenou nulou a year s rokem tvého narození.

    Nyní vytvoř soubor namespace_test.py. Importuj oba výše uvedené moduly a napiš následující příkaz:
    print (mymodule2.myage - mymodule1.myage) == (mymodule2.year - mymodule1.year
    Spustíš-li namespace_test.py, dostaneš jako výstup buď True nebo False podle toho, zda jsi letos již narozeniny měl nebo neměl .
    
  5. Do modulů mymodule1.pymymodule2.py a namespace_test.py přidej následující příkaz:
    print "My name is %s" % __name__
    
    Spusť namespace_test.py. Co se stane? Proč? Nyní přidej následující kód na konec mymodule1.py:
    if __name__ == '__main__':
        print "This won't run if I'm  imported."
    
    Opět spusť mymodule1.py a namespace_test.py. Ve kterém případě vidíš nový příkaz k tisku?
  6. V prostředí IRP si vykoušej následující:
    >>> import this
    
    Co říká Tim Peter o jmenných prostorech? (english only)
  7. Použij pydoc k vyhledání a vyzkoušení tří dalších funkcí z modulu string. Zapiš si své poznatky.
  8. Přepiš matrix_mult z předchozí kapitoly s využitím znalostí o metodách na seznamech.
  9. Funkce dir, kterou jsme poznali v kapitole 7, vytiskne seznam atributů objektu zadaného jako argument. Jinými slovy, dir vrátí obsah jmenného prostoru argumentu.

    Použij dir(str) a dir(list) k nalezení nejméně tří metod na řetězci a seznamu, které nebyly dosud uvedeny. Prozatím ignoruj všechno, co začíná dvojitým podtržítkem (__). Pečlivě si zapisuj své poznatky včetně jmen nových metod a příkladů jejich použití.

    (nápověda: Vytiskni si dokumentační řetězec funkce, kteru chceš zkoumat. Například, abychom zjistili, jak pracuje str.join, zadáme příkaz print str.join.__doc__)

  10. V souvislé seanci vyvolej odezvy IRP k následujícím příkazům:
    1. >>> s = "If we took the bones out, it wouldn't be crunchy, would it?"
      >>> s.split()
      
    2. >>> type(s.split())
      
    3. >>> s.split('o')
      
    4. >>> s.split('i')
      
    5. >>> '0'.join(s.split('o'))
      
    Je důležité, abys každému výsledku porozuměl. Získané poznatky aplikuj při doplnění následující funkce s použitím metod split a join na objektech str:
    def myreplace(old, new, s ):
        """
        Replace all occurances of old with new in the string s.
    
           >>> myreplace(',', ';', 'this, that, and, some, other, thing')
           'this; that; and; some; other; thing'
           >>> myreplace(' ', '**', 'Words will now be separated by stars.')
           'Words**will**now**be**seperated**by**stars.'
        """
    
    Tvé řešení má projít oběma doctesty.
  11. Vytvoř modul wordtools.py s následujcím ukončením:
    if__name__ == '__main__':
        import doctest
        doctest.testmod()
    
    Vysvětli proč tento příkaz usnadňuje užití a testování vytvořeného modulu. Jaká bude hodnota __name__ při importu wordtools.py z jiného modulu? A jaká bude při spuštění wordtools.py jako hlavního programu? Ve kterém případě budou aktivovány doctesty?

    Nyní přidej těla ke každé z následujících funkcí tak, aby bylo vyhověno doctestům:
    def cleanword(word):
        """
          >>> cleanword('what?')
          'what'
          >>> cleanword('"now!"')
          'now'
          >>> cleanword('?+="word!,@$()"')
          'word'
        """
    
    def has_dashdash(s):
        """
          >>> has_dashdash('distance--but')
          True
          >>> has_dashdash('several')
          False
          >>> has_dashdash('critters')
          False
          >>> has_dashdash('spoke--fancy')
          True
          >>> has_dashdash('yo-yo')
          False
        """
    
    def extract_words(s):
        """
          >>> extract_words('Now is the time!  "Now", is the time? Yes, now.')
          ['now', 'is', 'the', 'time', 'now', 'is', 'the', 'time', 'yes', 'now']
          >>> extract_words('she tried to curtsey as she spoke--fancy')
          ['she', 'tried', 'to', 'curtsey', 'as', 'she', 'spoke', 'fancy']
        """
    
    def wordcount(word, wordlist):
        """
          >>> wordcount('now', ['now', 'is', 'time', 'is', 'now', 'is', 'is'])
          ['now', 2]
          >>> wordcount('is', ['now', 'is', 'time', 'is', 'now', 'is', 'the', 'is'])
          ['is', 4]
          >>> wordcount('time', ['now', 'is', 'time', 'is', 'now', 'is', 'is'])
          ['time', 1]
          >>> wordcount('frog', ['now', 'is', 'time', 'is', 'now', 'is', 'is'])
          ['frog', 0]
        """
    
    def wordset(wordlist):
        """
          >>> wordset(['now', 'is', 'time', 'is', 'now', 'is', 'is'])
          ['is', 'now', 'time']
          >>> wordset(['I', 'a', 'a', 'is', 'a', 'is', 'I', 'am'])
          ['I', 'a', 'am', 'is']
          >>> wordset(['or', 'a', 'am', 'is', 'are', 'be', 'but', 'am'])
          ['a', 'am', 'are', 'be', 'but', 'is', 'or']
        """
    
    def longestword(wordset):
        """
          >>> longestword(['a', 'apple', 'pear', 'grape'])
          5
          >>> longestword(['a', 'am', 'I', 'be'])
          2
          >>> longestword(['this', 'that', 'supercalifragilisticexpialidocious'])
          34
        """
    
    Modul si ulož pro použití nástrojů v jiných programech.

  12. Soubor unsorted_fruits.txt obsahuje seznam 26 druhů ovoce, přičemž každé jméno začíná jiným písmenem abecedy.

    Napiš program sort_fruits.py, který načte ovoce z unsorted_fruits.txt a zapíše je v abecedním pořádku do sorted_fruits.txt.

  13. Odpověz na následující otázky, týkající se countletters.py:
    1. Podrobně vysvětli činnost následujících tří řádků:
      infile = open('alice_in_wonderland.txt', 'r')
      text = infile.read()
      infile.close()
      
      Co vrátí příkaz type(text) po provedení oněch tří řádků?
    2. Jaký bude výsledek výrazu 128 * [0]? (Read about ASCII in Wikipedia) a vysvětli proč si myslíš že proměnná counts je přiřazena k 128 * [0] (in light of what you read).
    3. Co činí
      for letter in text:
          counts[ord(letter)] += 1
      
      s   counts?
    4. Vysvětli účel funkce display. Proč kontroluje hodnoty 10, 13, a 32? Co je na nich zvláštního?
    5. Popiš podrobně, co dělají řádky:
      outfile = open('alice_counts.dat', 'w')
      outfile.write("%-12s%s\n" % ("Character", "Count"))
      outfile.write("=================\n")
      
      Co bude obsahovat alice_counts.dat po jejich provedení?
    6. Konečně, vysvětli podrobně co
      for i in range(len(counts)):
          if counts[i]:
              outfile.write("%-12s%d\n" % (display(i), counts[i]))
      
      dělá. Jaký je účel if counts[i]?
  14. Napiš program alice_words.py, který vytvoří textový soubor alice_words.txt obsahující abecedně uspořádaný výpis slov z alice_in_wonderland.txt spolu s počtem výskytů každého slova. Prvních 10 řádek tvého výstupu by mohlo vypadat nějak takto:
    Word              Count
    =======================
    a                 631
    a-piece           1
    abide             1
    able              1
    about             94
    above             3
    absence           1
    absurd            2
    
    Kolikrát se v knize objeví slovo alice?
  15. Které je nejdelší slovo v Alice in Wonderland? Kolik má písmen?
  16. Napiš program mean.py, který na příkazovém řádku přijme číselné pořadí a vrátí jeho střední hodnotu.
    $ python mean.py 3 4
    3.5
    $ python mean.py 3 4 5
    4.0
    $ python mean.py 11 15 94.5 22
    35.625
    
    Vztah mezi vstupy a výstupy u tvého programu by měl být stejný jako v uvedené ukázce.
  17. Napiš program median.py který na příkazovém řádku přijme číselné pořadí a vrátí jeho prostřední hodnotu.
    $ python median.py 3 7 11
    7
    $ python median.py 19 85 121
    85
    $ python median.py 11 15 16 22
    15.5
    
  18. Uprav program countletters.py tak, že soubor k otevření přijme jako argument z příkazové řádky. Jak ošetříš pojmenování výstupního souboru?

previous up next hi englisch index