# Autor: Stanislav Geidl # C2184 Uvod do programovani v Pythonu # Domaci ukol 06 # Reseni: Vaclav Hejret # tato reseni jsou jedny z moznych """ # Jak pracovat s timto ukolem: Dle zadani dopiste funkcionalitu k jednotlivym funkcem. # Jak funguje testovani? Kazda funkce obsahuje dokumentaci s doctesty. """ # def fce(a): # """ # dokumentace zde # """ """ V teto dokumentaci je obsazen popis funkcionality dane funkce a pripadne vstupni promenne a jejich vyznam. Dale tato dokumentace obsahuje testovani: volani dane funkce s konkretnim parametrem >>> fce(1) # pote nasleduje ocekavana hodnota 2 Vice google: python doctest """ import math # NASLEDUJE ukazka def fce(a): """" Funkce fce vrati a+1. doctest zkusi pouzit a=1 a bude ocekavat jako vysledek 2 >>> fce(1) 2 Tedka zkusi 2 a bude ocekavat 3. >>> fce(2) 3 """ return a+1 def custom_sum(a, b): """ Funkce custom_sum() vrati soucet dvou parametru a, b nebo 0, pokud je soucet zaporny. Parametry a, b jsou cela cisla (integer). >>> custom_sum(5, 10) 15 >>> custom_sum(-5, 2) 0 """ #pokud je soucet vetsi nez 0, vrati ho if a + b >= 0: return a + b #pokud ne, vrati 0 return 0 def min_abs(list): """ Funkce min_abs() vrati ze zadaneho listu nejmensi absolutni hodnotu. >>> min_abs([-5, -2, 3, 8]) 2 >>> min_abs([-10, 1+1j, 2]) 1.4142135623730951 """ #iniciace noveho listu abs_list = [] for value in list: #pro kazdy prvek ze vstupniho listu prida doo noveho listu jeho absolutni hodnotu abs_list.append(abs(value)) #vrati minimalni hodnotu z noveho listu return min(abs_list) #alternativni zkraceny zapis #return min([abs(value) for value in list]) def remove_unique(list): """ Funkce remove_unique odstrani ze zadaneho listu unikatni hodnoty a vrati novy list. >>> remove_unique([1, 1, 2, 3]) [1, 1] >>> remove_unique([2, 3, 4, 3, 4, 8, 9, 0, 3, 9, 8]) [3, 4, 3, 4, 8, 9, 3, 9, 8] """ #iniciace noveho listu new_list = [] for value in list: #pro kazdy prvek v listu #pokud je pocet stejneho prvku v listu vetsi nez 1, prida ho do noveho listu if list.count(value) > 1: new_list.append(value) #vrati novy list bez unikatnich hodnot return new_list def weighted_mean(list, weight): """ Funkce weighted_mean pocita vazeny prumer ze zadaneho listu, tak ze prvni prvek je do prumeru zapocitan s vahou weight. Pro list [1, 2, 3] a weight 2 to znamena, ze 1 je zapocitana dvakrat a pocet prvku je tedy 4. >>> weighted_mean([1, 2, 3], 2) 1.75 >>> weighted_mean([2.3, 5.6, 1.2], 5) 2.6142857142857143 """ #secte nejprve vsechny prvky v listu suma = sum(list[1:]) #pote k sume pricte prvni prvek, vynasobeny jeho vahou suma += list[0]*weight #vydeli sumu delkou listu plus vahou - 1, jelikoz jedna vaha uz je zapoctena v puvodni delce listu weighted_mean = suma / (len(list)+weight-1) #vrati vazeny prumer return weighted_mean #alternativni zkraceny zapis #return (sum(list[1:]) + list[0]*weight) / (len(list)+weight-1) def goto(list, position): """ Funkce goto prejde na zadanou pozici position a prochazene prvky umisti na konec. Tato funkce pocita pozice od 1. >>> goto([1, 2, 3, 4, 5], 4) [4, 5, 1, 2, 3] >>> goto(['A', 'B', 'Q', 'Z'], 3) ['Q', 'Z', 'A', 'B'] """ #do noveho listu prida prvky od zadane pozice do konce retezce new_list = list[position-1:] #novy list rozsiri o prvky od zacatku retezce do zadane pozice new_list.extend(list[:position-1]) #vrati novy list return new_list def distance(a, b): """ Funkce distance spocita Euklidovskou vzdalenost pro 2 body v n-rozmernem prostoru definovane pomoci listu a, b. distace = sqrt((a1-b1)**2+(a2-b2)**2+...+(an-bn)**2) >>> distance([1,2,3],[2,4,5]) 3.0 >>> distance([12.6, 20.6, 3.3, 4.6], [2.8, 4.5, 5.9, 10.8]) 20.011246837716037 """ #iniciace noveho listu sqr = [] # for cyklus jdouci od nuly do delky zadaneho pole for i in range(len(a)): #do noveho listu prida rozdil prvku v obou zadanych listech na pozici dane indexem i a tento rozdil #umocni sqr.append((a[i]-b[i])**2) #provede sumu umocnenych rozdilu a celou sumu odmocni distance = math.sqrt(sum(sqr)) #vrati hodnotu vzdalenosti return distance def split_list(l, sep): """ Funkce split_list rozdeli vstupni list na jednotlive podlisty na zaklade zadaneho oddelovace. >>> split_list([False, "AATGCT", True, True, "GTAACT", False, True], 0) [['AATGCT', True, True, 'GTAACT'], [True]] """ """ >>> split_list([1, 2, 3, 1, 2, 3], 2) [[1], [3, 1], [3]] >>> split_list(['a', 'b', 'c', 'd', 'f'], 'c') [['a', 'b'], ['d', 'f']] >>> split_list(['abc', 0, 'ghd', 0, 'gws', 0], 0) [['abc'], ['ghd'], ['gws']]""" # iniciace novych list splitted = [] new = [] #projde vsechny prvky v listu for element in l: #pokud se hodnota prvku nerovna separatoru, prida ho do listu new if element != sep: new.append(element) #kdyz narazi na separator else: #kontrola, zda neni list new prazdny if new: #prida list new do listu splitted splitted.append(new) # a smaze hodnoty v listu new, aby mohl cyklud pokracovat prvky po separatoru new = [] #slouzi pro pridani new listu po poslednim separatoru, jelikoz uz se nevykona else podminka #opet kontroluje, zda neni new list prazdny if new: splitted.append(new) #vrati nasplitovany list return splitted """ alternativni reseni s =[] while len(l) > 0: if sep not in l: s.append(l) l=[] else: i = l.index(sep) if l[:i]: s.append(l[:i]) l = l[i+1:] return s """ def try_parse(string): """ Funkce try_parse prevede zadany text na cele cislo a bude ignorovat neciselne znaky na konci vstupniho parametru. >>> try_parse("2.5a") 2 >>> try_parse("123hp7") 123 >>> try_parse("5@") 5 >>> try_parse("6.3e-9") 6 >>> try_parse("") 0 >>> try_parse("abc") 0 """ # inicializace noveho listu new = [] #try, except blok pouzit kvuli tomu, kdyz by podminka if i.isdigit() nebyla splnena ani jednou, provede se #except blok, ktery vrati 0 try: for i in string: # pro kazdy prvek v retezci testuje, zda se jedna o cislo if i.isdigit(): # pokud ano, prida ho do noveho listu new.append(i) else: #pokud prvek neni cislo, cyklus skonci break #vrati spojeny novy seznam prevedeny na hodnotu integer return int("".join(new)) except: return 0 import doctest doctest.testmod()