Что именно происходит с отступом здесь?

Второй код пытается напечатать простые числа между диапазоном, но не может этого сделать и печатает некоторые числа несколько раз между диапазоном Первый код, где отступ кажется абсурдным, работает отлично, и я не понимаю, как работает отступ для этого

for num in range(lower,upper + 1):     
   for i in range(2,num):
       if (num % i) == 0:
           break
   else:
         print(num)

for num in range(lower,upper + 1):     
   for i in range(2,num):
       if (num % i) == 0:
           break
       else:
           print(num)

person Aditya Maniar    schedule 12.08.2019    source источник
comment
Вы можете прочитать об операторе for-else здесь: stackoverflow.com/a/114420/5079316   -  person Olivier Melançon    schedule 12.08.2019
comment
Спасибо. Я только что узнал об отношениях else-for, как только закончил публикацию этого, а затем не смог удалить его.   -  person Aditya Maniar    schedule 12.08.2019


Ответы (3)


Единственное, что «абсурдно» в отступе первого кода, это то, что последний print имеет отступ больше, чем нужно.

else применительно к циклу выполняется, когда цикл исчерпан (в отличие от разрыва). Таким образом, в первом коде, если num не делится ни на одно i, оно будет напечатано, что вам и нужно.

else при применении к if не влияет на объемлющий цикл. В частности, внутренний цикл продолжится, то есть num будет напечатано для каждого i, которое не делит num поровну.

person Scott Hunter    schedule 12.08.2019

В Python есть предложение else не только для if, но и для for циклов. Предложение for ... else срабатывает, если цикл не принудительно покидают (через return, raise или break), но итерация завершается нормально.

for i in range(3):
    print(i)
else:
    print('done')

for i in range(5):
    print(i)
    if i == 3:
        break  # break skips the else clause
else:
    print('done')

Для вашего кода это означает:

  • В первом случае else срабатывает, если ни один из i не срабатывает (num % i) == 0.
  • Во втором случае else срабатывает, если один (или несколько) из i не вызывает (num % i) == 0.
person MisterMiyagi    schedule 12.08.2019
comment
... второй случай, иначе срабатывает для каждого значения i, которое делает... - person Scott Hunter; 12.08.2019
comment
@ScottHunter Это не имелось в виду исключительно. Я сделал формулировку более понятной. - person MisterMiyagi; 12.08.2019

Вы ожидаете, что если какое-либо число ниже числа не делится на это число, то выведите его

или вы находите, есть ли какие-либо корни числа

Во втором коде вы передаете последовательность кода в другой случай каждый раз, когда проверяете делимость с числом. Однако, как и ожидалось, вы должны напечатать число только после того, как число пройдет условие if для всех чисел под ним.

person Himanshu    schedule 12.08.2019