Domanda

I am working on a program in python to convert from any number base to any number base. My code is as follows

num = raw_input("Please enter a number: ")
base = int(raw_input("Please enter the base that your number is in: "))
convers = int(raw_input("Please enter the base that you would like to convert to: "))
if (64 < convert < 2 or 64 < base < 2):
    print "Error! Base must be between 2 and 32."
    sys.exit()
symtodig = {
    '0': 0,
    '1': 1,
    '2': 2,
    '3': 3,
    '4': 4,
    '5': 5,
    '6': 6,
    '7': 7,
    '8': 8,
    '9': 9,
    'A': 10,
    'B': 11,
    'C': 12,
    'D': 13,
    'E': 14,
    'F': 15,
    'G': 16,
    'H': 17,
    'I': 18,
    'J': 19,
    'K': 20,
    'L': 21,
    'M': 22,
    'N': 23,
    'O': 24,
    'P': 25,
    'Q': 26,
    'R': 27,
    'S': 28,
    'T': 29,
    'U': 30,
    'V': 31,
    'W': 32,
    'X': 33,
    'Y': 34,
    'Z': 35,
    'a': 36,
    'b': 37,
    'c': 38,
    'd': 39,
    'e': 40,
    'f': 41,
    'g': 42,
    'h': 43,
    'i': 44,
    'j': 45,
    'k': 46,
    'l': 47,
    'm': 48,
    'n': 49,
    'o': 50,
    'p': 51,
    'q': 52,
    'r': 53,
    's': 54,
    't': 55,
    'u': 56,
    'v': 57,
    'w': 58,
    'x': 59,
    'y': 60,
    'z': 61,
    '!': 62,
    '"': 63,
    '#': 64,
    '$': 65,
    '%': 66,
    '&': 67,
    "'": 68,
    '(': 69,
    ')': 70,
    '*': 71,
    '+': 72,
    ',': 73,
    '-': 74,
    '.': 75,
    '/': 76,
    ':': 77,
    ';': 78,
    '<': 79,
    '=': 80,
    '>': 81,
    '?': 82,
    '@': 83,
    '[': 84,
    '\\': 85,
    ']': 86,
    '^': 87,
    '_': 88,
    '`': 89,
    '{': 90,
    '|': 91,
    '}': 92,
    '~': 93}

digits = 0
for character in num:
assert character in symtodig, 'Found unknown character!'
value = symtodig[character]
assert value < base, 'Found digit outside base!'
digits *= base
digits += value


digtosym = dict(map(reversed, symtodig.items()))

array = []
    while digits:
    digits, value = divmod(digits, convers)
    array.append(digtosym[value])
answer = ''.join(reversed(array))


print "Your number in base", base, "is: ", answer

my code works great, but instead of using

if (64 < convert < 2 or 64 < base < 2):
print "Error! Base must be between 2 and 32."
sys.exit()

id like to take them back to the input for the base variable instead of exiting the program. I am new to python and have no clue how to do something like this. please help.

È stato utile?

Soluzione

while True:
    try:
        convert = int(raw_input('Convert: '))
        base = int(raw_input('Base: '))
        if (64 < convert < 2 or 64 < base < 2):
            print "Error! Base must be between 2 and 32."
            continue
        break
    except Exception, e:
        print '>> Error: %s' % e

Altri suggerimenti

The general template:

while True:
    # get user input
    # ...
    if valid_input():
        break

For example:

def get_int(prompt, lo=None, hi=None):
    while True:
        try:
            n = int(raw_input(prompt))
        except ValueError:
            print("expected integer")
        else: # got integer, check range
            if ((lo is None or n >= lo) and
                (hi is None or n <= hi)):
                break # valid
            print("integer is not in range")
    return n

An easy way out would be to simply add a loop at the beginning of the selection: it escapes in case of a valid choice and iterates while it is incorrect (instead of sys.exit(), which is I believe you want to avoid).

The first part could be:

selected = False
while not selected:
    num = raw_input("Please enter a number: ")
    base = int(raw_input("Please enter the base that your number is in: "))
    convert = int(raw_input("Please enter the base that you would like to convert to: "))
    if (64 < convert or convert < 2 or 64 < base or base < 2):
        print "Error! Base must be between 2 and 32."

    else:
        selected = True

In addition, please note that I changed the condition to:

if (64 < convert or convert < 2 or 64 < base or base < 2):
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top