【问题标题】:Continuing a while loop after breaking a nested for loop中断嵌套的 for 循环后继续 while 循环
【发布时间】:2016-01-31 16:48:59
【问题描述】:

在满足嵌套 for 循环中的某些条件后,我正在寻找一种更 Pythonic 的方式来继续 while 循环。对我有用的非常笨重的代码是:

tens = ['30','40','50','60','70','80','90','00']
z=0
while z==0:
    num = input('Please enter a number: ')
    z=1    
    for x in tens:
        if num[0]=='0' or x in num:
            print('That was an invalid selection, please try again.\n')
            z=0  # There has GOT to be a better way to do this!
            break
print(num+' works, Thank You!')

我可以使用 this question 中回答的 try/except :

tens = ['30','40','50','60','70','80','90','00']
while True:
    num = input('Please enter a number: ')  
    try:
        for x in tens:
            if num[0]=='0' or x in num:
                print('That was an invalid selection, please try again.\n')
                raise StopIteration
    except:
        continue
    break
print(num+' works, Thank You!')

我面临的挑战是

a) 当 if 满足时继续 while 循环(请求新的输入)(换句话说,在同一步骤中中断 for 循环并继续 while 循环)

b) 对每个新输入进行测试,从头开始运行 tens 迭代。

注意:这个问题与 Reddit Challenge #246 Letter Splits

更新:结合 Håken Lid 提供的答案,代码变为

tens = ['30','40','50','60','70','80','90','00']
while True:
    num = input('Please enter a number: ')
    if num[0]=='0' or any(t in num for t in tens):
        print('That was an invalid selection, please try again.\n')
        continue
    break
print(num+' works, Thank You!')

我还没有解决“从嵌套的 for 循环中断/继续”的问题,但是用 any() 函数替换循环对我来说肯定有用。

【问题讨论】:

    标签: python for-loop


    【解决方案1】:

    在大多数情况下,嵌套循环是糟糕的设计。

    你的函数总是应该尽可能的小。应用该规则,您将永远不会违反 SOLID 的第一条规则(单一责任原则)。

    您的代码可能如下所示:

    tens = ['30','40','50','60','70','80','90','00']
    
    def main():
        while 1:
            num = input('Please enter a number: ')
            if nested_test(num):
                print('That was an invalid selection, please try again.\n')
                break
    
    def nested_test(num):
        for x in tens:
            if <some test>:
                return True
    

    【讨论】:

    • 我同意。将嵌套循环/条件测试变成自己的函数对象可能是最易读的选项。
    【解决方案2】:

    不需要您的for 循环。只需使用in 关键字。但除此之外,您对break 的使用也很好。

    tens = ['30','40','50','60','70','80','90','00']
    while True:
        num = input('Please enter a number: ')
        if num in tens:
           break
        print('That was invalid selection, please try again.\n')
    print(num+' works, Thank You!')
    

    【讨论】:

    • 不幸的是,这不起作用。我正在尝试查看十位中的任何两位数组合是否存在于更大的整数输入中,例如 55530555。
    • 我明白了。在这种情况下,您可以使用if any(t in num for t in tens):
    • 或者使用正则表达式。 if re.search('[3-90]0', num):
    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2011-12-01
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多