[Python] Ordine di calcolo Dove sbaglio

Andrea D'Amore and.damore a gmail.com
Sab 24 Dic 2016 09:40:28 CET


2016-12-24 8:09 GMT+01:00  <glbattistella a tiscali.it>:
> dove sta l'errore
[…]
> ma non fa i conti che mi aspetto

Secondo me l'errore è nel non indicare il risultato che ti attendevi e
quello che hai avuto invece.
L'idea è che nello scrivere "mi aspettavo 13*16^2 + 14*16 + 2 mentre
ho avuo 13*16^3 + 14*16^2 + 2*16" probabilmente ti accorgi da solo del
problema.
Vedi l'howto "How to ask questions the smart way" di Eric Raymond,
"Getting answers" di Mike Ash che è considerata una alternativa
migliore perché molto meno supponente e "SSCCE".


A parte questo il problema col codice (stile a parte) è che usi len(),
l'approccio a indici è poco idiomatico e in genere python ha una
soluzione considerata più "elegante", in questo caso
enumerate(numero_esadecimale) ti restituirà ad ogni iterazione le
coppie (indice, cifra) ma la cifrà più significativa avrà indice zero
perché è all'inizio della stringa. Piuttosto che calcolare il
complemento alla lunghezza della stringa conviene la funzione builtin
reversed.
Inoltre ricorda che le liste sono iterabili, non serve trasformarle in
lista prima di eseguirci un ciclo sopra.

Quindi tralasciando l'assegnazione di Dizionario (base 16 o base 17
che si voglia)

>    NumeroEsadecimale = 'DE2'
>    NumEsadInLista = list(NumeroEsadecimale)
>    LunghezzaLista= len(NumEsadInLista)
>
>    for i in NumEsadInLista:
         Risultato=Dizionario[i]*16**LunghezzaLista
         LunghezzaLista=LunghezzaLista-1

diventa

    numero_esadecimale = 'DE2'
    risultato = 0

    for index, digit in enumerate(reversed(numero_esadecimale)):
        risultato += dizionario[digit] * (16 ** index)


che mi sembra più chiaro, anche come assegnazione dei nomi (tu usi
"lunghezzalista" come contatore a scalare ma in realtà la lunghezza
della lista non sta certo cambiando).

Dato che il loop è uno one-liner puoi usare una generator expression
ed evitare anche l'inizializzazione di risultato applicandogli sum():


    numero_esadecimale = 'DE2'
    risultato = sum(dizionario[d] * (16 ** i) for i, d in
enumerate(reversed(numero_esadecimale)))



Ovviamente se è davvero una conversione da esadecimale a intero e non
un esercizio conviene usare int(numero, base=16) .


-- 
Andrea


Maggiori informazioni sulla lista Python