Python 编写将十六进制转换为十进制的函数
我需要写一个将十六进制转换成十进制的函数,我已经有了一个方法,但是我在第一位就卡住了。到目前为止,我接受用户输入并以十六进制返回它,但这只在我一次输入一个东西时起作用。代码是:Python 编写将十六进制转换为十进制的函数,python,python-2.7,Python,Python 2.7,我需要写一个将十六进制转换成十进制的函数,我已经有了一个方法,但是我在第一位就卡住了。到目前为止,我接受用户输入并以十六进制返回它,但这只在我一次输入一个东西时起作用。代码是: def hex(x): if x == "0": return 0 elif x == "1": return 1 elif x == "2": return 2 elif x == "3": return 3 eli
def hex(x):
if x == "0":
return 0
elif x == "1":
return 1
elif x == "2":
return 2
elif x == "3":
return 3
elif x == "4":
return 4
elif x == "5":
return 5
elif x == "6":
return 6
elif x == "7":
return 7
elif x == "8":
return 8
elif x == "9":
return 9
elif x == "A":
return 10
elif x == "B":
return 11
elif x == "C":
return 12
elif x == "D":
return 13
elif x == "E":
return 14
elif x == "F":
return 15
print hex(raw_input().upper())
如果我输入C,它会工作,然后返回12,但是如果我输入8C,它就不工作了。我不明白为什么会这样。您可以使用
int
来简化此过程。功能:
def hex_to_dex(strng_of_hex):
return int(strng_of_hex, 16)
例如:
>>> int("0xff", 16)
255
如果int前面有一个0x
,这并不重要,它将忽略字符串中的0x
。因此,以下措施也将起作用:
>>> int("a", 16)
10
对于从头开始的原始十六进制代码,请尝试以下操作:
def hex(s):
_hexer = "0123456789ABCDEF"
return sum([_hexer.find(var) * 16 ** i for i, var in enumerate(reversed(s.upper()))])
如果你想让一些警卫进来:
def hex(s):
_hexer = "0123456789ABCDEF"
if not all([var in _hexer for var in s.upper()]):
print "Invalid string"
return None
return sum([_hexer.find(var) * 16 ** i for i, var in enumerate(reversed(s.upper()))])
我在这里使用了很多函数,但为了快速参考,这里有一个附录:
至于
[…]
,这是一个列表理解,你可以在上面找到大量的资源。你可以使用int
来简化这个过程。功能:
def hex_to_dex(strng_of_hex):
return int(strng_of_hex, 16)
例如:
>>> int("0xff", 16)
255
如果int前面有一个0x
,这并不重要,它将忽略字符串中的0x
。因此,以下措施也将起作用:
>>> int("a", 16)
10
对于从头开始的原始十六进制代码,请尝试以下操作:
def hex(s):
_hexer = "0123456789ABCDEF"
return sum([_hexer.find(var) * 16 ** i for i, var in enumerate(reversed(s.upper()))])
如果你想让一些警卫进来:
def hex(s):
_hexer = "0123456789ABCDEF"
if not all([var in _hexer for var in s.upper()]):
print "Invalid string"
return None
return sum([_hexer.find(var) * 16 ** i for i, var in enumerate(reversed(s.upper()))])
我在这里使用了很多函数,但为了快速参考,这里有一个附录:
至于
[…]
,它是一个列表理解,您可以在上面找到大量的资源。目前,您正在将用户输入的整个字符串传递给十六进制函数。因此,它适用于“C”,但不适用于“8C”。您没有在if语句中检查“8C”。
因此,十六进制函数返回值None
。
为了防止这种情况发生,您需要将用户输入的字符串一次传递给十六进制函数一个字符
假设:
values = raw_input().upper()
并使用问题中定义的hex()
函数。
你可以:
print([hex(v) for v in values])
或者,如果您不想要列表:
print(' '.join([str(hex(v)) for v in values]))
这将使用您定义的函数,但将其应用于用户输入的所有字符。。。而不仅仅是第一个
这个答案的前提是您对定义的
hex()
函数的当前功能和返回类型感到满意。当前,您正在将用户输入的整个字符串传递给hex函数。因此,它适用于“C”,但不适用于“8C”。您没有在if语句中检查“8C”。
因此,十六进制函数返回值None
。
为了防止这种情况发生,您需要将用户输入的字符串一次传递给十六进制函数一个字符
假设:
values = raw_input().upper()
并使用问题中定义的hex()
函数。
你可以:
print([hex(v) for v in values])
或者,如果您不想要列表:
print(' '.join([str(hex(v)) for v in values]))
这将使用您定义的函数,但将其应用于用户输入的所有字符。。。而不仅仅是第一个
这个答案的前提是您对定义的
hex()
函数的当前功能和返回类型感到满意。如果x
等于字符串8C
,您的big的哪个分支如果。。。elif
声明您认为会采取什么措施?如果你能回答这个问题,那么你就会明白为什么你的代码不能工作。你需要为用户输入中的每个字符调用hex()
函数;然后收集并打印结果。如果x
等于字符串8C
,那么大的哪个分支如果。。。elif
声明您认为会采取什么措施?如果你能回答这个问题,那么你就会明白为什么你的代码不能工作。你需要为用户输入中的每个字符调用hex()
函数;然后收集并打印结果。不幸的是,我必须编写自己的函数来完成这项工作。我将通过获取输入字符串的长度,并将第一个数字乘以16乘以长度的幂减1来完成此操作。@JaAnTr Tr最新的加法。sum()
是错误的函数。\u hexer.find()
技巧很可爱,但结果值会非常错误。@MartijnPieters会吗?让我再测试一下。@GamesBrainiac:Btw,\u hexer=dict(map(反向,枚举(“0123456789ABCDEF”))
或者类似的东西会更可爱;-)不幸的是,我必须编写自己的函数来实现这一点。我将通过获取输入字符串的长度,并将第一个数字乘以16乘以长度的幂减1来完成此操作。@JaAnTr Tr最新的加法。sum()
是错误的函数。\u hexer.find()
技巧很可爱,但结果值会非常错误。@MartijnPieters会吗?让我再测试一下。@GamesBrainiac:Btw,\u hexer=dict(map(反向,枚举(“0123456789ABCDEF”))
或者类似的东西会更可爱;-)“但如果我输入8C,它就不起作用了。”我正在解释这一点。他显然对现有的功能很满意“如果我输入,它可以工作,例如,C”。这使用了他定义的十六进制()问题中的一个。啊,那么这仍然是一个问题,因为hex()
返回整数。将其转换为字符串不会产生所需的输出C8
将导致128
,而不是200
@RMcG:啊,我明白了,对不起。我还以为你是在建议替换提问者的hex
函数呢@史蒂文:没问题,我应该让它更明显。“但如果我输入8C,它就不起作用了。”我正在解释这一点。他显然对现有的功能很满意“如果我输入,它可以工作,例如,C”。这使用了他定义的十六进制()问题中的一个。啊,那么这仍然是一个问题,因为hex()
返回整数。将其转换为字符串不会产生所需的输出<密码