Попытка преобразовать двоичный код в десятичный: закончилась странной ошибкой типа int? - PullRequest
0 голосов
/ 16 апреля 2020

Я пишу код python, который преобразует двоичный код в десятичную.

def bin_dec (binary):
    binary_list = list(str(binary))
    **for bit in binary_list:
        if int(bit) > 1 or int(bit) < 0:
            print('Invalid Binary')
            print('')
            exit()**    
    total = 0
    argument = 0
    binary_length = len(str(binary))
    exponent = binary_length - 1
    while exponent >= 0:
        total += (int(binary_list[argument]) * (2**exponent))
        argument += 1
        exponent -= 1
    print(total)
    print('')

Когда я тестирую код с помощью отрицательных двоичных чисел, я не вижу вывод "Invalid Binary". Вместо этого я увидеть целочисленную ошибку

>>> bin_dec(-10)
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    bin_dec(-10)
  File "E:/Bronx Science/Sophomore/Computer Science_Python/Edwin Chen_Lab 8_Diamond and Squares.py", **line 27, in bin_dec
    if int(bit) > 1 or int(bit) < 0:**
ValueError: invalid literal for int() with base 10: '-'

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

На самом деле, здесь происходит, когда вы передаете -10 в качестве ввода, содержимое binary_list теперь равно ['-', '1', '0']

Итак, теперь вы, когда вы пытаетесь сделать int(bit), python выдает ошибку, поскольку вы не можете конвертировать - в int.

Вы можете сделать что-то подобное, чтобы обнаружить недопустимые двоичные числа

for bit in binary_list:
    if bit != '0' and bit != '1':
        print('Invalid Binary')
        print('')
        exit()
0 голосов
/ 16 апреля 2020

ValueError повышается, как только вы говорите int(bit), потому что bit - это '-'. Вы никогда не переходите к следующей строке своего кода, потому что исключение не перехватывается, поэтому оно возникает из вашего скрипта полностью.

Вместо:

for bit in binary_list:
    if int(bit) > 1 or int(bit) < 0:
        print('Invalid Binary')
        exit()

вы можете сделать что-то вроде:

for bit in binary_list:
    try:
        assert 0 <= int(bit) <= 1
    except AssertionError, ValueError:
        print('Invalid Binary')
        exit()

Обратите внимание, что вызов exit() в функции обычно считается плохой практикой. Если вы просто разрешите возбудить исключение, это в любом случае приведет к завершению работы сценария, поэтому вы можете просто выполнить:

for bit in binary_list:
    assert 0 <= int(bit) <= 1, 'Invalid Binary'

или, возможно:

assert all(bit in {'0', '1'} for bit in binary_list), 'Invalid Binary'

и получить по существу то же самое эффект (плюс трассировка стека, которая скажет пользователю, что именно убило скрипт). Разница с этим подходом заключается в том, что если вызывающая функция решает, что она хочет сделать что-то еще (например, попытаться запросить у пользователя другой номер), у них есть опция catch, вызывающая исключение; если вы просто exit(), у них нет возможности исправить ошибку.

...