如何提前结束循环一次迭代?
How to end loop one iteration earlier?
我经常需要提前结束循环一次,如何优雅地完成?
Breaking out of nested loops 在我看来很乱。
现在我用 return 解决它,但稍后我想做一个 class,在构造函数中间有 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])
您也可以只使用 break
:
for i in range(1,100):
if i==10:
break
这将在条件匹配时终止循环。
一个通用的解决方案是从迭代器创建一个生成器(它将生成迭代器生成的最后一个元素以外的所有元素):
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)
我建议您将神经元对象实现为 class 方法 __iter__
以使对象可根据您喜欢的行为进行迭代:
class MyClass(object):
def __iter__(self):
yield 2
yield 5
yield 10
obj = MyClass()
for i in obj:
print i
我经常需要提前结束循环一次,如何优雅地完成? Breaking out of nested loops 在我看来很乱。 现在我用 return 解决它,但稍后我想做一个 class,在构造函数中间有 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])
您也可以只使用 break
:
for i in range(1,100):
if i==10:
break
这将在条件匹配时终止循环。
一个通用的解决方案是从迭代器创建一个生成器(它将生成迭代器生成的最后一个元素以外的所有元素):
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)
我建议您将神经元对象实现为 class 方法 __iter__
以使对象可根据您喜欢的行为进行迭代:
class MyClass(object):
def __iter__(self):
yield 2
yield 5
yield 10
obj = MyClass()
for i in obj:
print i