![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
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.
K prohledávání knihoven Pythonu, instalovaných na počítači, slouží příkaz pydoc. Na příkazový řádek napíšeme:
$ pydoc -ga 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í!
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ě.
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í.
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.
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í.
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.
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.
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.
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.
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.
| |
| |
| |
| |
import mymod
importuje celý modul mymod,
from mymod import *importuje vše z modulu mymod, from mymod import f1, v1importuje z modulu mymod jen objekt f1 a v1. |
| |
import string
místo
from string import *zabrání jmenné kolizi. |
| |
>>> 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. |
| |
| |
| |
| |
| |
| |
| |
sys, která obsahuje seznam argumentů, zadaných při běhu programu.
|
open browserv okně pydoc tk.
>>> import calendar
>>> year = calendar.calendar(2008)
>>> print year # What happens here?
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.
Dělej si podrobné poznámky o svém zkoumání v tomto cvičení.
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 .
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?
>>> import thisCo říká Tim Peter o jmenných prostorech? (english only)
>>> s = "If we took the bones out, it wouldn't be crunchy, would it?" >>> s.split()
>>> type(s.split())
>>> s.split('o')
>>> s.split('i')
>>> '0'.join(s.split('o'))
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.
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?
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.
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.
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ů?for letter in text: counts[ord(letter)] += 1s counts?
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í?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]?
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 2Kolikrát se v knize objeví slovo alice?
Alice in Wonderland? Kolik má písmen?
$ python mean.py 3 4 3.5 $ python mean.py 3 4 5 4.0 $ python mean.py 11 15 94.5 22 35.625Vztah mezi vstupy a výstupy u tvého programu by měl být stejný jako v uvedené ukázce.
$ python median.py 3 7 11 7 $ python median.py 19 85 121 85 $ python median.py 11 15 16 22 15.5
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |