突破while循环,不重复代码

时间:2014-07-22 15:29:22

标签: python while-loop control-flow

我正在向用户询问一系列问题并记录他们的答案。我的提问者检查这些答案的格式并在用户输入奇怪的内容时返回一个标记(如my name is 102)。

我希望这个程序能够在任何这些答案出错的情况下立即突破问题集。我正在尝试使用while循环来执行此操作,但我很清楚这个while循环只检查每个循环结束时的标志值,因此它不会重新启动问题请求进程直到块问题已经完成。

注意`letter'变量是此示例中用户输入的代理。这不是代码的实际外观。

def string_checker(letter, output):
    if type(letter) != str:
        print('You did not give me a string!')
        output = 1

    return output

output = 0
# this should go until question 3, when the user makes a mistake
while output == 0:

    # question 1
    letter = 'bob'
    print(letter)
    output = string_checker(letter, output)

    # question 2
    letter = 'aldo'
    print(letter)
    output = string_checker(letter, output)

    # question 3 --- user gets this wrong
    letter = 1
    print(letter)
    output = string_checker(letter, output)

    # question 4
    letter = 'angry'
    print(letter)
    output = string_checker(letter, output)

# but it seems to ask question 4, regardless
print('done!')

我有没有办法修改此代码,以便永远不会询问question 4

基于JASPER's ANSWER的更新代码

以Jasper的答案为基础,提供完整的解决方案......对我的问题的这种修改解决了这个问题。通过在检查函数内部引发ValueError,try块立即失败,我们可以使用return返回main。

def string_checker(letter):
    if type(letter) != str:
        raise ValueError

def main():
    # this should go until question 3, when the user makes a mistake
    try:

        # question 1
        letter = 'bob'
        print(letter)
        string_checker(letter)

        # question 2
        letter = 'aldo'
        print(letter)
        string_checker(letter)

        # question 3 --- user gets this wrong
        letter = 1
        print(letter)
        string_checker(letter)

        # question 4
        letter = 'angry'
        print(letter)
        string_checker(letter)

    # we make a mistake at question 3 and go straight to here
    except ValueError as ve:
        print('You did not give me a string!')
        return 'oops'

    # exit
    return 'done'

3 个答案:

答案 0 :(得分:4)

您可以在每个问题后检查string_checker的结果是1

if output == 1:
    break

break语句将立即退出循环。

通过这样做,您不需要在while中拥有该条件,因此您可以进行无限while

while True:
    ...

答案 1 :(得分:0)

# question 3 --- user gets this wrong
letter = 1
print(letter)
output = string_checker(letter, output)

# Add this to your code:

if output == 1:
    break

休息完全跳出了while循环,你很高兴。 唯一的问题是,计算机仍然是

print('done!')

所以也许您想要包含错误代码或类似内容。

也许是这样的?

if output == 1:
    print "You have given an invalid input"
    break

编辑:

我意识到它会打印“你输入的内容无效” 然后打印“完成!”

相反,你应该让程序停止运行,输入无效:

if output == 1:
    print "You have given an invalid input"
    return

return语句将完全停止程序。

答案 2 :(得分:0)

虽然这不回答问题标题,但我认为循环是错误的设计选择(假设您不会多次提出相同的问题)。相反,你可以提出例外:

try:
  # ask question

  if not string_checker(...):
    raise ValueError

  # ask next question

except ValueError as ve:
  print("wrong answer")