我正在尝试为作业创建科学的计算器。我正在寻找有关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
非常感谢您的帮助!
答案 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
将包含1
或0
。对于我们读取的每个数字,如果为0
,则没有任何要添加的结果(因此result += digitvalue
的确添加了0
),但是我们仍然需要考虑到还有一个数字0
放在数字的末尾。
现在,在以10为基数的末尾加零将使数字大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。:
有没有不用断言就可以重新提示的方法吗?
如果输入不正确,我想您要重新提示。您需要为此使用循环:
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.")