【问题标题】:Converting binary to decimal only using basic functions len(), ord(), print(), etc仅使用基本函数 len()、ord()、print() 等将二进制转换为十进制
【发布时间】:2019-04-14 17:45:39
【问题描述】:

我正在尝试为一项作业创建一个科学计算器。我正在寻找有关 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

非常感谢任何帮助!

【问题讨论】:

  • break 语句只退出最里面的循环。有关重构代码以跳出外循环的方法,请参阅副本(上面的链接)。
  • 您是否真的必须在这里使用ord...如果您只使用for x in var: if x == '0'.... 等,代码会更具可读性...您也在做同样的事情0 和 1 的操作,所以你不妨把它们放在同一个块中
  • Asking the user for input until they give a valid response 问题的答案应该有助于从用户那里获得输入。

标签: python binary decimal


【解决方案1】:

这是非常经典的。在一个基础上阅读比在一个基础上写作更容易。

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 将包含 1 或 0。对于我们读取的每个数字,如果是0,则没有什么可以添加结果(所以result += digitvalue确实添加了0),但我们仍然需要考虑到最后还有一个0的数量。

现在,以 10 为底,在末尾添加一个 0 会使数字变大 10 倍。在底数 2 中也是如此。在末尾添加一个零会使数字变大两倍。这就是我们将其乘以 2 的原因。

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

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

for character in var:
    pass # pass does nothing

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

@JayF.:

有没有不使用assert的方式重新提示?

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

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.")

【讨论】:

  • 有什么方法可以在不使用assert的情况下重新提示?感谢您的帮助!
  • 如果答案让您满意,您可以将其标记为已接受,否则,对您的问题进行编辑或通过 cmets 进行交互。
猜你喜欢
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2012-06-26
  • 2019-12-14
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多