По сути, это упрощает любой цикл, который использует логический флаг, подобный следующему:
found = False # <-- initialize boolean
for divisor in range(2, n):
if n % divisor == 0:
found = True # <-- update boolean
break # optional, but continuing would be a waste of time
if found: # <-- check boolean
print n, "is composite"
else:
print n, "is prime"
и позволяет пропустить управление флагом:
for divisor in range(2, n):
if n % divisor == 0:
print n, "is composite"
break
else:
print n, "is prime"
Обратите внимание, что уже существует естественное место для выполнения кода, когда вы находите делитель - прямо перед break
. Единственная новая функция - это место для выполнения кода, когда вы попробовали все делители и не нашли ни одного.
Это помогает только в сочетании с break
. Вам все еще нужны логические значения, если вы не можете разорвать (например, потому что вы ищете последнее совпадение или вам нужно отслеживать несколько условий параллельно).
Да, и кстати, это работает и для циклов while.
/ всех
В настоящее время, если единственной целью цикла является ответ «да» или «нет», вы можете написать его намного короче с помощью функций any()
/ all()
с генератором или выражением генератора, которое возвращает логические значения:
if any(n % divisor == 0
for divisor in range(2, n)):
print n, "is composite"
else:
print n, "is prime"
Обратите внимание на элегантность! Код 1: 1, что вы хотите сказать!
[Это так же эффективно, как цикл с break
, потому что функция any()
имеет короткое замыкание, только запускает выражение генератора, пока не получит True
. На самом деле это обычно даже быстрее, чем цикл. Более простой код Python, как правило, имеет меньше слышать.]
Это менее работоспособно, если у вас есть другие побочные эффекты - например, если вы хотите найти делитель. Вы все еще можете сделать это (ab), используя тот факт, что в Python значение, отличное от 0, истинно:
divisor = any(d for d in range(2, n) if n % d == 0)
if divisor:
print n, "is divisible by", divisor
else:
print n, "is prime"
но, как вы видите, это становится шатким - не будет работать, если 0 было возможным значением делителя ...