Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447

    [Python] Risultato funzione

    Premetto che esercitandomi mi sono detto di provare a scrivere un programmino che calcoli quante vocali compaiano in una parola. Questo è quello che ho elaborato:

    Codice PHP:
    def ContaVocali(x):
        
    voc=0
        i
    =0
        lung
    =len(x)
        while 
    i<lung:
            
    Let=x[i]
            if 
    Let=='a' or Let=='e' or Let=='i' or Let=='o' or Let=='u' or Let=='A' or Let=='E' or Let=='I' or Let=='O' or Let=='U':
                
    voc=voc+1
                    i
    =i+1
            
    else:
                
    i=i+1
        
    return voc

    x
    =raw_input("Inserisci un nome: ")
    v=ContaVocali(x)
    print 
    "Numero delle vocali:"
    Osservando il codice ho pensato di fare questa aggiunta per calcolare anche le consonanti:


    Codice PHP:
    def ContaVocali(x):
        
    voc=0
        i
    =0
        lung
    =len(x)
        while 
    i<lung:
            
    Let=x[i]
            if 
    Let=='a' or Let=='e' or Let=='i' or Let=='o' or Let=='u' or Let=='A' or Let=='E' or Let=='I' or Let=='O' or Let=='U':
                
    voc=voc+1
                    i
    =i+1
            
    else:
                
    i=i+1
        
    return voc

    x
    =raw_input("Inserisci un nome: ")
    v=ContaVocali(x)
    c=len(x)-ContaVocali(x)
    print 
    "VOCALI:"v
    print "CONSONANTI:"c
    y
    =raw_input("Premi un tasto per uscire"
    Tuttavia ho notato che sarebbe stato suficcente all'interno della funzione ContaVocali dopo l'struzione else: aggiungere una variabile che come nelle poche righe sopra mi contasse le consonanti. Il mio problema era come poter utlizzare due risultati forniti dalla medesima funzione, ovvero se nel caso originale la funzione ritorna un valore che indica le vocali adesso vorrei che esprimesse due risultati.

    Spero di essermi spiegato.

    P.S. Sto studiando concretamente il Python da una settimana se ci sono correzioni al codice per renderlo più "elegante" sono ben accette.

    Ringrazio anticipatamente tutti coloro che mi risponderanno.

  2. #2
    Per migliorare il codice puoi usare il costrutto Variabile in Lista

    codice:
    >>> Let="E".lower()
    >>> Let in ['a','e','i','o','u']
    True
    Per far restiture entrambi i risultati usa una n-upla:

    codice:
    function bla(...):
       ...
       return (val1, val2)
    
    Var1, Var2 = bla(..)
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  3. #3
    Ci saranno sicuramente metodi migliori ma questo potrebbe essere un approccio un po' più performante.
    Puoi usare set() per ottenere le singole lettere contenute nella parola cosicchè successivamente iteri [u]soltanto su quelle[u] utilizzando ''.count() per contare le occorrenze.
    Questo dovrebbe essere tanto più efficiente quanto è più lungo il testo dato in pasto alla funzione.



    codice:
    # -*- coding: latin1 -*-
    
    consonanti = 'bcdfghjklmnpqrstvwxyz'
    vocali = 'aeiouàèìòù'
    
    def conta(parola):
        cons = 0
        vocs = 0
        parola = parola.lower()
        lettere = set(parola)
        for lettera in lettere:
            if lettera in consonanti:
                cons += parola.count(lettera)
            elif lettera in vocali:
                vocs += parola.count(lettera)
            else:
                # carattere estraneo (!$%& ecc...)
                pass
        print "vocali=%s, consonanti=%s" %(vocs, cons)
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  4. #4
    Premesso che non conoscendo a fondo python non posso dirlo con certezza, ma di primo impatto mi sembrerebbe un po' più macchinoso con la gestione del set... è vero che il loop viene notevolmente ridotto, ma la trasformazione in set e poi ancora i loop impliciti di count() per contare le occorrenze non dovrebbero aumentare la complessità generale?
    Forse è più veloce perchè anche se fanno più giri, sono builtin?
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  5. #5
    Dipende dalla lunghezza della stringa data in input.
    Effettivamente se parliamo di parole, ovvero stringhe che difficilmente sono superiori a 10 caratteri di lunghezza, è più veloce iterare su ogni singolo elemento.
    Se però si volessere contare le occorrenze di ogni singola lettera su di una stringa molto lunga (es: un testo) risulta più performante utilizzare set() e ''.count().
    Un po' di benchmark:

    codice:
    # -*- coding: latin1 -*-
    
    consonanti = 'bcdfghjklmnpqrstvwxyz'
    vocali = 'aeiouàèìòù'
    
    def conta1(parola):
        cons = 0
        vocs = 0
        parola = parola.lower()
        lettere = set(parola)
        for lettera in lettere:
            if lettera in consonanti:
                cons += parola.count(lettera)
            elif lettera in vocali:
                vocs += parola.count(lettera)
            else:
                # carattere estraneo (!$%& ecc...)
                pass
        return cons, vocs
    
    def conta2(parola):
        cons = 0
        vocs = 0
        for x in parola:
            if x in consonanti:
                cons +=1
            elif x in vocali:
                vocs += 1
        return cons, vocs
    
    import timeit
    print timeit.Timer('conta1("difficile")', 'from __main__ import conta1').timeit(1000)
    print timeit.Timer('conta2("difficile")', 'from __main__ import conta2').timeit(1000)
    print timeit.Timer('conta1("difficile" * 1000)', 'from __main__ import conta1').timeit(1000)
    print timeit.Timer('conta2("difficile" * 1000)', 'from __main__ import conta2').timeit(1000)
    A me ritorna:

    0.0187870246079 secondi utilizzando set() su stringa corta
    0.00785407083861 secondi utilizzando for su stringa corta
    1.42217516472 secondi utilizzando set() su stringa lunga
    5.30397271162 secondi utilizzando for su stringa lunga

    Cmq sicuramente esisteranno approcci migliori, sia che utilizzare set() che iterare su tutta la stringa.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  6. #6
    La differenza su stinghe lunghe è notevole alla fine... sembra più conveniente basarsi sulle builtin il più possibile quindi.
    Grazie per il chiarimento ^^
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  7. #7
    La differenza su stinghe lunghe è notevole alla fine... sembra più conveniente basarsi sulle builtin il più possibile quindi.
    Essendo scritti in C e ottimizzati al massimo quasi sempre è così.
    Inoltre i cicli for in Python non sono velocissimi.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  8. #8
    Questo sembra essere più veloce dei due sopra:

    codice:
    def conta3(parola):
        parola = parola.lower()
        cons = 0
        vocs = 0
        for x in consonanti:
            cons += parola.count(x)
        for x in vocali:
            vocs += parola.count(x)
        return cons, vocs
    0.039284881179 secondi con la stringa corta e 1.15162010814 con la stringa lunga (5x più veloce dell'approccio con set() e 10x dell'approccio col for).
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  9. #9
    Ancora più veloce (poi la smetto )

    codice:
    def conta3(parola):
        parola = parola.lower()
        cons = 0
        vocs = 0
        for x in consonanti:
            if x in parola:
                cons += parola.count(x)
        for x in vocali:
            if x in parola:
                vocs += parola.count(x)
        return cons, vocs
    Risultati:

    0.0201964216122
    0.777120555825
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  10. #10
    niente male questo
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.