仅使用基本函数len(),ord(),print()等将二进制转换为十进制

时间:2018-11-12 01:05:48

标签: python binary decimal

我正在尝试为作业创建科学的计算器。我正在寻找有关python语法的帮助,我认为我的设计和伪代码都做得不错,但是无论出于什么原因,python都没有我的语法问题。这是我将二进制转换为十进制的代码。

当输入无效时,我需要代码重新提示,但是当它确实提示时,它陷入了重新提示循环中,不会给我任何出路。

def bintodec(var):
    power = (len(var) + 1)
    value = ' '
    while True:

        var = input('Give a number to convert from binary to decimal: ')
        for x in range(len(var)):

            if (ord(var[x]) == 49):
                power -= 1
                value += x * (2 ** power)

            if (ord(var[x]) == 48):
                power -= 1
                value += x * (2 ** power)

            if power == -1:
                break

            else:
                boo = True

    return value

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这很经典。读基础比写基础容易。

def bintodec(var):
    assert set(var) <= set("01") # Just check that we only have 0s and 1s
    assert isinstance(var, str) # Checks that var is a string

    result = 0
    for character in var: # character will be each character of var, from left to rigth
        digitvalue = ord(character) - ord("0")
        result *= 2
        result += digitvalue

    return result

好的,它如何工作?

好吧,它从左到右读取值。 digitvalue将包含10。对于我们读取的每个数字,如果为0,则没有任何要添加的结果(因此result += digitvalue的确添加了0),但是我们仍然需要考虑到还有一个数字0放在数字的末尾。

现在,在以10为基数的末尾加零将使数字大10倍。在基数2中也是如此。在末尾添加零将使数字大两倍。这就是为什么我们将其乘以2。

最后,如果digitvalue1而不是0,我们需要在数字上加上1,然后result += digitvalue就会这样做。

注意:为了使您清楚起见,下面的两个for循环是等效的。

for character in var:
    pass # pass does nothing

for i in range(len(var)):
    character = var[i]
    pass

  

@JayF。:

     

有没有不用断言就可以重新提示的方法吗?

如果输入不正确,我想您要重新提示。您需要为此使用循环:

while True:
    var = input()
    if set(var) <= set("01"):
        print(bintodec(var))
        break # Remove this `break` statement if you want to reprompt forever
    else:
        # print("The input must consist of only 0s and 1s.")
        pass # `pass` does nothing.

如果将断言保留在bintodec函数中,则可以使用异常处理以更Python化的方式完成:

while True:
    var = input()
    try:
        print(bintodec(var))
        break
    except AssertionError:
        print("The input must consist of only 0s and 1s.")