Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的命名循环_Python_For Loop_Label_Break - Fatal编程技术网

Python中的命名循环

Python中的命名循环,python,for-loop,label,break,Python,For Loop,Label,Break,我最近读了一篇关于Java中标记循环的解决方案的文章 我想知道Python中是否存在这样的循环命名系统。我曾多次遇到这样的情况:我确实需要从内部for循环中突破外部for循环。通常,我通过将内部循环放在一个函数中来解决这个问题,该函数返回(除其他外)一个用作中断条件的布尔值。但是为中断循环添加标签似乎要简单得多,如果python中存在这样的功能,我想尝试一下 >>> try: for i in xrange(0,5): for j in xrange(0

我最近读了一篇关于Java中标记循环的解决方案的文章


我想知道Python中是否存在这样的循环命名系统。我曾多次遇到这样的情况:我确实需要从内部
for
循环中突破外部
for
循环。通常,我通过将内部循环放在一个函数中来解决这个问题,该函数返回(除其他外)一个用作中断条件的布尔值。但是为中断循环添加标签似乎要简单得多,如果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
>>> 

有人知道它是否存在吗?

有人提议在python中包含命名循环,但被拒绝并给出了解释。拒绝的主要原因是,很少有情况会通过包含此结构来提高代码的可读性。


根据您所做的工作,您很有可能使用itertools中的某些内容将嵌套的for循环展平为单个for循环

尽管在语言构造中包含命名循环是有原因的,但在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
>>> 
我通过将内循环放入一个 返回(除其他外)用作断点的布尔值 条件


我想你应该试试这个。这是非常python的,简单易读

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

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

检查一下,希望对你有所帮助。但从我所看到的情况来看,没有这样的系统存在。“但是给断开的循环贴上标签似乎要简单得多”?比适当的函数更简单?为什么呢你能提供一些证据证明这是如何“简单”的吗?我手头没有一个例子,但在这种情况下,我必须创建一个只在这一点上使用的函数。也许“更简单”是个错误的词。我的意思是,我不必定义一个新函数,只为在那个地方使用。嵌套函数定义有什么错?另外,如何重新设计内部循环以避免
中断
?我只是不喜欢它们。我想这是个人喜好+1。在Python中,将异常用于流控制是非常简单的,尽管在其他语言中,通常出于性能原因,它被认为是不好的风格。如果我只是想“继续”外部循环,而不是停止它,该怎么办?@Guillochon只是将try语句放在第一个for循环中