Python: Funzioni (Soluzioni)ΒΆ
Soluzione: lo stesso tipo del valore che gli passo! La funzione restituisce il valore dell’argomento senza toccarlo.
- un intero.
- un dizionario.
- una lista.
- un razionale.
Soluzione: la somma o concatenazione dei due argomenti. Quindi:
- un intero.
- una lista.
- una stringa.
Soluzione:
def stampa_pari_dispari(numero): if numero % 2 == 0: print "pari" else: print "dispari" stampa_pari_dispari(98) stampa_pari_dispari(99)
Occhio che
stampa_pari_dispari()
stampa gia’ da se’ a schermo, non e’ necessario fare:print stampa_pari_dispari(99)
altrimenti Python stampera’:
pari None
Il
None
viene dalprint
aggiuntivo: visto chestampa_pari_dispari()
non hareturn
, il suo risultato e’ sempreNone
. Ilprint
aggiuntivo stampa proprio questoNone
.Soluzione:
def calcola_pari_dispari(numero): if numero % 2 == 0: return "pari" else: return "dispari" print calcola_pari_dispari(98) print calcola_pari_dispari(99)
In questo caso invece, visto che non c’e’ nessun
print
incalcola_pari_dispari()
, e’ necessario aggiungere a mano unprint
che ne stampi il risultato!Soluzione:
def controlla_alfanumerico(stringa): caratteri_alfanumerici = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" alfanumerica = True for carattere in stringa: if not carattere in caratteri_alfanumerici: alfanumerica = False return alfanumerica # testo la funzione print controlla_alfanumerico("ABC123") print controlla_alfanumerico("A!%$*@")
Posso anche usare
break
per interrompere il ciclofor
appena trovo un carattere alfanumerico (e’ impossibile che una stringa dove ho appena trovato un carattere non-alfanumerico ridiventi alfanumerica), cosi’:def controlla_alfanumerico(stringa): caratteri_alfanumerici = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" alfanumerica = True for carattere in stringa: if not carattere in caratteri_alfanumerici: alfanumerica = False break # <-- esco dal for # <-- il break mi fa arrivare qui return alfanumerica # testo la funzione print controlla_alfanumerico("ABC123") print controlla_alfanumerico("A!%$*@")
In alternativa, visto che quando faccio
break
arrivo direttamente alreturn
, posso saltare un passaggio e fare direttamentereturn
:def controlla_alfanumerico(stringa): caratteri_alfanumerici = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" for carattere in stringa: if not carattere.upper() in caratteri_alfanumerici: # ho incontrato un carattere non alfanumerico # posso rispondere False return False # arrivo alla fine del for solo se non ho mai fatto `return`, il # che succede solo se la condizione dell'`if` e' sempre stata False # per tutti i caratteri: vuol dire che sono tutti caratteri alfanumerici # rispondo True return True # testo la funzione print controlla_alfanumerico("ABC123") print controlla_alfanumerico("A!%$*@")
Soluzione:
def domanda(): percorso = raw_input("scrivi un percorso: ") print open(percorso).readlines() # la testo domanda()
Soluzione:
def wc(stringa): num_caratteri = len(stringa) num_a_capo = stringa.count("\n") num_parole = len(stringa.split()) # split rompe sia sugli spazi che sugli a-capo return (num_caratteri, num_a_capo, num_parole) # la testo print wc("sono\nuna bella\nstringa")
Soluzione:
def stampa_dizionario(un_dizionario): # l'ordine in cui vanno stampate le righe non importa, percio' # posso usare l'ordine naturale in cui mi vengono fornite da # `items()` for chiave, valore in un_dizionario.items(): print chiave, "->", (str(valore * 100.0) + "%") # la testo dizionario = { "arginina": 0.7, "lisina": 0.1, "cisteina": 0.1, "istidina": 0.1, } stampa_dizionario(dizionario)
Soluzione:
def stampa_dizionario_ordinato(un_dizionario): # estraggo le chiavi e le ordino chiavi_ordinate = un_dizionario.keys() chiavi_ordinate.sort() # ora stampo le coppie chiave-valore in ordine for chiave in chiavi_ordinate: valore = un_dizionario[chiave] print chiave, "->", (str(valore * 100.0) + "%") # la testo dizionario = { "arginina": 0.7, "lisina": 0.1, "cisteina": 0.1, "istidina": 0.1, } stampa_dizionario_ordinato(dizionario)
Soluzione:
# presa dall'esempio def calcola_fattoriale(n): fattoriale = 1 for k in range(1, n+1): fattoriale = fattoriale * k return fattoriale def crea_lista_di_fattoriali(n): lista_di_fattoriali = [] for i in range(n): lista_di_fattoriali.append(calcola_fattoriale(i)) return lista_di_fattoriali # la testo print crea_lista_di_fattoriali(2) print crea_lista_di_fattoriali(4) print crea_lista_di_fattoriali(6)
qui ho riutilizzato la funzione
calcola_fattoriale()
definita in uno degli esempi.Soluzione:
def conta_carattere(testo, carattere_voluto): conta = 0 for carattere in testo: if carattere == carattere_voluto: conta += 1 return conta # la testo print conta_carattere("abbaa", "a") print conta_carattere("abbaa", "b") print conta_carattere("abbaa", "?")
oppure, piu’ semplicemente, posso sfruttare
count()
:def conta_carattere(testo, carattere_voluto): return testo.count(carattere_voluto) # la testo print conta_carattere("abbaa", "a") print conta_carattere("abbaa", "b") print conta_carattere("abbaa", "?")
Soluzione:
def conta_caratteri(testo, caratteri_voluti): conta = {} for carattere_voluto in caratteri_voluti: conta[carattere_voluto] = conta_carattere(testo, carattere_voluto) return conta # la testo print conta_caratteri("abbaa", "ab?")
dove ho riutilizzato la funzione dell’esercizio precedente.
Soluzione:
def distanza(coppia1, coppia2): x1, y1 = coppia1 x2, y2 = coppia2 dx = x1 - x2 dy = y1 - y2 return (float(dx)**2 + float(dy)**2)**0.5 # la testo print distanza((0, 0), (1, 1)) print distanza((2, 3), (3, 2))
Soluzione:
def sottostringa(prima, seconda): return seconda in prima # la testo print sottostringa("ACGT", "T") print sottostringa("ACGT", "x")
Soluzione:
def sottostringhe_non_vuote(stringa): sottostringhe = [] # tutte le possibili posizioni in cui far iniziare la sottostringa for inizio in range(len(stringa)): # tutte le poss. posizioni in cui far finire la sottostringa for fine in range(inizio + 1, len(stringa) + 1): # estraggo la sottostringa ed aggiorno la lista sottostringhe.append(stringa[inizio:fine]) return sottostringhe # la testo print sottostringhe_non_vuote("ACTG")
Soluzione:
def conta_sottostringhe(pagliaio, ago): ripetizioni = 0 for inizio in range(len(pagliaio)): for fine in range(inizio+1, len(pagliaio)+1): # stampo quanto vale la sottostringa, per sicurezza print inizio, fine, ":", pagliaio[inizio:fine], "==", ago, "?" # controllo se la sottostringa e' uguale ad `ago` if pagliaio[inizio:fine] == ago: print "ho trovato una ripetizione!" ripetizioni += 1 return ripetizioni # la testo print conta_sottostringhe("ACTGXACTG", "ACTG")
Soluzione:
def sottostringa_piu_lunga(stringa1, stringa2): # riutilizzo la soluzione sopra sottostringhe1 = sottostringhe_non_vuote(stringa1) sottostringhe2 = sottostringhe_non_vuote(stringa2) # controllo tra tutte le coppie di sottostringhe # quale e' quella piu' lunga che appare sia in # stringa1 che in stringa2 piu_lunga = "" for sottostringa1 in sottostringhe1: for sottostringa2 in sottostringhe2: # se sono uguali e piu' lunghe della sottostringa # comune piu' lunga trovata fin'ora... if sottostringa1 == sottostringa2 and \ len(sottostringa1) > len(piu_lunga): # aggiorno piu_lunga = sottostringa1 return piu_lunga # la testo print sottostringa_piu_lunga("ACTG", "GCTA") print sottostringa_piu_lunga("", "ACTG") print sottostringa_piu_lunga("ACTG", "")