简体   繁体   中英

unexpected behaviour when trying to do math in for loop

while trying to make simple code to convert hex to decimal:

#Hex multiply by 16 depending on position: 0xAB = A*16 + B = 10*16 
    #0x375
    #3*(16**2) + 7*(16**1) + 5

i needed to reverse the number because the exponent of 16 would increase to the right

def tohex(integer): #375
    power = 0
    l = [num for num in str(integer)] #['3','7','5']
    l.reverse()                       #['5','7','3']
    for i, n in enumerate(l):         # OK
        number = int(n)               # OK
        l[i] = n*(16**power)          # ???
        print(l[i])
        power + 1

    l.reverse()

    return "".join(l)


print(tohex(375))

output:

─$ python3 hextobase64.py
5
7
3
375

it looks to me l[i] = n*(16**power) isn't doing anything at all. why is this?

edit: fixed version:

def tohex(integer): #375
    power = 0
    f = []
    l = [num for num in str(integer)] #['3','7','5']
    l.reverse()                       #['5','7','3']
    for n in l:       # OK
        number = int(n)
        f.append(number*(16**power))
        power += 1

    return sum(f)

print(tohex(375))

└─$ python3 hextobase64.py
885
               

last edit: made function to translate abcdef to 10 11 12 13 14 15 :

def removeletter(list):
    #function to convert all letters in decimal to hex for todecimal()

    for i, letter in enumerate(list):
        if letter in hextable.keys():
            list[i] = hextable[letter]
        
    return list

hextable = {}
for number, letter in enumerate(lowers[:6]):
    hextable[letter] = number + 10

def todecimal(h):   
    power = 0
    l = [num for num in str(h)] #['3', 'a', '2', 'f']
    l = removeletter(l)
    l.reverse()                       #['f', '2', 'a', '3'] 

    for i, n in enumerate(l):
        
        number = int(n)
        l[i] = number*(16**power)
        power += 1

    l.reverse()
    return sum(l)

print(todecimal('49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d'))

output:

python3 hextobase64.py
11259432467145572969189485457381052543241507215288737798329079056359121649591228422793827173000297562297701340508013

power + 1 to power+=1 ... very simple fix

As I understand from your question you're converting a hexadecimal number to decimal .You are using the wrong variable in the line l[i] = n*(16**power) , you are multiplying n instead of number .And as everyone mentioned you should use power += 1 to increment power in every iteration. Also, you are finally returning the digits in the list, whereas the digits in the list need to added to be converted to decimal. Made a few changes to the code:

def tohex(integer): 
    power = 0
    l = [num for num in str(integer)] 
    l.reverse()                       
    for i, n in enumerate(l):         
        number = int(n)               
        l[i] = number*(16**power)          
        power += 1

    l.reverse()    
    return sum(l)

print(tohex(375))

Output:

885

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM