允许用户重试 Python 中的函数输入

Allow user to retry input for a function in Python

我的代码是一个测验 - 根据您最喜欢 'The book' 中的哪个角色 - 基本上是一系列问题,答案为 a、b、c、d、e。

`#Question 1
print("This is the text of question 1")
print("a - This is the text of answer a")
print("b - This is the text of answer b")
print("c - This is the text of answer c")
print("d - This is the text of answer d")
print("e - This is the text of answer e")

quest_ans()
answers.append(quest_ans.ans)`

接下来的代码调用一个函数来允许用户输入他们的答案,该函数也接受该答案并将其转换为一个数字,该数字被传递并附加到列表中,以便在最后求和。

这是函数quest_ans()

def quest_ans():
    ans=0
    answer=input(str.lower("Please Enter a,b,c,d or e: "))
    if answer.lower() == 'a':
        quest_ans.ans =2
    elif answer.lower() == 'b':
        quest_ans.ans=3
    elif answer.lower() == 'c':
        quest_ans.ans=4
    elif answer.lower() == 'd':
        quest_ans.ans=5
    elif answer.lower() == 'e':
        quest_ans.ans=6
    return quest_ans.ans

只要用户输入正确答案选项之一 - 这一切都可以正常工作,但如果用户输入 a、b、c、d、e 以外的其他内容,我想通过打印消息来管理提醒他们并重新调用该函数以允许他们输入正确答案。 我试过 try except 块和 while 循环,但语法不正确。
任何帮助,将不胜感激。 阿比

试试这个:

def quest_ans():
    quest_ans.ans= 0 #just “ans” isn’t actually used
    while True: #to try over and over until a valid response is given
        
        answer=input("Please Enter a,b,c,d or e: ").lower()
        try: #if a 2+ character response is given, this will stop ord() causing an error
            if ord(answer) > 96 and ord(answer) < 102: #comparing ASCII of letter
                break
            else:
                print("please try again")
        except:
            print("please try again")

    if answer.lower() == 'a':
        quest_ans.ans =2
    elif answer.lower() == 'b':
        quest_ans.ans=3
    elif answer.lower() == 'c':
        quest_ans.ans=4
    elif answer.lower() == 'd':
        quest_ans.ans=5
    elif answer.lower() == 'e':
        quest_ans.ans=6
    return quest_ans.ans

使用while循环并循环直到有效条件,使用break退出循环。另外,不需要像 quest_ans.ans 这样的函数设置 属性 - 注意 ans 本身就足够了。

def quest_ans():
    ans=0
    while True:
        answer=input(str.lower("Please Enter a,b,c,d or e: "))
        if answer.lower() == 'a':
            ans =2
            break
        elif answer.lower() == 'b':
            ans=3
            break
        elif answer.lower() == 'c':
            ans=4
            break
        elif answer.lower() == 'd':
            ans=5
            break
        elif answer.lower() == 'e':
            ans=6
            break
        else:
            print('Try again, bro..')

    return ans

ans = quest_ans()
print('Dude youy entered:', ans)

请注意,从技术上讲,您的代码可以通过使用 dict 映射到数值的答案来改进或简化:

ans_map = {'a': 2, 'b': 3, 'c': 4, 'd': 5, 'e': 6}


def quest_ans():

    while True:
        answer = input("Please Enter a,b,c,d or e: ".lower()).lower()

        if answer in ans_map:
            return ans_map[answer]

        print('Try again, bro..')


ans = quest_ans()
print('Dude youy entered:', ans)

我平时不怎么用递归,不过我觉得这个时候比较适合用。

您编辑的函数:

def quest_ans():
    ans = 0
    answer = input(str.lower("Please Enter a,b,c,d or e: "))
    if answer.lower() == 'a':
        ans = 2
    elif answer.lower() == 'b':
        ans = 3
    elif answer.lower() == 'c':
        ans = 4
    elif answer.lower() == 'd':
        ans = 5
    elif answer.lower() == 'e':
        ans = 6
    else:
        print("Invalid option entered. Try again...")
        ans = quest_ans()
    return ans


answer = quest_ans()

基本上,如果用户输入了 a-e 以外的内容,else 块将捕获它并再次调用该函数,如果用户没有输入 a-e,它将继续重复。

希望对您有所帮助!