在Python 3中不使用`break`来停止迭代

时间:2014-11-21 19:33:00

标签: python python-3.x foreach iteration

例如,可以在没有break(没有continuereturn)的情况下重写此代码吗?

import logging

for i, x in enumerate(x):
    logging.info("Processing `x` n.%s...", i)
    y = do_something(x)
    if y == A:
        logging.info("Doing something else...")
        do_something_else(x)
    elif y == B:
        logging.info("Done.")
        break
编辑:由于有些人批评在循环中使用breakcontinue,我想知道Python是否允许在没有它们的情况下编写for循环。我会说Python不允许这样做(也许它会违反“一种方法”规则)。

EDIT2:评论者注意到我可以使用return代替,但这也不是解决方案。

4 个答案:

答案 0 :(得分:6)

你总是可以使用一个函数并从中返回:

import logging

def func():
    for i, x in enumerate(x):
        logging.info("Processing `x` n.%s...", i)
        y = do_something(x)
        if y == A:
            logging.info("Doing something else...")
            do_something_else(x)
        elif y == B:
            logging.info("Done.")
            return # Exit the function and stop the loop in the process.
func()

虽然在我看来使用break更优雅,因为它让你的意图更清晰。

答案 1 :(得分:1)

您可以使用布尔值来检查是否已完成。它仍将迭代循环的其余部分但不执行代码。一旦完成,它将继续前进而不会中断。示例下面的伪代码。

doneLogging = False
for i, x in enumerate(x):
    if not doneLogging:
        logging.info("Processing `x` n.%s...", i)
        y = do_something(x)
        if y == A:
            logging.info("Doing something else...")
            do_something_else(x)
        elif y == B:
            logging.info("Done.")
            doneLogging = True

答案 2 :(得分:0)

您也可以使用sys.exit()

import logging
import sys

for i, x in enumerate(x):
    logging.info("Processing `x` n.%s...", i)
    y = do_something(x)
    if y == A:
        logging.info("Doing something else...")
        do_something_else(x)
    elif y == B:
        logging.info("Done.")
        sys.exit(0)

答案 3 :(得分:0)

breakcontinue关键字只在循环中有意义,在其他地方它们是错误。

for grooble in spastic():
    if hasattr(grooble, '_done_'):
        # no need for futher processing of this element
        continue
    elif grooble is TheWinner:
        # we have a winner!  we're done!
        break
    else:
        # process this grooble's moves
        ...

任何不应该使用breakcontinue的人都不会教好Python。