Почему код работает неверно, если else стоит под if, но если сдвинуть его на одну табуляцию влево, то всё работает исправно?

Рейтинг: 0Ответов: 2Опубликовано: 13.06.2023

Пытался сделать вывод простых чисел в диапазоне. Так выглядит мой изначальный код, он выводит мне набор дублирующихся чисел:

for number in range(1, 100): 
    if number > 1: 
        for i in range(2, number): 
            if(number % i) == 0: 
                break 
            else: 
                print(number) 

Но если написать else под for, то всё работает исправно и он выводит простые числа в нужном диапазоне:

for number in range(1, 100): 
    if number > 1: 
        for i in range(2, number): 
            if(number % i) == 0: 
                break 
        else: 
            print(number) 

Ответы

▲ 2Принят

К чему во втором случае относится else? К for, и срабатывает в том случае, если цикл не был прерван break, т.е. ни одно число не было делителем number. Всё правильно, значит number - простое. Такое использование else - специфично для Python (может, и ещё где есть).

В первом же случае else относится к if, и срабатывает на первом числе, не являющемся делителем number (9 не делится на 2? тут же выводим 9) - но ведь у него могут быть другие делители.

▲ 1

Вы не понимаете, как работает код, который выдаёт правильный результат. И это закономерно. Дело в том, что хотя синтаксически это и выгладит правильно, но смысл "закопан" довольно глубоко. Я не буду сейчас всё это подробно расписывать, просто покажу, как эта задача должна решаться "обычным" образом:

for number in range(1, 100): 
    if number > 1: 
        Simpl = True 
        for i in range(2, number):
            if(number % i) == 0:
                Simpl = False
                break
                 
        if Simpl: 
            print(number) 

Так гораздо более полнятно.