#!/usr/bin/python -tt #======= #Crediti #======= # esercizi corso di python @ifac-cnr # Copyright 2012 Nicola Zoppetti # Licensed under the Apache License, Version 2.0 # http://www.apache.org/licenses/LICENSE-2.0 #==================== #Indicazioni generali #==================== # RIEMPIRE LE FUNZIONI # DOVE COMPARE IL COMMENTO # +++METTI QUI IL TUO CODICE+++ # Seguire le istruzioni riportate nel commento # precedente ciascuna funzione da riempire # Una volta studiata una soluzione ad un esercizio, per verificare se è corretta eseguire QUESTO SCRIPT # per un generico 'esercizio 1', se la soluzione è errata o non data # sullo standard output viene stampato il prefisso KO, il valore restituito e quello atteso # >>> esercizio 1 # >>> KO restituisce: None, risultato atteso: [98, 55, 10, 8, 2] # # Se la soluzione è corretta: # sullo standard output viene stampato OK # >>> esercizio 1 # >>> OK #=============== #INIZIO ESERCIZI #=============== # ------------------------- # quattroarg # ------------------------- # definire una funzione che accetta quattro argomenti con nome # a1,a2,a3,a4 # e restituire una lista che contiene i quattro argomenti nell'ordine # invertito # Esempi: # >>>quattroarg('1',2,'ciao',4.55) # [4.55,'ciao',2,'1'] ##-INIZIO-SOLUZIONE-NF-## def quattroarg(a1,a2,a3,a4): return [a4,a3,a2,a1] ##-FINE-SOLUZIONE-## # --------------------------- # quattroargdefault # --------------------------- # definire una funzione che usa la precedente funzione # e che # - accetta quattro argomenti con i seguenti nomi ed ordine b1,b2,b3,b4 # - associa i parametri a della prec. funz. ai parametri # b nel seguente modo: a1=b1 , a2=b2 , a3=b3 , a4=b4 # - se sono passati solo 3 parametri usa per b4 il valore 0 # suggerimento: # - nel corpo della nuova funzione usare la funzione soluzione # del precedente esercizio con argomenti passati per nome # - negli argomenti della nuova funzione usare un default per b4 # # Esempi: # >>> quattroargcondefault('1',2,'ciao',4.55) # [4.55, 'ciao', 2, '1']) # >>> quattroargcondefault('1',2,'ciao') # [0, 'ciao', 2, '1']) ##-INIZIO-SOLUZIONE-NF-## def quattroargcondefault(b1,b2,b3,b4=0): return quattroarg(a1=b1,a2=b2,a3=b3,a4=b4) #oppure #return quattroarg(b4,b1,b2,b3) ##-FINE-SOLUZIONE-## # --------------- # nargposizionali # --------------- # definire una funzione che accetta un numero variabile # di parametri passati per posizione e che restituisce una lista # che ha come primo elemento il numero di parametri e a seguire i parametri # passati alla funzione # Esempi: # >>> nargposizionali('a','b','c') # [3,'a','b','c'] ##-INIZIO-SOLUZIONE-NF-## def nargposizionali(*args): return [len(args)]+list(args) ##-FINE-SOLUZIONE-## # --------------- # sommaargposizionali # --------------- # definire una funzione che accetta un numero variabile # di parametri passati per posizione (almeno 1) e che restituisce la 'somma' di tutti gli argomenti # Esempi: # >>> sommaargposizionali('a','b','c',' prova') # 'abc prova' # >>> sommaargposizionali(1,2,3) # 6 ##-INIZIO-SOLUZIONE-NF-## def sommaargposizionali(*args): retval = args[0] for a in args[1:]: retval += a return retval ##-FINE-SOLUZIONE-## # --------------- # nargpernome # --------------- # definire una funzione che accetta un numero variabile # di parametri passati per nome e restituisce una lista # dove il primo elemento è il numero di parametri e a seguire ci sono delle touple di due elementi # il cui primo elemento è una stringa che contiene il nome del parametro ed il secondo contiene # il valore del parametro. # le tuple nella lista sono ordinate per chiave # # Esempi: # >>> nargpernome(a='a' , b='b' , c='c' ,d=1) # [4,('a','a'),('b','b'),('c','c'),('d',1)] # >>> nargpernome(x=1,y=2,z=3,k='1') # [4,('x',1),('y',2),('z',3),('k','1')] ##-INIZIO-SOLUZIONE-NF-## def nargpernome(**kwargs): return [len(kwargs)] + sorted([(k,v) for k,v in kwargs.items()]) ##-FINE-SOLUZIONE-## # --------------- # conta_val_inargs # --------------- # definire una funzione che accetta come primo argomento # una generica variabile var seguita da un numero imprecisato di argomenti # posizionali e da un numero imprecisato di parametri passati per nome # La funzione restituisce una lista che ha come primo elemento il numero di volte che val # compare tra gli argomenti posizionali e come secondo numero il numero di volte che val # compare tra gli argomenti passati per nome # Esempi: # >>>conta_val_inargs(1,2,3,1,1,1,d=2,c=3,e=1,m=1) # [3,2] # >>>conta_val_inargs(1,2,3,1,1,1) # [3,0] # >>>conta_val_inargs(1,d=2,c=3,e=1,m=1) # [0,2] ##-INIZIO-SOLUZIONE-NF-## def conta_val_inargs(val,*args,**kwargs): return [args.count(val) , list(kwargs.values()).count(val)] ##-FINE-SOLUZIONE-## # ---------------- # applicafunc2list(func) # ---------------- # definire la funzione applicafunc2list che data una lista globale di nome L # applica ai soli elementi pari della lista L una generica funzione 'func' # passata come unico argomento della lista. # La funzione restituisce una nuova lista con i valori degli elementi con indice pari # modificati rispetto alla lista L. # Esempi: # >>>L = [-2,-3,-4,-5,-6,-7] # >>>applicafunc2list(abs) # [2,-3,4,-5,6,-7] # # >>>L = list('ciaociao') # >>>applicafunc2list(str.capitalize) # ['C','i','A','o','C','i','A','o'] def applicafunc2list(func): ##-INIZIO-SOLUZIONE-## #global L #non strettamente necessaria visto che non modifico L che si comporta quindi #come una 'variabile libera' newL = list() #L è una free variable for i,v in enumerate(L): if i%2 == 0: newL.append(func(v)) else: newL.append(v) return newL #copiare lista L #iterare solosu indici pari ##-FINE-SOLUZIONE-## # ---------------- # applicafunc2list_bis(func,L) # ---------------- # come la precedente ma le modifiche sono effettuate in-place in L, passata come parametro # e la funzione restituisce il numero degli elementi modificati # Esempi: # >>>L = [-2,-3,-4,-5,-6,-7] # >>>applicafunc2list(abs) # 3 # >>>L # [2,-3,4,-5,6,-7] # # >>>L = list('ciaociao') # >>>applicafunc2list(str.capitalize) # 4 # >>>L # ['C','i','A','o','C','i','A','o'] def applicafunc2list_bis(func,L): ##-INIZIO-SOLUZIONE-## n = 0 for i,v in enumerate(L): if i%2 == 0: L[i] = func(v) n += 1 return n ##-FINE-SOLUZIONE-## # ---------------- # fattoriale(n) # ---------------- # restituire il vattoriale di n [n*(n-1)*.....] # gestire i casi particolari vedere gli esempi sotto # # Esempi: # >>>fattoriale(5) # 120 # >>>fattoriale(-5) ## convertire a numero positivo # 120 # >>>fattoriale(0) # 1 # >>>fattoriale('-5') # 120 # >>>fattoriale(5.67) # 120 def fattoriale(n): ##-INIZIO-SOLUZIONE-## #converto n a intero if n == 0: return 1 else: n = abs(int(n)) return n*fattoriale(n-1) ##-FINE-SOLUZIONE-## #------------------------------------------ #findsubstrings(subs,listastringhe,[results]) #------------------------------------------ # cerca l'occorrenza della stringa subs nelle stringhe # contenute nella lista di stringhe listastringhe # aggiunge le stringhe in cui la ricerca ha dato esito positivo alla lista # results che è un parametro opzionale # Esempi: # >>> findsubstrings("pi",['piadina','arpia','prezzemolo','rinpinguare']) # ['piadina', 'arpia', 'rinpinguare'] # >>> findsubstrings("pi",['Privato','Piacere','tovaglia','carpiato']) # ['carpiato'] # >>> findsubstrings("pi",['pistone'],['carpiato']) # ['carpiato', 'pistone'] ##-INIZIO-SOLUZIONE-NF-## def findsubstrings(subs,listastringhe,results=None): if results == None : results = [] for s in listastringhe: if s.find(subs) >= 0: results.append(s) return results ##-FINE-SOLUZIONE-## #------------------------ #mcd(a,b) #------------------------ # determinare il massimo comun divisore di due numeri usando l'algoritmo di Euclide: # Dati due numeri naturali a e b, si controlla se b è zero. # Se lo è, a è il MCD. Se non lo è, si divide a / b e si assegna ad r il resto della divisione # Se r = 0 allora si può terminare affermando che b è il MCD cercato, # altrimenti occorre assegnare a = b e b = r e si ripete nuovamente la divisione. # # # Esempi: # >>> mcd(84, 18) # 6 # >>> mcd(112, 42) # 14 # >>> mcd(5, 4) # 1 def mcd(a, b): ##-INIZIO-SOLUZIONE-## #aggiungere il controllo di ordinamento a,b?!! if b == 0: return a else: return mcd(b,a%b) ##-FINE-SOLUZIONE-## #------------------------ # def test_palindroma(s) #------------------------ # Una stringa si dice palindroma quando rimane identica # leggendola nelle due direzioni (inizio ->fine) (fine ->inizio) # creare una funzione in grado di riconoscere una stringa palindroma # Esempi # >>> test_palindroma("Racecar") # True # >>> test_palindroma("Never") # False # >>> test_palindroma("level") # True # >>> test_palindroma("") # True # >>> test_palindroma("a") # True def test_palindroma(s): ##-INIZIO-SOLUZIONE-## if len(s) <=1 : return True else: if s[0].lower() == s[-1].lower(): return test_palindroma(s[1:-1]) else: return False ##-FINE-SOLUZIONE-## #============== # FINE ESERCIZI #============== # NON MODIFICARE DA QUI IN POI!!!!!!!! # FUNZIONE test() usata in main() per stampare # cosa restituisce ciascuna funzione vs. cosa dovrebbe restituire quella corretta def test(got, expected): if got == expected: prefix = ' OK ' print(' OK') else: prefix = ' KO ' print(' %s restituisce: %s, risultato atteso: %s' % (prefix, repr(got), repr(expected))) def test_float(got,expected,eps=1.e-6): if got == None: print(' KO restituisce: None, risultato atteso: %s' % (repr(expected))) return if abs(got-expected)< eps: prefix = ' OK ' print(' OK') else: #print('KO') prefix = ' KO ' print('%s restituisce: %s, risultato atteso: %s' % (prefix, repr(got), repr(expected))) def test_quiz(got,expected): if got == expected: print(' OK, RISPOSTA ESATTA') else: print(' KO, RISPOSTA SBAGLIATA') # chiama le funzioni-soluzione con argomenti fissati e # confronta i risultati con quelli attesi def main(): print('quattroarg') if quattroarg.__code__.co_argcount != 4 : print(' KO, il numero degli argomenti non corrisponde alle specifiche') else: if quattroarg.__code__.co_varnames != ('a1', 'a2', 'a3', 'a4') : print(' KO, il nome degli argomenti non corrisponde alle specifiche') test(quattroarg('1',2,'ciao',4.55),[4.55,'ciao',2,'1']) print('') print('quattroargcondefault') if quattroargcondefault.__code__.co_argcount != 4 : print(' KO, il numero degli argomenti non corrisponde alle specifiche') else: if quattroargcondefault.__code__.co_varnames != ('b1', 'b2', 'b3', 'b4') : print(' KO, il nome degli argomenti non corrisponde alle specifiche') test(quattroargcondefault('1',2,'ciao',4.55),[4.55, 'ciao', 2, '1']) test(quattroargcondefault('1',2,'ciao'),[0, 'ciao', 2, '1']) print('') print('nargposizionali') try: test(nargposizionali(1,2,3,[4,5]),[4, 1, 2, 3, [4, 5]]) test(nargposizionali(*list(range(6))),[6, 0, 1, 2, 3, 4, 5]) test(nargposizionali(list(range(6))),[1, [0,1,2,3,4,5]]) except Exception as e: print(' KO: ',e) print('') print('sommaargposizionali') try: test(sommaargposizionali('a','b','c',' prova'),'abc prova') test(sommaargposizionali(1,2,3),6) except Exception as e: print(' KO: ',e) print('') print('nargpernome') try: test(nargpernome(a='a',b='b',c='c',d=1),[4,('a','a'),('b','b'),('c','c'),('d',1)]) test(nargpernome(k='1',x=1,y=2,z=3) ,[4,('k','1'),('x',1) ,('y',2) ,('z',3)]) except Exception as e: print(' KO: ',e) print('conta_val_inargs') try: test(conta_val_inargs(1,2,3,1,1,1,d=2,c=3,e=1,m=1),[3,2]) test(conta_val_inargs(1,2,3,1,1,1),[3,0]) test(conta_val_inargs(1,d=2,c=3,e=1,m=1),[0,2]) except Exception as e: print(' KO: ',e) print('') print('applicafunc2list') global L L = [-2,-3,-4,-5,-6,-7] test(applicafunc2list(abs),[2,-3,4,-5,6,-7]) test(L , [-2,-3,-4,-5,-6,-7]) L = list('ciaociao') test(applicafunc2list(str.capitalize),['C','i','A','o','C','i','A','o']) test(L , list('ciaociao')) print('') print('applicafunc2list_bis') L = [-2,-3,-4,-5,-6,-7] test(applicafunc2list_bis(abs,L),3) test(L , [2,-3,4,-5,6,-7]) L = list('ciaociao') test(applicafunc2list_bis(str.capitalize,L),4) test(L , ['C','i','A','o','C','i','A','o']) print('') print('fattoriale') test(fattoriale(-5),120) test(fattoriale(5),120) test(fattoriale(0),1) test(fattoriale('-5'),120) test(fattoriale(5.67),120) print('') print('findsubstrings') try: test(findsubstrings("pi",['piadina','arpia','prezzemolo','rinpinguare']), ['piadina', 'arpia', 'rinpinguare']) test(findsubstrings("pi",['Privato','Piacere','tovaglia','carpiato']), ['carpiato']) test(findsubstrings("pi",['pistone'],['carpiato']), ['carpiato', 'pistone']) except Exception as e: print(' KO: ',e) print('') print('mcd') test(mcd(84, 18),6) test(mcd(112, 42),14) test(mcd(5, 4),1 ) print('') print('test_palindroma') test(test_palindroma("Racecar"),True) test(test_palindroma("Never"),False) test(test_palindroma("level"),True) test(test_palindroma(""),True) test(test_palindroma("a"),True) #variabile globale necessaria al funzionamento di L=[] # Standard boilerplate to call the main() function. if __name__ == '__main__': main()