0

My code is a quiz - along the lines of which character in 'The book' are you most like - basically a series of questions with options of a,b,c,d,e as the answers.

`#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)`

The code next calls a function to allow the user input their answer, the function also takes that answer and converts it to a number, which is passed and appened to a list, for summing at the end.

This is the function 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

As long as the user enters the one of the correct answer options - this all works fine, but I want to manage if the user enters something other than a, b, c, d, e by printing a message to alert them and re calling the function to allow them enter a correct answer. I've tried try except blocks and while loops and I can't get the syntax right.
Any help would be appreciated. Abbie

abbiekk
  • 11
  • 2
  • 1
    Does this answer your question? [Asking the user for input until they give a valid response](https://stackoverflow.com/questions/23294658/asking-the-user-for-input-until-they-give-a-valid-response) the [accepted answer](https://stackoverflow.com/a/23294659/15873043) is quite exhaustive :) – fsimonjetz May 27 '22 at 23:06

3 Answers3

1

Use a while loop and loop until a valid condition, which uses break to exit out of the loop. Also, don't need to set a property on the function like quest_ans.ans - note that ans is sufficient by itself.

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)

Note that, technically your code could be improved or simplified through use of a dict mapping answer to numeric value:

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)
rv.kvetch
  • 9,940
  • 3
  • 24
  • 53
0

Try this:

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
Pwuurple
  • 352
  • 2
  • 11
0

I usually don't use recursion, but I think this is a relatively good time to use it.

Your edited function:

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()

Basically, if the user enters something other than a-e, the else block will catch it and call the function again, which will keep on being repeated if the user does not enter a-e.

Hope this helped!