Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

Is there a way to accomplish this function in less lines of code? I am learning python and want to make sure I am baking in good habits...I repeat myself twice which I don't like and it seems "european in answer or african in answer" is a sloppy way to search for those two strings.

def door():
    print "Welcome to the door!"
    print "A man has been waiting for you. To enter you must get his question correct."
    print "What is the average velocity of a barn swallow?"

    answer = raw_input("> ")

    if "european" in answer or "african" in answer:
        print "Welcome inside!"
    else:
        i = 3
        while i != 0:
            print "You have %d guesses left." % i
            i -= 1
            answer = raw_input("> ")

            if "european" in answer or "african" in answer:
                print "Welcome inside!"
                break
            elif i == 0:
                print "How do you not ask what kind of swallow?!"
            else:
                continue
share|improve this question
add comment

migrated from stackoverflow.com Jan 30 '13 at 23:13

This question came from our site for professional and enthusiast programmers.

1 Answer

The final else: continue in your code doesn't do anything and could be removed. It is also fairly simple to remove some repetition just by moving the bit that gets the input and responds for the first time, to the inside of the loop. And a for...else loop may be preferable to while here.

def door():
    print """Welcome to the door!
A man has been waiting for you. To enter you must get his question correct.
What is the average velocity of a barn swallow?"""    
    for attempt in reversed(range(4)):
        answer = raw_input("> ")
        if "european" in answer or "african" in answer:
            print "Welcome inside!"
            break
        if attempt:
            print "You have %d guesses left." % attempt
    else:
        print "How do you not ask what kind of swallow?"

I don't see anything wrong with "european" in answer or "african" in answer, but if you had a larger number of permissible answer strings you could do something like:

swallow_types = 'african', 'asian', 'european'
if any(swallow in answer for swallow in swallow_types):

If you like recursion you could do...

def door():
    def get_answer(left):
        answer = raw_input("> ")
        if "european" in answer or "african" in answer:
            return "Welcome inside"
        if left:
            print "You have %d guesses left." % left
            return get_answer(left - 1)
    print """Welcome to the door!
A man has been waiting for you. To enter you must get his question correct.
What is the average velocity of a barn swallow?"""
    print get_answer(left=3) or "How do you not ask what kind of swallow?"

(Though this is not particularly recommended because it adds needless complexity - see comments. I leave it in just to show another way that you could do it.)

As general advice, not repeating yourself, reducing lines of code and making code more pythonic are not always the same thing. The ideas here are not that much more pythonic than your original, but just avoid repetition by altering the structure. Pythonic is not always brief in terms of number of lines because of the guiding principles 'explicit is better than implicit', 'sparse is better than dense', and 'readability counts'.

share|improve this answer
1  
I wouldn't use recursion here, there's no good reason to do so. A normal loop would (should) be preferable in this case. –  Jeff Mercado Jan 31 '13 at 2:18
    
@JeffMercado I agree but will leave it in there just to show it's another possibility. –  Stuart Jan 31 '13 at 2:24
    
No need for complexity at swallow types. Just do: if answer in ['african', 'european', ...] –  user1882585 Jan 31 '13 at 9:44
1  
@user1882585 No, that is different from the original post, which searches for a string within the answer, while your idea searches for the answer within a list of strings. For instance "Do you mean an african or european swallow?" would be a valid answer in the original code. –  Stuart Jan 31 '13 at 11:24
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.