用Python实现十六进制向十进制转换

用Python实现十六进制向十进制转换

0. 引言

最近心血来潮,想通过对比C语言数据结构和Python语言数据结构异同,加深对二者的学习理解。特从最基础的开始复习,首先遇到了指针,以及指针地址的理解。突发奇想,尝试用Python练习下如何将十六进制数转换为十进制数。(作为一只还在纠结指针的菜鸟,此刻内心已经感受到了大牛们关爱制杖的眼神。)

1. C语言中的地址

先看代码:

#include 
int main()
{
	int i=26;
	printf("i(十进制)=%d.\n",i);			#查看i的值(十进制);
	printf("&i(十六进制)=%p.\n", &i);	#查看i的地址(十六进制);
	printf("&i(十进制)=%d.\n",&i);		#查看i的地址(十进制);
	printf("i(十六进制)=%p.\n",i);		#查看i的值(十六进制);
	return 0;
}

输出:

i(十进制)=26.
&i(十六进制)=000000000062FE1C.
&i(十进制)=6487580.
i(十六进制)=000000000000001A.

众所周知,就算电脑有毛病,也能得出上述结果。C语言中的十进制和十六进制互换用printf()中的%p和%d可以实现,但是Python语言是面向对象语言,对变量存储地址没有太多要求,有一个id()的函数用于获取对象的内存地址。此时,“做一个十六进制到十进制转换的函数”的念头就像晴空万里突然暴风雨无处躲避,没办法,写一个吧。(也许python中很简单的转换函数,希望各位大牛留言告知。)

2. Python语言实现

先看代码:

import math
def convertDectoHex(a):
    al=list(a)
    b={'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
    multi=0
    sumof=0
    for i in range(len(a)):
        if al[i] in b.keys():#如果al[i]的值在字典b的keys中,则:
            multi=int(b[al[i]])
        else:
            multi=int(al[i])
        sumof+=multi*math.pow(16,len(a)-i-1)
    return sumof
a=input('16进制:')
print('十六进制的{}化成十进制为{}.'.format(a,convertDectoHex(a)))

Fn+F5运行这段程序:

16进制: 62FE1C
输 出 : 十六进制的62FE1C化成十进制为6487580.0.

这明显没有任何问题,所以,我写这篇文章的重点是什么?

3. Python语言代码需要重点关注的问题

上面那段并不长的代码有两处需要重点关注的点:
  重点一:数据类型转换'str'-->'int'

a=input('16进制:')

运行后输入62FE1C,得到:a='62FE1C'但是,type(a)=。在自定义函数中al=list(a),将字符串变成列表,但是列表中的元素依然是字符串类型:type(al[0])=
  各位大佬也很清楚,字符串是没法运算的。所以,需要强制数据类型转换:multi=int(b[al[i]]),即:1.在字典中取出key是al[i]对应的value,2.在将其转化为int类型。其实,这一步可以不做,因为在创建字典b时就已经输入了数值类型值。后面的multi=int(al[i])也是类似操作。
  重点二:字典dict()中‘键’和‘值’的使用
  程序中if al[i] in b.keys():是判断输入的十六进制数中是否有‘A’, 'B', 'C', 'D', 'E', 'F'这些值,如果有则取出字典中他们对应的数值。

4. 结语

下面进行技术总结(咦,似乎在哪里听过?):1.注意字符串转换为数值类型;2.字典很强大,该用就用。

你可能感兴趣的:(python语言基础)