Python: Funzioni (Soluzioni)ΒΆ

  1. Soluzione: lo stesso tipo del valore che gli passo! La funzione restituisce il valore dell’argomento senza toccarlo.

    1. un intero.
    2. un dizionario.
    3. una lista.
    4. un razionale.
  2. Soluzione: la somma o concatenazione dei due argomenti. Quindi:

    1. un intero.
    2. una lista.
    3. una stringa.
  3. 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 dal print aggiuntivo: visto che stampa_pari_dispari() non ha return, il suo risultato e’ sempre None. Il print aggiuntivo stampa proprio questo None.

  4. 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 in calcola_pari_dispari(), e’ necessario aggiungere a mano un print che ne stampi il risultato!

  5. 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 ciclo for 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 al return, posso saltare un passaggio e fare direttamente return:

    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!%$*@")
    
  6. Soluzione:

    def domanda():
        percorso = raw_input("scrivi un percorso: ")
        print open(percorso).readlines()
    
    # la testo
    domanda()
    
  7. 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")
    
  8. 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)
    
  9. 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)
    
  10. 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.

  11. 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", "?")
    
  12. 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.

  13. 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))
    
  14. Soluzione:

    def sottostringa(prima, seconda):
        return seconda in prima
    
    # la testo
    print sottostringa("ACGT", "T")
    print sottostringa("ACGT", "x")
    
  15. 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")
    
  16. 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")
    
  17. 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", "")