2

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

4

3 回答 3

5

这是一个很好的递归版本,它将从使用算法和数据结构解决问题中转换为十六进制

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))
于 2015-03-03T08:12:02.387 回答
1

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

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

您可以从Python 中的整数基转换函数教程中学习这些函数

于 2019-07-19T13:44:20.400 回答
0

您可以在以下线程中找到(稍微)更简洁的示例: Python 优雅的 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]
于 2015-03-03T06:24:52.913 回答