2015-10-19 60 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