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

时间:2014-09-26 19:41:11

标签: 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

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

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

4 个答案:

答案 0 :(得分: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

在旁注中,您还可以使用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()

答案 1 :(得分:4)

使用while循环继续输入,直到用户输入正确的输入。

 def selectDiff():
    difficulty = ['easy', 'medium', 'hard']
    while True:
        diff = raw_input('easy, medium or hard').lower()
        if diff in difficulty:
            if diff == 'easy':
                return 20   
            elif diff == 'medium':
                return 25   
            elif diff == 'hard':
                return  30    
        else:
            print "Please select easy, medium or hard\n"

答案 2 :(得分:3)

您在自己内部调用selectDiff(),然后忽略返回值。你最好使用循环而不是无限递归。

比如说:

def selectDiff():
    while True:
        diff = raw_input('easy, medium or hard').lower()
        if diff=='easy':
            return 20
        if diff=='medium':
            return 25
        if diff=='hard':
            return 30
        print "Please select easy, medium or hard\n"

答案 3 :(得分:0)

我认为你希望在这里做的是使upperbound成为一个动态范围的闭包变量,即使你可能不知道这些单词是什么意思。这不会起作用,因为Python不进行动态范围设定(大多数其他现代语言也不做),而且在3.x Python封闭变量分配给它们之前不起作用。

但是,您可以通过仔细使用全局变量或(更好)一个词法范围的变量来模拟您想要的范围,并且您可以通过将变量存储在另一个可变变量中来模拟赋值。所以:

def selectDiff():
    upperbound = [0]

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

            elif diff == 'medium':
                upperbound[0] = 25

            elif diff == 'hard':
                upperbound[0] = 30

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

    realSelectDiff()
    return upperbound[0]

现在,每次拨打realSelectDiff都没有设置自己的upperbound本地副本,他们都设置了外selectDiff份副本upperbound值。

所有这一切,这几乎都不是一个好主意。如果你想使用递归,你几乎总是想要在堆栈中传递值,并且你不想首先使用递归来模拟循环。但值得了解这是如何运作的。