我是Python的初学者。我写了一些代码来执行基本转换,我想知道是否有更好的替代品,代码更短(单行)或更快。代码看起来很难看,感觉非#Pythonic"虽然作为初学者我不应该有任何这样的意见。任何改进代码的反馈都将不胜感激。这纯粹是出于学习目的。
#!/usr/bin/env python
import math
def number_to_digits( number, radix ):
'Converts a number into a vector of digits in given radix'
digits = [0]*int(math.ceil(math.log(number,radix)))
for ii in range(len(digits)):
(number,digit) = divmod(number,radix)
digits[ii] = digit
return digits
def digits_to_number( digits, radix ):
'Converts a vector of non-negative digits in given radix into a number'
number = 0;
for ii in range(len(digits)-1,-1,-1):
number *= radix
number += digits[ii]
return number
if __name__ == '__main__':
try:
number = int(raw_input('Enter number: '))
if number <= 0: raise ValueError()
radix = int(raw_input('Enter radix: '))
if radix <= 0: raise ValueError()
digits = number_to_digits(number,radix)
print digits
number_again = digits_to_number(digits,radix)
if not number_again == number:
print 'test failed'
except ValueError:
print 'unexpected input'
终端上的示例会话产生:
Enter number: 44
Enter radix: 6
[2, 1, 1]
很容易检查2 + 1 * 6 + 1 * 6 ** 2 == 44.谢谢!
答案 0 :(得分:0)
您可以在以下主题中找到(略微)更清晰的示例: Python elegant inverse function of int(string,base)
以排名靠前的例子,您可以将其清理一下:
def digit_to_char(digit):
if digit < 10:
return str(digit)
return chr(ord('a') + digit - 10)
def str_base(number, base):
while number > 0:
number, digit = divmod(number, base)
yield digit_to_char(digit)
结果:
>>> list(str_base(44, 6))
['2', '1', '1']
如果您不关心大于10的碱基,则简化为:
def str_base(number, base):
if base > 10:
raise ValueError('Base must be less than 10')
while number > 0:
number, digit = divmod(number, base)
yield digit
>>> list(str_base(44, 6))
[2, 1, 1]
答案 1 :(得分:0)
这是一个很好的递归版本,可以从Problem Solving with Algorithms and Data Structures转换为十六进制
def toStr(n,base):
convertString = "0123456789ABCDEF"
if n < base:
return convertString[n]
else:
return toStr(n//base,base) + convertString[n%base]
print(toStr(1453,16))
答案 2 :(得分:0)