Person JeffAtwood;
Person JoelSpolsky;
JeffAtwood.TalkTo(JoelSpolsky);
Здесь не надеется ни на какую хвостовую рекурсию!
for ii in range(200):
for jj in range(200, 400):
...block0...
if something:
break
else:
...block1...
Break
прервет внутренний цикл, а блок 1 не будет выполнен (он будет запущен только в том случае, если внутренний цикл завершается нормально).
На других языках вы можете пометить цикл и выйти из помеченного цикла. Предложение по улучшению Python (PEP) 3136 предлагало добавить их в Python , но Гвидо отклонил его :
Однако я отклоняю его на том основании, что код настолько сложен для требовать эту функцию очень редко. В большинстве случаев существуют существующие обходные пути, которые производят чистый код, например, используя return. Хотя я уверен, что есть некоторые (редкие) реальные случаи, когда ясность code would suffer from a refactoring that makes it possible to use Возвращаясь, это компенсируется двумя проблемами:
Сложность, постоянно добавляемая к языку. Это не влияет только все реализации Python, но также и все инструменты анализа исходного кода, плюс, конечно, вся документация по языку.
Я ожидаю, что этой функцией будут злоупотреблять больше, чем она будет используется правильно, что приводит к чистому снижению ясности кода (измеряется по весь код Python, написанный отныне). Ленивые программисты везде, и прежде чем вы это узнаете, у вас в руках невероятный беспорядок неразборчивый код.
Так что, если вы на это надеялись, вам не повезло, но посмотрите на один из других ответов, там есть хорошие варианты.
Я думаю, вы могли бы сделать что-то вроде этого:
for ii in range(200):
restart = False
for jj in range(200, 400):
...block0...
if something:
restart = True
break
if restart:
continue
...block1...