跳出嵌套循环[重复]

2025-01-08 08:50:00
admin
原创
207
摘要:问题描述:有没有比抛出异常更容易的方法来跳出嵌套循环?(在Perl中,你可以为每个循环添加标签,并且至少继续执行外层循环。)for x in range(10): for y in range(10): print x*y if x*y > 50: ...

问题描述:

有没有比抛出异常更容易的方法来跳出嵌套循环?(在Perl中,你可以为每个循环添加标签,并且至少继续执行外层循环。)

for x in range(10):
    for y in range(10):
        print x*y
        if x*y > 50:
            "break both loops"

即,有没有比以下更好的方法:

class BreakIt(Exception): pass

try:
    for x in range(10):
        for y in range(10):
            print x*y
            if x*y > 50:
                raise BreakIt
except BreakIt:
    pass

解决方案 1:

for x in range(10):
    for y in range(10):
        print(x * y)
        if x * y > 50:
            break
    else:
        continue  # only executed if the inner loop did NOT break
    break  # only executed if the inner loop DID break

对于更深的循环也是同样的道理:

for x in range(10):
    for y in range(10):
        for z in range(10):
            print(x, y, z)
            if (x * y * z) == 30:
                break
        else:
            continue
        break
    else:
        continue
    break

解决方案 2:

至少有人提出过这个建议,但也被拒绝了。我认为除了重复测试或重新组织代码外,没有其他办法了。有时这有点烦人。

在拒绝信息中,van Rossum 先生提到使用return,这确实很明智,我个人需要记住。:)

解决方案 3:

如果您能够将循环代码提取到函数中,return则可以使用语句随时退出最外层循环。

def foo():
    for x in range(10):
        for y in range(10):
            print(x*y)
            if x*y > 50:
                return
foo()

如果很难提取该函数,您可以使用内部函数,如@bjd2385 建议的那样,例如

def your_outer_func():
    ...
    def inner_func():
        for x in range(10):
            for y in range(10):
                print(x*y)
                if x*y > 50:
                    return
    inner_func()
    ...

解决方案 4:

使用 itertools.product!

from itertools import product
for x, y in product(range(10), range(10)):
    #do whatever you want
    break

这是 Python 文档中 itertools.product 的链接:
http: //docs.python.org/library/itertools.html#itertools.product

您还可以循环遍历包含 2 个 for 的数组推导,并在需要时随时中断。

>>> [(x, y) for y in ['y1', 'y2'] for x in ['x1', 'x2']]
[
    ('x1', 'y1'), ('x2', 'y1'),
    ('x1', 'y2'), ('x2', 'y2')
]

解决方案 5:

有时我会使用布尔变量。如果你愿意的话,这很幼稚,但我发现它非常灵活且易于阅读。测试变量可以避免再次测试复杂的条件,也可以收集内部循环中多个测试的结果。

    x_loop_must_break = False
    for x in range(10):
        for y in range(10):
            print x*y
            if x*y > 50:
                x_loop_must_break = True
                break
        if x_loop_must_break: break

解决方案 6:

如果你要抛出异常,你可以抛出StopIteration 异常。这至少可以让意图变得明显。

解决方案 7:

您还可以重构代码以使用生成器。但这可能不是解决所有类型嵌套循环的解决方案。

解决方案 8:

在这种特殊情况下,您可以使用 itertools.product 将循环与现代 python(3.0 以及可能的 2.6)合并。

我自己将此作为一条经验法则,如果嵌套了太多循环(例如,超过 2 个),通常能够将其中一个循环提取到不同的方法中或将循环合并为一个,就像在这种情况下一样。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2974  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1836  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   47  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   47  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   48  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用