在自己内部调用菜单功能

时间:2017-10-08 21:41:25

标签: python function

我是Python和所有其他编程语言的新手,我的代码遇到了问题。我正在尝试创建一个菜单,您可以在其中选择一些转换选项(十进制数字等):

base = ['Binary', 'Octal', 'Hexadecimal']

def menu():
    choice = int(input('Choose a conversion method: 1-Binary, 2-Octal,3-HexaDecimal. Your choice: '))

    if choice > 3 or choice < 1:
        print('Invalid choice, choose between 1 and 3.')
        menu()
    else:
        print('something...')
    return choice

x = menu()

num = int(input('Decimal number to be converted to {}: '.format(base[x-1])))

#This isn't going to be used on my code, its only here so i can see what
#Python is getting from input
print('Verifying choice value: {}'.format(x))   
print('Verifying num value: {}'.format(num))

def binary(num):
    list = []
    var = ''

    while num >= 1:
        divint = num // 2
        list.append(num % 2)
        num = divint

    list.reverse()
    size = len(list)

    for c in range(0, size):
        var += str(list[c])
    intBin = int(var)

    return intBin

def opt(choice):
    if choice == 1:
        conv = binario(num)
    elif choice == 2:
        conv = octal(num)
    elif choice == 3:
        conv = hexa(num)
    else:
        print('Invalid Option, try again!')
        menu()

    return conv

print('\nYou have chosen {}: {}'.format(base[x-1], binary(num)))

问题是,如果我选择1到3之间的东西,程序运行正常并计算二进制。如果我选择&gt; 3或&lt; 1,它会按预期返回消息并再次调用menu(),但如果新输入介于1和3之间,则会给出错误。看起来'choice'变量从第一次尝试而不是第二次尝试获得它的价值。它不是“重置”变量而不是从新输入中获取其新值。我是Python的新手,任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

if choice > 3 or choice < 1:
    print('Invalid choice, choose between 1 and 3.')
    menu()

您正在调用menu()函数本身,但您没有保存它返回的值。您需要将其更改为

if choice > 3 or choice < 1:
    print('Invalid choice, choose between 1 and 3.')
    choice = menu()

但是,这不是组织代码的好方法。最好在其内部调用menu()。相反,只需使用简单的while循环来要求用户做出有效选择。

请查看Kevin的Asking the user for input until they give a valid response,了解有关此主题的绝佳信息。

顺便说一句,你不应该使用list作为变量名,因为它会“隐藏”内置的list类型。它不会对此产生任何影响,但它会使代码混乱,如果您在重新定义名称后尝试使用list构造函数创建列表,则会导致出现神秘的错误消息。