перерыв и продолжение функции

def funcA(i): if i%3==0: print "Oh! No!", print i break for i in range(100): funcA(i) print "Pass", print i 

Я знаю, что сценарий выше не работает. Итак, как я могу писать, если мне нужно поставить функцию с break или продолжить в цикл?

Функция не может вызвать разрыв или продолжить код, из которого он вызывается. Разрыв / продолжение должен появляться буквально внутри цикла. Ваши варианты:

  1. вернуть значение из funcA и использовать его, чтобы решить, следует ли прерывать
  2. вызывать исключение в funcA и улавливать его в вызывающем коде (или где-то выше по цепочке вызовов)
  3. напишите генератор, который инкапсулирует логику разрыва и перебирает ее вместо этого range

К № 3 я имею в виду что-то вроде этого:

 def gen(base): for item in base: if item%3 == 0: break yield i for i in gen(range(1, 100)): print "Pass," i 

Это позволяет поместить разрыв с условием, сгруппировав их в генератор на основе «базового» итератора (в данном случае диапазона). Затем вы перебираете этот генератор вместо самого диапазона, и вы получаете нарушение.

 def funcA(i): if i%3==0: print "Oh! No!", print i return True else: return False for i in range(100): if funcA(i): break print "Pass", print i 

Разработка BrenBarns ответ: break к счастью , не будет распространяться. break – разбить текущий цикл, период. Если вы хотите распространять событие, вы должны raise исключение. Хотя, создание исключения для разрыва цикла – это действительно уродливый способ разбить циклы и хороший способ разбить код.

KISS ! Простейшим было бы проверить условие непосредственно в цикле

 def my_condition(x): return x == 4 for i in xrange(100): if my_condition(i): break print i 

Если по какой-то причине вы хотите распространять исключение, то вы используете его так

 # exception example for i in xrange(100): if i == 4: raise Exception("Die!") print i 

Как уже упоминалось, это действительно уродливый дизайн. Представьте, что вы забыли поймать это исключение или измените его тип с Exception на MyBreakException и забудьте изменить его где-нибудь в try/except более высокой части кода …

Пример генератора имеет свои достоинства, он делает ваш код более функциональным (который я прежде всего обожаю)

 # generator example def conditional_generator(n, condition): for i in xrange(n): if condition(i): break else: yield i for i in conditional_generator( 100, my_condition ): print i 

… что похоже на takewhile , упомянутое eumiro

Разрыв не будет распространяться между функциями, вам нужно поместить его прямо в петлю где-нибудь.