2015-10-19 89 views
1

我经常需要更早地结束循环一次迭代,我该如何优雅地做到这一点? Breaking out of nested loops看起来很凌乱给我。 现在我用return来解决它,但是后来我想要创建一个类时,在构造函数的中间返回时会失去感觉。如何提前结束循环一次迭代?

def forward(neurons): 
for layerId, layer in enumerate(neurons): 
    if layerId == neurons.__len__() - 1: 
     return 
    for idx, i in enumerate(neurons[layerId]): 
     for idx2, n in enumerate(neurons[layerId+1]): 
      neurons[layerId+1][idx2] += i * sigmoid(weights[layerId][idx][idx2]) 
+0

*具有构造的中间收益失去意义*您还可以使用函数,从构造器调用它。 – sloth

+1

请注意,您应该使用'len(神经元)'而不是'神经元.__ len __()'。 'break'有什么问题? – jonrsharpe

+2

你的例子不是爆发嵌套循环的情况。在你似乎希望从循环中突破的点不是嵌套的(还)。那么使用'break'有什么问题? – skyking

回答

0

一个通用的解决方案是创建迭代器发电机(将产生所有,但最后一个元素的迭代器产量):

def but_last(p): 
    first = True 
    for x in p: 
     if not first: 
      yield last 
     first = False 
     last = x 

for layerId, layer in but_last(enumerate(neurons)): 
    do_your_stuff(layerId, layer) 
0

您也可以只使用break

for i in range(1,100): 
    if i==10: 
    break 

这会尽快为条件匹配杀死循环。

+0

他有嵌套循环 –

+0

但是,你可以将这个条件应用于'if layerId == neurons .__ len __()-1'条件。 – Henry

0

我会建议你实现你的神经元对象作为带班方法__iter__按照你喜欢的行为使对象可迭代:

class MyClass(object): 
    def __iter__(self): 
     yield 2 
     yield 5 
     yield 10 


obj = MyClass() 

for i in obj: 
    print i