例如,可以在没有break
(没有continue
或return
)的情况下重写此代码吗?
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
编辑:由于有些人批评在循环中使用break
和continue
,我想知道Python是否允许在没有它们的情况下编写for
循环。我会说Python不允许这样做(也许它会违反“一种方法”规则)。
EDIT2:评论者注意到我可以使用return
代替,但这也不是解决方案。
答案 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)
break
和continue
关键字只在循环中有意义,在其他地方它们是错误。
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
...
任何不应该使用break
和continue
的人都不会教好Python。