【问题标题】:Naming Loops in Python在 Python 中命名循环
【发布时间】:2011-12-07 17:32:25
【问题描述】:

我最近阅读了this question,其中有一个关于在 Java 中标记循环的解决方案。

我想知道 Python 中是否存在这样的循环命名系统。我曾多次遇到过需要从内部for 循环中跳出外部for 循环的情况。通常,我通过将内部循环放在一个函数中来解决这个问题,该函数返回(以及其他)一个用作中断条件的布尔值。但是标记循环中断似乎要简单得多,如果python中存在这样的功能,我想尝试一下

有人知道有吗?

【问题讨论】:

  • 查看second answer,希望对您有所帮助。但据我所知,不存在这样的系统。
  • “但是标记循环中断似乎要简单得多”?比适当的功能更简单?怎么会这样?你能提供一些证据证明这会如何“更简单”吗?
  • 我没有方便的示例,但在这种情况下,我必须创建一个仅在该位置使用的函数。也许“更简单”是错误的词。我的意思是我不必定义一个新函数只用于那个 ONE。
  • 嵌套函数定义有什么问题?另外,如何重新设计内部循环以避免break
  • 我只是不喜欢它们。我想这是个人喜好

标签: python for-loop label break


【解决方案1】:

这是一种使用上下文管理器打破多个嵌套块的方法:

import contextlib

@contextlib.contextmanager
def escapable():
    class Escape(RuntimeError): pass
    class Unblock(object):
        def escape(self):
            raise Escape()

    try:
        yield Unblock()
    except Escape:
        pass

您可以使用它来打破多个循环:

with escapable() as a:
    for i in xrange(30):
        for j in xrange(30):
            if i * j > 6:
                a.escape()

你甚至可以嵌套它们:

with escapable() as a:
    for i in xrange(30):
        with escapable() as b:
            for j in xrange(30):
                if i * j == 12:
                    b.escape()  # Break partway out
                if i * j == 40:
                    a.escape()  # Break all the way out

【讨论】:

  • 是的,这比简单地循环使用更具可读性; break 2 (php) 或 continue loop1; (javascript).. 另外,这个缩进地狱意大利面条代码真的是 Pythonic 吗?使用raise StopIteration 似乎是最干净、最易读、pythonic 的解决方案
【解决方案2】:

有人提议在 python PEP3136 中包含命名循环,但是,它被拒绝并解释为 here。拒绝的主要原因是在极少数情况下,通过包含此结构可以提高代码的可读性。

【讨论】:

    【解决方案3】:

    虽然有理由在语言结构中包含命名循环,但您可以在 python 中轻松避免它而不会失去可读性。 python中引用示例的实现

    >>> try:
        for i in xrange(0,5):
            for j in xrange(0,6):
                if i*j > 6:
                    print "Breaking"
                    raise StopIteration
                print i," ",j
    except StopIteration:
        print "Done"
    
    
    0   0
    0   1
    0   2
    0   3
    0   4
    0   5
    1   0
    1   1
    1   2
    1   3
    1   4
    1   5
    2   0
    2   1
    2   2
    2   3
    Breaking
    Done
    >>> 
    

    我通过将内部循环放在一个函数中来解决这个问题 返回(除其他外)一个用作中断的布尔值 条件。

    我认为你应该试试这个。这是非常 Pythonic、简单且易读的。

    【讨论】:

    • +1。在 Python 中使用异常来进行流控制是完美的,尽管在其他语言中它被认为是不好的风格,通常是出于性能原因。
    • 如果我只想“继续”外循环而不是停止它怎么办?
    • @Guillochon 只需将 try 语句放在第一个 for 循环中
    【解决方案4】:

    没有。

    根据您正在做的事情,您很有可能可以使用 itertools 中的某些东西将嵌套的 for 循环扁平化为单个 for 循环。

    【讨论】:

      猜你喜欢
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      相关资源
      最近更新 更多