从包含if ifif else语句的函数返回变量

Jas*_*son 0 python python-2.7

我正在尝试raw_input使用以下代码检查这是三个选项之一的选择:

def selectDiff():
    upperbound = 0
    difficulty = ['easy', 'medium', 'hard']
    diff = raw_input(' or '.join(difficulty)).lower()
    if diff in difficulty:
        if diff == 'easy':
            upperbound = 20

        elif diff == 'medium':
            upperbound = 25

        elif diff == 'hard':
            upperbound = 30

    else:
        print "Please select easy, medium or hard\n"
        selectDiff()

    return upperbound
Run Code Online (Sandbox Code Playgroud)

如果用户从难度列表中输入值,则['easy','medium','hard']该函数按照我的意愿工作,但如果用户首先输入未包含在列表中的值,则当他们最终输入列表中找到的值时,该变量upperbound将返回为0.我试过移动return语句,但结果是相同的,或者由于在变量被拒绝之前引用变量而得到错误.

是否有可能改变我的方法以产生所需的行为,还是应该使用另一种方法?

Rog*_*Fan 5

我同意在这里使用循环可能更有意义,但如果你想继续使用递归,只需分配upperbound内部的结果selectDiff.

def selectDiff():
    difficulty = ['easy', 'medium', 'hard']
    diff = raw_input(' or '.join(difficulty)).lower()

    if diff in difficulty:
        if diff == 'easy':
            upperbound = 20
        elif diff == 'medium':
            upperbound = 25
        elif diff == 'hard':
            upperbound = 30
    else:
        print "Please select easy, medium or hard\n"
        upperbound = selectDiff()  # Use the returned value

    return upperbound
Run Code Online (Sandbox Code Playgroud)

另外,您还可以使用a dict替换elif链并使其更容易扩展.

def selectDiff():
    difficulty = {
        'easy': 20, 
        'medium': 25, 
        'hard': 30,
    }

    diff = raw_input(' or '.join(difficulty)).lower()
    try:
        return difficulty[diff]
    except KeyError:
        print "Please select easy, medium or hard\n"
        return selectDiff()
Run Code Online (Sandbox Code Playgroud)