python:退出两个循环

l--*_*''' 26 python

  for row in b:
    for drug in drug_input:
      for brand in brand_names[drug]:
Run Code Online (Sandbox Code Playgroud)

从第三个循环如何退出当前循环并转到下一个值for row in b:

Don*_*ner 30

这个使用布尔值来看看你是否已经完成:

done = False
for x in xs:
    for y in ys:
        if bad:
            done = True
            break

    if done:
        break
Run Code Online (Sandbox Code Playgroud)

continue如果没有使用中断,这将是.在else将被跳过,如果有一个突破,所以它会看到未来break.这种方法的好处是不必使用变量,但可能更难以阅读.

for x in xs:
    for y in ys:
        if bad:
            break
    else:
        continue

    break
Run Code Online (Sandbox Code Playgroud)

  • @Teodor:读q.小心 - 最外面的循环不需要退出,所以w/2循环的例子是正确的 (2认同)
  • 很好的评论,但是指向 for ... else... 结构的指针可能对新手有好处 (2认同)

Ned*_*der 7

for row in b:
   more_drugs = True
   for drug in drug_input:
      for brand in brand_names[drug]:
          if something:
              more_drugs = False
              break

      if not more_drugs:
          break
Run Code Online (Sandbox Code Playgroud)

Python没有一次打破两个循环的控制结构,所以你需要像这样手动做一些事情.


Mar*_*ers 6

如果在一种方法中有三个循环级别,那么您可能需要重新考虑您的设计.

  • 将您的方法拆分为更小,更简单的方法.
  • 使用列表推导和方法all,any以避免编写显式循环.

执行上述任一操作都意味着您不再遇到此问题.


bri*_*anz 6

异常处理胜过遍布IMO的各种变量

for row in b:
    for drug in drug_input:
        try:
            for brand in brand_names[drug]:
                if some_condition:
                    raise StopIteration
        except StopIteration:
            break
Run Code Online (Sandbox Code Playgroud)

  • 如果您要使用异常,为什么不将异常处理移动一级而不使用break? (2认同)

Ton*_*nen 5

我会考虑将两个内部循环放在函数中并使用从那里返回.可能会重新思考你在做什么以及如何提供更好的替代方案.

你能给出你当前的伪代码,输入和输出,所以我们可以尝试首先消除中断的需要吗?我们需要查看循环变量的使用位置或更好,处理的目标是什么.


Nat*_*nst 5

我看到请求此功能的最新 PEP 是 3136(并被拒绝):http : //mail.python.org/pipermail/python-3000/2007-July/008663.html

我可以看到你想要做的最接近和最干净的事情是执行以下操作(并且由于即使类型名称也有范围,你可以在它需要的函数中声明 LocalBreak ):

class LocalBreak(Exception): pass

try:
   for i in ...:
       for h in ...:
           for j in ...:
              if should_break(j):
                 raise LocalBreak()
except LocalBreak:
   pass
Run Code Online (Sandbox Code Playgroud)