Seznam (
Položkou seznamu může být i další seznam. Takový seznam se nazyvá vnořený seznam.
Nový seznam vytvoříme nejjednodušeji uzavřením položek do hranatých závorek:
[10, 20, 30, 40]# seznam se 4 čísly ["spam", "bungee", "swallow"]# 3 řetězce ["hello", 2.0, 5, [10, 20]]# řetězec, 2 čísla, seznam
Při práci se seznamem je důležité si uvědomit, že numerické typy (Kap. 2.2) představují jedinou hodnotu (singleton), složené datové typy (string, list, ...) mohou obsahovat žádnou, jednu, či více hodnot.
Seznamu uvnitř jiného seznamu říkáme, že je vnořený (nested). Vnořených seznamů může být v seznamu i více a to i nestejné délky, případně může seznam obsahovat prvky různých typů:
mli = [("a", 5.2), [7, True], range(5), "pešek", {2.5, 2}, b'R\xc5\xaf\xc5\xbe']
Konečně, existuje speciální seznam, který neobsahuje žádné položky. Nazývá se prázdný seznam a značí se [ ].
Stejně jako číselná hodnota 0 a prázdný řetězec, je prázdný seznam nepravdivý v booleovských výrazech:.
>>> bool(["hello", 2.0]) True >>> bool([]) False
Vytvořený seznam můžeme samozřejmě přiřadit k proměnné nebo zadat jako parametr či argument funkce.
>>> vocabulary = ["ameliorate", "castigate", "defenestrate"] >>> numbers = [17, 123] >>> empty = [] >>> print(vocabulary, numbers, empty) ['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
Funkce
>>> list("osel")# typ str ['o', 's', 'e', 'l'] >>> list(b"osel")# typ bytes [111, 115, 101, 108] >>> list(("a", 5, True))# typ tuple ['a', 5, True] >>> list(range(4))# typ range [0, 1, 2, 3] >>> list({"a", 5, True})# typ set [True, 5, 'a'] >>> list({"a":2, "b":False, "c":"d"})# typ dict ['a', 'b', 'c']
Při práci se seznamem s výhodou použijeme komprehenci seznamu (potažmo iteráblu) - viz odstavec 3.5.
Syntaxe pro přístup k položkám seznamu je stejná jako syntaxe pro přístup ke znakům řetězce – pomocí hranatých závorek s indexem. Nezapomeňte, že indexy začínají nulou:
>>> nested = ["hello", 123, [10,20]] >>> nested[1] 123
Jako index lze použít jakýkoli celočíselný výraz (integer):
>>> nested[9-8]# == 1 123 >>> nested[1.0]# lze zapsat: nested[int(1.0)] Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: list indices must be integers
Pokusíme-li se číst nebo psát položku, která neexistuje, dostaneme chybu při běhu programu:
>>> nested[3] Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list index out of range
Má-li index zápornou hodnotu, počítá se od konce seznamu:
>>> nested[-1] [10, 20] >>> nested[-3] 'hello' >>> nested[-4] Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list index out of range
Pro prvek vnořeného seznamu uvedeme rovněž jeho index:
>>> nested[2][1] 20
Je obvyklé použít proměnnou jako index seznamu:
horsemen = ["war", "famine", "pestilence", "death"] i = 0# proměnná pro smyčku - počítadlo while i < 4:
Tato smyčka počítá od 0 do 4. Jakmile má proměnná hodnotu 4, podmínka nevyhoví a smyčka končí. Takže tělo smyčky je provedeno pro i = 0, 1, 2 a 3.
Při každém cyklu smyčky je proměnná
Vestavěná funkce
>>> horsemen = ["war", "famine", "pestilence", "death"] >>> i = 0 >>>while i <len (horsemen):
I když jeden seznam může obsahovat další seznam, ten vnořený se stále počítá jako jedna položka. Délka tohoto seznamu je 4:
['spam!', 1, ['Brie', 'Roquefort', 'Pol le Veq'], [1, 2, 3]]
Traverzování i vnořeným seznamem popisuje text kap. 11.1.4
K výmazu položky ze seznamu použijeme příkaz
>>> a = ['one', 'two', 'three'] >>> del a[1]; a ['one', 'three'] >>> del a[-1]; a ['one']
Jako indexy pro
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f'] >>> del a_list[1:5] >>> print(a_list) ['a', 'f']
Jako obvykle, úseky vyberou všechny položky zadaného rozsahu, kromě horní meze.
Operátor + zřetězí seznamy:
>>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> c = a + b >>> print( c ) [1, 2, 3, 4, 5, 6]
Podobně, operátor * opakuje seznam v zadaném počtu:
>>> [0]*4 [0, 0, 0, 0] >>> [1, 2, 3]*3 [1, 2, 3, 1, 2, 3, 1, 2, 3]
První příklad opakuje [0] čtyřikrát. Druhý příklad opakuje seznam [1, 2, 3] třikrát.
Pro seznamy neexistuje modul
Metody -viz text Python List Methods: append, clear, copy, count, extend, index, insert, pop, remove, reverse, sort Funkce filter(), list(), range(), slice(), sorted() len(), max(), min()# společné pro všechny iterábly
Klíčové slovo
>>> horsemen = ['war', 'famine', 'pestilence', 'death'] >>> 'pestilence'in horsemen True >>> 'debauchery'in horsemen False
Protože
Můžeme použít slovo
>>> 'debauchery'not in horsemen True
Nejúčinější způsob je použití metody
>>> from itertools import chain >>> mli = [(2.5, 12, 3+2j), ("a", 5.2), [7, True], range(5), "pešek", {2.5, 2}, b'R\xc5\xaf\xc5\xbe'] >>> flat_list = list(itertools.chain(*mli)) >>> print('Flat_list =', flat_list) Flat_list = [2.5, 12, (3+2j), 'a', 5.2, 7, True, 0, 1, 2, 3, 4, 'p', 'e', 'š', 'e', 'k', 2.5, 2, 82, 197, 175, 197, 190]
Jak vidno z ukázky, tento postup odstraní vložené seznamy, entice a sety, jakož i převede sekvenci bajtů na sekvenci kódových bodů utf-8.
Nevýhodou je, že při výskytu solitérních numerických hodnot v základním seznamu je hlášena chyba
Tuto nevýhdu lze eliminovat vložením 'závadných' prvků do seznamu či entice, tak jak jsme právě učinili.
Pokud stojíme o zachování sekvence bajtů, můžeme použít tento postup:
>>> def flatten(obj): if isinstance(obj, list): for item in obj: yield from flatten(item) else: yield obj >>> print(list(flatten(mli))) [2.5, 12, (3+2j), ('a', 5.2), 7, True, range(0, 5), 'pešek', {2.5, 2}, b'R\xc5\xaf\xc5\xbe']
Jak vidno, tento postup zvládne solitérní numerické hodnoty a rozbalí vložený list ale to je vlastně všechno, co umí.
Operace s úseky, které jsme poznali u řetězců, platí také u seznamů:
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f'] >>> a_list[1:3] ['b', 'c'] >>> a_list[:4] ['a', 'b', 'c', 'd'] >>> a_list[3:] ['d', 'e', 'f'] >>> a_list[:] ['a', 'b', 'c', 'd', 'e', 'f']
Na rozdíl od řetězců jsou seznamy měnitelné, což znamená, že můžeme měnit jejich položky. Použitím závorkového operátoru [ ] můžeme měnit hodnotu položek:
>>> fruit = ["banana", "apple", "quince"] >>> fruit[0] = "pear" >>> fruit[-1] = "orange" >>> print(fruit) ['pear', 'apple', 'orange']
Přiřazení hodnoty položce seznamu se nazývá položkové přiřazení (item assignment).:
>>> my_list = ['T', 'E', 'S', 'T'] >>> my_list[2] = 'X' >>> my_list ['T', 'E', 'X', 'T']
Úsekovým operátorem můžeme změnit několik položek najednou:
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f'] >>> a_list[1:3] = ['x', 'y'] >>> print(a_list) ['a', 'x', 'y', 'd', 'e', 'f']
Můžeme také odstranit položky ze seznamu tím, že je nahradíme prázdným seznamem:
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f'] >>> a_list[1:3] = [] >>> print(a_list) ['a', 'd', 'e', 'f']
A můžeme také přidat položky do seznamu v zadaném místě:
>>> a_list = ['a', 'd', 'f'] >>> a_list[1:1] = ['b', 'c'] >>> print(a_list) ['a', 'b', 'c', 'd', 'f'] >>> a_list[4:4] = ['e'] >>> print(a_list) ['a', 'b', 'c', 'd', 'e', 'f']
Interní mechanizmus smyčky for - viz kap 5.3.
Použití smyčky
fruit = ["banana", "apple", "quince"]# proveďte v IDLE for ovocein fruit:
Měnitelnost seznamu nám umožňuje při jeho procházení (traverzování) upravit každou jeho položku. Následující kód vytvoří druhé mocniny čísel od 1 do 3:
numbers = [1, 2, 3]for elemin range (len (numbers)):
Výstup v IDLE:
======== RESTART: F:/Codetest/HowTo/trump_one.py ======== 1 --> 1, 2 --> 4, 3 --> 9,
Zamyslete se nad příkazem
Funkce
>>> for index, value in enumerate(['banana', 'apple', 'pear']): ... print(index, value ) ... 0 banana 1 apple 2 pear >>>
Jiné příklady využití funkce enumerate() - viz kap. 5.7.
Testem podnícený rozvoj (Test-driven development - TDD) je způsob vyvíjení programu, při kterém se postupuje po malých, automaticky ověřovaných krocích.
Tento postup si ukážeme na sestavení funkce, která vytvoří matici
Nejprve pro tuto funkci sestavime doctestest bez programového kódu a uložíme do souboru
ch09_matrices.py def make_matrix (rows, columns):""" >>> make_matrix(3,5) [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] """ if __name__ == '__main__':import doctest doctest.testmod()Poznámka: záhlaví a závěr skriptu nejsou v dalších úkázkách
z úsporných důvodů uváděny.
Provedení skriptu skončí neúspěchem:
******************************************************** File "matrices.py", line 3, in __main__.make_matrix Failed example: make_matrix(3, 5) Expected: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] Got nothing ********************************************************1 items had failures: 1 of 1 in __main__.make_matrix ***Test Failed*** 1 failures.
Test nebyl úspěšný proto, že tělo funkce obsahuje pouze dokumentační řetězec a žádný příkaz
Při použití TDD zpravidla píšeme ten nejjednodušší kód, který projde testem, v našem případě to je příkaz return:
def make_matrix (rows, columns):""" >>> make_matrix(3,5) [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] """ return [[0, 0, 0, 0, 0], [0, 0,0, 0, 0], [0, 0, 0, 0, 0]]
Při provedení tohoto skriptu rovněž neobstojíme i když dostáváme semanticky stejný ale formálně různý výsledek, lišící se v tom, že citované seznamy jsou různě dlouhé, ten druhý je delší o mezery mezi jednotlivými položkami - doctesty se někdy chovají podivně.
Doplníme tedy mezery do seznamu v dokumentačním řetězci a spuštěním skriptu si ověříme, že tentokrát je všechno v pořádku (
Rozteče argumentů příkazu return upravovat nemusíme, příkaz si je upraví sám.
Uvědomíme si ale, že funkce
def make_matrix (rows, columns):""" >>> make_matrix(3,5) [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] >>> make_matrix(4,2) [[0, 0], [0, 0], [0, 0], [0, 0]] """ return [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
Vida:
********************************************************* File "matrices.py", line 5, in __main__.make_matrix Failed example: make_matrix(4, 2) Expected: [[0, 0], [0, 0], [0, 0], [0, 0]] Got: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] *********************************************************1 items had failures: 2 of 2 in __main__.make_matrix ***Test Failed*** 1 failures.
Tato technika se nazývá
def make_matrix (rows, columns):""" >>> make_matrix(3,5) [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] >>> make_matrix(4,2) [[0, 0], [0, 0], [0, 0], [0, 0]] """ return [[0]* columns]* rows
Řešení formálně neuspokojí proceduru doctestu. Jevově jsou oba řádky stejné ale interně se budou zřejmě lišit počtem připojených (neviditelných) mezer. Řekněmež, že nám to nevadí.
Alternativní řešení téže úlohy má tuto skladbu:
def make_matrix (rows, columns):""" >>> make_matrix(3,5) [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] >>> make_matrix(4,2) [[0, 0], [0, 0], [0, 0], [0, 0]] """ matrix = []for rowin range(rows): matrix += [[0]* columns]return matrix
Použití TDD nám při našem programátorském snažení přináší několik výhod:
Funkci
def add_matrices (m1, m2): mx = make_matrix(len(m1), len(m1[0]))
Většina počítačových programů provádí při každém spuštění totéž, takže říkáme, že jsou deterministické.
Determinismus je obvykle dobrá věc, protože můžeme předpokládat, že stejný výpočet povede ke stejnému výsledku. U některých aplikacích si však přejeme, aby počítač byl nepředvídatelný. Hry jsou zřejmým příkladem, ale těch příkladů může být více.
Ukazuje se, že napsat program se skutečně nepředvídatelným chováním není snadné, ale jsou způsoby, kterak jej učinit alespoň zdánlivě nedeterministickým. Jedním ze způsobů je použití náhodných čísel. Python poskytuje vestavěnou funkci, která generuje pseudonáhodná čísla, která nejsou náhodná v přísně matematickém smyslu, ale pro naše účely postačí.
Modul
>>> import random >>> x = random.random(); print(x) 0.6046175579100934# jedno pseudo-náhodné číslo
Více náhodných hodnot můžeme vygenerovat pomocí funkce se smyčkou:
import randomdef rand (high):# high je celé číslo for iin range(high): x = random.random()# náhodné číslo v rozsahu [ 0.0, 1.0)
>>> rand(5) 4.161282917198089 0.2165885838598547 4.654892519196209 0.03348629706460993 3.686099655738407
Náhodná čísla mezi nulou a zadanou mezí
Podobným problémem jako vytvoření náhodného čísla je provedení náhodného výběru. Ten lze provést pomocí funkce
Každá invokace
>>> from random import choice >>> fokus = [("a"*3), "verpánek", {12, sum, True}] >>> choice(fokus), choice(fokus), choice(fokus) ('verpánek', 'aaa', {<built-in function sum>, 12, True})# 'aaa' je rozbalené ("a"*3) >>> pokus = ("a"*3), "verpánek", {12, sum, True} choice(pokus), choice(pokus), choice(pokus) ('aaa', 'aaa', {True, <built-in function sum>, 12})
Jak vidno, výběrová kolekce je typu
K vytvoření seznamu náhodných čísel, musíme od první chvíle vědět, v jakém rozsahu se generovaná náhodná čísla budou pohybovat [0 až 1) a kolik těch čísel má seznam obsahovat (zřejmě n). Jméno
Tělo funkce začíná vytvořením seznamu s
import randomdef randomList (n): s = [0] * n# počáteční seznam s nulami for iin range(n): s[i] = random.random()# náhrada nuly za náhodné číslo return s# seznam 'n' náhodných čísel
Voláním (invokací) této funkce pro
>>> randomList(6) [0.5199466739572948, 0.452751456638563, 0.41454566096564627, 0.7953941766158702, 0.3872848065377861, 0.9080198286105817]
Předpokládá se, že náhodná čísla, generovaná systémovou funkcí
Tento předpoklad si zkusíme ověřit napsáním programu, který rozdělí hodnoty do úseků a určí počet výskytů v jednotlivých úsecích, neboli jejich četnost.
Rozdělíme-li celý interval možných náhodných hodnot do stejně velikých úseků, a spočítáme-li výskyt náhodných hodnot v jednotlivých úsecích, měl by tento výskyt být všude přibližně stejný.
Označíme-li počet úseků (buckets) jménem
K výpočtu mezí jednotlivých úseků použijeme smyčku. Pro každý úsek určíme jeho spodní (low) a horní (high) hodnotu. Proměnná
bucketWidth = 1.0 / numBucketsfor iin range(numBuckets): low = i * bucketWidth high = low + bucketWidth
Při výpočtu dolní meze jednotlivého úseku (kyblíku) násobíme proměnnou smyčky podílem na jeden kyblík.
Horní mez je o
Pro
0.0 to 0.125 0.125 to 0.25 0.25 to 0.375 0.375 to 0.5 0.5 to 0.625 0.625 to 0.75 0.75 to 0.875 0.875 to 1.0
Chceme procházet vygenerovaným seznamem náhodných čísel [0.0 - 1.0) a určovat, kolik náhodných čísel zapadne do některého ze stanovených úseků (kyblíků, buckets). Řešení této úlohy si ukážeme ve dvou variantách. Pro první variantu si sestavíme funkci sami, pro druhou variantu je funkce již pro nás připravená.
Pro tuto variantu si sestavíme funkci
Vyjdeme z upravené sekvence příkazů ve cvičení 6.13.2, kde jména
V dalším kroku změníme předmět prověřování. Nezajímá nás výskyt písmen v řetězci ale chceme vědět, zda se hodnota proměnné
Za tím účelem doplníme smyčku
count = 0for numin list:# list vytvoříme funkcí randomList(n) if low < num < high: count = count + 1
Následně zapouzdříme upravený kód do funkce zvané
def inBucket (list, low, high): count = 0for numin list:if low < num < high: count = count + 1return count
Právě odvozenou funkci možná použijeme jako pomocnou funkci v dalším výpočtu. Musíme ale dořešit, kterak operativně dosazovat meze low a high pro jednotlivé úseky.
Pro záznam výskytů náhodných čísel v jednotlivých úsecích vytvoříme seznam
list =randomList (n)# seznam náhodných čísel numBuckets# alias b: počet úseků výskyty = [0] * numBuckets# počáteční seznam s nulami bucketWidth = 1.0 / numBuckets# číselný rozsah jednoho intervalu for iin range(numBuckets): low = i * bucketWidth# dolní mez intervalu high = low + bucketWidth# horní mez intervalu výskyty[i] = inBucket(list, low, high)
K hladkému provedení výše uvedeného skriptu musí mít interpret Pythonu k disposici importovaný modul
Nejlépe to zajistíme tak, že založíme soubor
Z výše uvedeného skriptu vytvoříme funkci
Když v interaktivní konzole IDLE provedeme volání
[138, 124, 128, 118, 130, 117, 114, 131]# SUMA = 1000
Tato čísla jsou docela blízká číslu
I když nám náš program chodí, mohl by chodit ještě lépe. Pokaždé, když volá funkci
Lepší by bylo projít seznamem jen jednou a pro každou hodnotu náhodného čísla určit rovnou index úseku (neboli index položky seznamu
Idea výhodnějšího řešení spočívá v tom, že náhodné číslo
Vytvořenou funkci
def buckets_b (n,b): výskyty = [0] * b# akumulátor list = randomList(n)# volání funkce for iin list: index = int(i * b)# zaokrouhlení dolů výskyty[index] = výskyty[index] + 1
Výstupem z funkce
[111, 132, 144, 127, 114, 123, 130, 119]# SUMA = 1000
['spam!', 1, ['Brie', 'Roquefort', 'Pol le Veq'], [1, 2, 3]]a vytiskne délku každé položky. Co se stane, zadáme-li funkci
# zde napište zadání úlohy""" # zde překopírujte doctest úlohy """ # zde napište řešení úlohy
Podle naznačených výsledků sestavte možnou hodnotu seznamu
""" >>> a_list[3] 42 >>> a_list[6] 'Ni!' >>> len(a_list) 8 """
Podle naznačených výsledků sestavte možnou hodnotu seznamu
""" >>> b_list[1:] ['Stills', 'Nash'] >>> group = b_list + c_list >>> group[-1] 'Young' """
Podle naznačených výsledků sestavte možnou hodnotu seznamu
""" >>> 'war' in mystery_list False >>> 'peace' in mystery_list True >>> 'justice' in mystery_list True >>> 'oppression' in mystery_list False >>> 'equality' in mystery_list True """
Vytvořte funkci
""" >>> list_range(a, b, c) [5,9,13,17] """
>>> range(10, 0, -2)
Po opětovném prostudování odstavce 4.8 napište funkci
a = [1, 2, 3] b = a[:] b[0] = 5
this = ['I', 'am', 'not', 'a', 'crook'] that = ['I', 'am', 'not', 'a', 'crook'] print("Test 1: %s" % (id(this) == id(that))) that = this print("Test 2: %s" % (id(this) == id(that)))Přidejte podrobné vysvětlení výsledků.
Určete hodnoty proměnných
""" >>> 13 in junk True >>> del junk[4] >>> junk [3, 7, 9, 10, 13, 17, 21, 24, 27] >>> del junk[a:b] >>> junk [3, 7, 27] """
Nakreslete schema seznamu
""" >>> nlist[2][1] 0 >>> nlist[0][2] 17 >>> nlist[1][1] 5 """
Podle výstupu z metody
""" >>> retiazka.split() ['this', 'and', 'that'] """
def add_lists (a, b): """ >>> add_lists([1,1], [1,1]) [2, 2] >>> add_lists([1,2], [1,4]) [2, 6] >>> add_lists([1,2,1], [1,4,3]) [2, 6, 4] """
Fce
def mult_lists (a, b): """ >>> mult_lists([1,1], [1,1]) 2 >>> mult_lists([1,2], [1,4]) 9 >>> mult_lists([1,2,1], [1,4,3]) 12 """
Ověřte si, že fce
Řešení musí zajisté vyhovovat doctestům. Použije sedef replace (s, old, new): """ >>> replace ('Mississippi','i', 'I') 'MIssIssIppI' >>> s = 'I love spom! Spom is my favorite food. Spom, spom, spom, yum!' >>> replace(s, 'om', 'am') 'I love spam! Spam is my favorite food. Spam, spam, spam, yum!' >>> replace(s, 'o', 'a') 'I lave spam! Spam is my favarite faad. Spam, spam, spam, yum!' """
>>> nums = [1, 2, 3, 4] >>> [x**3 for x in nums]
>>> nums = [1, 2, 3, 4] >>> [x**2 for x in nums if x**2 != 4]
>>> nums = [1, 2, 3, 4] >>> [(x, y) for x in nums for y in nums]
>>> nums = [1, 2, 3, 4] >>> [(x, y) for x in nums for y in nums if x != y]
def add_row (matrix): """ >>> m = [[0,0], [0,0]] >>> add_row(m) [[0, 0], [0, 0], [0, 0]] >>> n = [[3, 2, 5], [1, 4, 7]] >>> add_row(n) [[3,2,5], [1,4,7], [0,0,0]] >>> n [[3,2,5], [1,4,7]] """def add_column (matrix): """ >>> m = [[0,0], [0,0]] >>> add_column(m) [[0,0,0], [0,0,0]] >>> n = [[3,2], [5,1], [4,7]] >>> add_column(n) [[3,2,0], [5,1,0], [4,7,0]] >>> n [[3,2], [5,1], [4,7]] """
Všimněte si, že poslední doctesty v každé funkci ověřují, že
Poslední dva doctesty opět potvrzují, žedef add_matrices (m1, m2): """ >>> a = [[1,2], [3,4]] >>> b = [[2,2], [2,2]] >>> add_matrices(a, b) [[3,4], [5,6]] >>> c = [[8,2], [3,4], [5,7]] >>> d = [[3,2], [9,2], [10,12]] >>> add_matrices(c, d) [[11,4], [12,6], [15,19]] >>> c [[8,2], [3,4], [5,7]] >>> d [[3,2], [9,2], [10,12]] """
def scalar_mult (n, m): """ >>> a = [[1,2], [3,4]] >>> scalar_mult(3, a) [[3, 6], [9, 12]] >>> b = [[3,5,7], [1,1,1], [0,2,0], [2,2,3]] >>> scalar_mult(10, b) [[30, 50, 70], [10, 10, 10], [0, 20, 0], [20, 20, 30]] >>> b [[3, 5, 7], [1, 1, 1], [0, 2, 0], [2, 2, 3]] """
def matrix_mult (m1, m2): """ >>> matrix_mult([[1,2], [3,4]], [[5,6], [7,8]]) [[19, 22], [43, 50]] >>> matrix_mult([[1,2,3], [4,5,6]], [[7,8], [9,1], [2,3]]) [[31, 19], [85, 55]] >>> matrix_mult([[7,8], [9,1], [2,3]], [[1,2,3], [4,5,6]]) [[39, 54, 69], [13, 23, 33], [14, 19, 24]] """
expression = input("Zadej booleovský výraz \ pro 'p' a 'q' : " ) print(" p q %s" % expression) delka = len(" p q %s" % expression) print(delka* "=") for p in True, False: for q in True, False: print("%-7s %-7s %-7s" % (p, q, eval(expression)))Tento skript použijeme pro osvojení booleovských výrazů. Uložte program do souboru
p q p or q ------------------------ True True True True False True False True True False False False
Funkci zavoláme z konzoly IDLE:def truth_table (expression): print(" p q %s" % expression) delka = len(" p q %s" % expression) print(delka* "=") for p in True, False: for q in True, False: print("%-7s %-7s %-7s" % (p, q, eval(expression)))
>>> truth_table ("p or q") p q p or q ------------------------ True True True True False True False True True False False FalseVyzkoušejte si fci
Které výrazy jsou logicky eqvivalentní?
Napište fci
Uložte ji do souboru
>>> is_divisible(20,4) Toto číslo je dělitelné číslem 4 >>> is_divisible(21,8) Toto číslo neni dělitelné číslem 8
Při řešení použijete podmínky