On 2012-11-03 10:07, orsomannaro wrote:
Il 03/11/2012 01:09, orsomann...@gmail.com ha scritto:

e questo succede per altri campi


dato che tutti i molti valori numerici di questo file binario sono
letti con la stessa logica, potrei scrivere:

Sì, è una buona idea isolare questa operazione ripetitiva in una funzione


def hex2num(*args):
    num = ''
    for arg in args:
        num += '%02x' % ord(arg)
    return num[:-1].lstrip('0')

Questo va bene, funziona. Un modo più idiomatico di scriverlo è (non provato):

    def hex2num(*args):
        num = ''.join('%02x' % ord(arg) for arg in args)
        return num[:-1].lstrip('0')

codice = hex2num(*(data[8], data[9], data[10]))

questo puoi scriverlo semplicemente come

    codice = hex2num(data[8], data[9], data[10])

il senso di *args nella dichiarazione della funzione è quello di impacchettare tutti gli argomenti in una tupla, e quello nel richiamo della funzione è quello di espandere una sequenza in argomenti singoli. Quindi come hai scritto tu il richiamo della funzione ci sono un impacchettamento e poi uno spacchettamento consecutivi, di cui puoi farne a meno.

Nota che se i byte sono sempre contigui, come immagino siano, avrebbe più senso che tu passassi una string alla funzione e non i singoli caratteri, scrivi una funzione che tu possa richiamare con

    codice = hex2num(data[8:11])

Te la lascio fare per esercizio. Ma secondo me cambia un solo carattere :)


Ma visto che l'operazione viene eseguita periodicamente e che i
record da leggere sono diverse centinaia, mi conviene dal punto di
vista computazionale?

Non ha assolutamente senso pensare al costo di questa ora. Sono sicuro sia un'ottimizzazione preventiva. Questo lo potrai valutare bene solo quando avrai finito e tutto il programa starà girando.


--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a