Pythonic方式做基础转换

时间:2015-03-03 05:41:42

标签: python base-conversion

我是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.谢谢!

3 个答案:

答案 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)

Python提供了一些内置函数,可以将以一个Integer基数表示的值转换为另一个Integer基数。整数以四种形式表示,即十进制,二进制,八进制和十六进制形式。

Python提供了内置的bin()函数以将非二进制数转换为二进制数,oct()函数将非八进制数转换为八进制,以及hex()函数来转换从非十六进制数到十六进制数。这些函数返回一个字符串文字来表示值。

您可以从Integer base Conversion Functions in Python

的教程中学习这些功能。