Преобразование двоичного в десятичное только с использованием базовых функций len (), ord (), print () и т. Д. - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать научный калькулятор для задания. Мне нужна помощь с синтаксисом 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 голосов
/ 12 ноября 2018

Это довольно классика. Читать в базе легче, чем писать в одной.

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:.

Есть ли способ перекомпоновки без использования 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, это можно сделать более питоническим способом, используя обработку исключений:

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