python :跳出嵌套循环

53 阅读4分钟

参考网址

blog.csdn.net/lyf6667/art…

前言

很多人说 Python 是很优雅的语言,但凡事都有个弱点,有些时候对于某种情况,用 Python 实现起来却不那么"优雅"。
例如下面的例子,我们想要跳出这个嵌套循环:
    for a in list_a:
        for b in list_b:
            if condition(a,b):
                break
关键词 break 只能跳出这个循环中的内循环,而不能跳出外层的循环。
那有没有什么方法一次性跳出所有循环? 
Python 里有没有哪个内置的关键词可以实现呢? 并没有!!!
不过 Python 毕竟是很灵活的语言,我们有很多方法可以解决上面的问题,下面我就介绍 5 中跳出嵌套循环的方法。

1/使用"旗帜"变量

这是个有效的解决方案,我们定义一个变量,作为一个"旗帜",
例如:
# 添加"旗帜"变量
break_out_flag = False
for i in range(5):
    for j in range(5):
        if j == 2 and i == 0:
            break_out_flag = True
            break
    if break_out_flag:
        break
如上面的代码,break_out_flag 作为一个"旗手"告诉这个程序该跳出这个外循环了。

这个代码在执行上没什么问题,不过这显得我们的代码有点乱,因为我们引用了新的变量去解决这个问题,这个新变量并非是非要引入的。

2/引发异常

如果 break 关键词不能达到我们的期望,那么是否可以引入其他的操作呢.
比如 Python 的异常处理技术,我们可以使用它跳出嵌套循环。
这里引发异常的目的并不是真的引发异常,而是为了跳出嵌套循环。
因为在捕捉异常的时候,直接写了 pass,也就是说,引发异常并没有导致程序出错,而只是跳出了for循环。
# 引发异常
try:
    for i in range(5):
        for j in range(5):
            if j == 2 and i == 0:
                raise StopIteration
except StopIteration:
    pass
就如上面代码所示,我们把异常"exception"当做关键词 break 使用,这样就可以一次跳出所有循环。

3/使用相同的条件语句

由于一个条件语句可以中断一次循环,那么使用相同的条件语句同样也可以再一次中断一个循环,例如:
    # 使用相同的条件语句
     
    for i in range(5):
        for j in range(5):
            if j == 2 and i == 0:
                break
        if j == 2 and i == 0:
            break
上面的代码可行,但并不是一个好的解决方案,至少在效率上很差,因为重复执行一个条件语句会浪费很多时间。

4/使用 for else语句

Python 里有一个很特殊的语句:"for-else"。 
它并不流行以至于很少有人知道它,因为习惯上 else 是搭配 if 来使用。

不过对于这个问题,它却是很有帮助:

# 使用 For-Else 语句
for i in range(5):
    for j in range(5):
        if j == 2 and i == 0:
            break
    else:  # 仅在内循环不中断时执行
        continue
    break

上面的代码中显示了 for-else 语句的优势,因为 else 下面的语句只有当内循环执行完成并没有任何中断的时候才执行。

如果对 for-else 还不熟悉,可以看一下下面的代码,是 for-else "翻译"过来的写法:

# 和 for-else 一样的
for i in range(5):
    for j in range(5):
        if j == 2 and i == 0:
            break
    if not (j == 2 and i == 0):
        continue
    break 

总之,这个方法很可以,就是 for-else 这种形式不好理解。 

5/将嵌套循环放在一个函数里

如果我们将嵌套循环放在一个函数中,那么跳出嵌套循环是非常简单的,因为我们可以使用 return 这个关键词替代 break# 将嵌套循环放在一个函数里
def check_sth():
    for i in range(5):
        for j in range(5):
            if j == 2 and i == 0:
                return
check_sth() # 执行这个函数

如上所示,这个解决方案就显得更加优雅了,既不需要"旗帜"变量,也不需要异常处理或是 for-else 语法以及多余的条件判断。

函数的用法在 Python 里是很灵活的,我们可以很容易的创建一个嵌套函数或是一个闭包函数。如果这个跳出嵌套循环的函数在调用它的函数里只使用一次,那么我们可以这样写:

def out_func():
    # 这里干点啥
    def check_sth():
        for i in range(5):
            for j in range(5):
                if j == 2 and i == 0:
                    return
    # 这里干点别的
    check_sth()  # 执行这个函数
    # 这里继续干

不过,使用嵌套函数看起来并不怎么"优雅"

6/总结

这里我们了解了5种跳出嵌套循环的方法,虽然每种方法都没有 PHP 来的简单直接,但我们也是可以实现这样的操作地。作为编程人员我们应该了解语言的特性,在不同情况下用不同的方法解决问题。