2013-05-28 2 views
3

Я довольно новичок как для программирования, так и для Python. Несколько раз сейчас я создал то, что кажется неудобным потоком программы, и мне интересно, следую ли я лучшим практикам. Это концептуально то, что я хотел бы сделать:Управление потоком после выхода из цикла while в Python

def pseudocode(): 
    while some condition is true: 
     do some stuff 
     if a condition is met: 
      break out of the while loop 
    now do a thing once, but only if you never broke out of the loop above 

То, что я в конечном итоге делает работы, но чувствует себя прочь как-то:

def pseudocode(): 
    while some condition is true: 
     do some stuff 
     if some condition is met: 
      some_condition_met = True 
      break out of the while loop 

    if some_condition_met is False: 
     do a thing 

Есть ли лучший способ?

ответ

7

Вы ищете while-else цикла:

def pseudocode(): 
    while some condition is true: 
     do some stuff 
     if a condition is met: 
      break out of the while loop 
    else: 
     now do a thing once, but only if you never broke out of the loop above 

Из документации:

while_stmt ::= "while" expression ":" suite 
       ["else" ":" suite] 

break заявления выполняется в первом набора завершает цикл без выполнения набора Оговорки в else.

+0

Эй, теперь не существовало (очевидно!). Спасибо. –

3

Используйте else положения в петлю while:

while some_condition: 
    do_stuff() 
    if a_condition_is_met: 
     break 
else: 
    executed_when_never_broken 

Смотрите while statement documentation:

break заявления выполнено в первом наборе завершает цикл без выполнения набора Оговорки в else.

0

Если вы думаете об этом, вы, возможно, уже есть вполне хорошие условия для использования без установки флага: состояние в верхней части цикла While (или, точнее, not его). Предполагая, что вы не измените truthiness вашего состояния в течение одной и той же итерации, как break, это дает:

while something: 
    do_stuff() 
    if something_else: 
     break 
if not something: 
    more_stuff() 

Это имеет смысл, если вы думаете о while как неоднократного if: вместо происходит один раз, в то время как продолжает движение до состояния становится ложным.

Но, как и другие ответы уже упоминалось, аналогия идет еще дальше: так же, как вы не должны означать все if с, как

if a: 
    a_stuff() 
if not a: 
    b_stuff() 

while принимает else, который выполняется, если условие в верх тестируется и считается ложным. Так,

while something: 
    do_stuff() 
    if something_else: 
     break 
else: 
    more_stuff() 

И, так же, как и в случае if/else, это не подразумевает каких-либо дальнейших испытаний условия, чем то, что произошло бы в любом случае. Точно так же, как else, прикрепленный к if a, не будет работать, если true-branch делает a falsey, else, прикрепленный к while, никогда не будет работать после break, так как это явно пропускает когда-либо проверку состояния снова.Это делает эквивалент else: символу с разделителем в каждом случае.

Это также распространяется на for петель, даже при том, что аналогии нарушается - но он выполняет при достаточно подобных правил: else запускается, если цикл заканчивается, пробежав свой курс, а не ударять break.

+1

Обратите внимание, что условие 'else:' и 'if not something' test могут незначительно отличаться. Если условие цикла while while становится ложным во время цикла ** и ** вы используете 'break' во время той же самой итерации, то набор' else: 'не будет выполняться, но ваш' if' suite будет. –

+0

@MartijnPieters очень верно. Я отредактировал ответ для этого. – lvc