Почему нельзя написать else на том же уровне отступов, что и if?

Стояла такая задачка. На входе список чисел, вернуть True если массив содержит где-нибудь 3 рядом с 3.

has_33([1, 3, 3]) → True
has_33([1, 3, 1, 3]) → False
has_33([3, 1, 3]) → False

Ниже решение.

def has_33(nums):
    for i in range(0,len(nums)-1):
        if nums[i] == 3 and nums[i+1] == 3:
            return True
    else:
        return False

Не понимаю, почему нельзя написать вот так:

def has_33(nums):
    for i in range(0,len(nums)-1):
        if nums[i] == 3 and nums[i+1] == 3:
            return True
        else:
            return False

Ответы (3 шт):

Автор решения: nukee

Здесь else относится не к if, а к for.

Если быть точнее, правильный ответ такой:

def has_33(nums):
    for i in range(0,len(nums)-1):
        if nums[i] == 3 and nums[i+1] == 3:
            return True
    else:
        return False
→ Ссылка
Автор решения: Phazerous

nukee сказал все верно, я просто поподробнее опишу, что происходит:

def has_33(nums):
    for i in range(0,len(nums)-1):
        if nums[i] == 3 and nums[i+1] == 3:
            return True
        else:
            return False

Как только у нас есть return, то функция автоматически прекращает выполнение. То есть, если мы напишем что-то такое:

def some_function():
    return False
    print('Hello world!')

То функции закончится на return False и дальше ничего выполнять не будет.

В коде выше Вы проверяете только одну итерацию, если она верна, то возвращаете True, иначе False. А до второй итерации Вы просто не доходите.

Самый верный код, как подметил, GrAnd будет:

def has_33(nums):
    for i in range(0,len(nums)-1):
        if nums[i] == 3 and nums[i+1] == 3:
            return True
    return False

Так как если совпадений нет, то нам нужно просто вернуть False.

→ Ссылка
Автор решения: CrazyElf

Потому что у вас условие задачи содержит где-нибудь 3 рядом с 3. Это значит, что если где-то встретилось 3 рядом с 3, то условие выполняется, можно возвращать True. Но если поставить else следом на том же уровне и вернуть в нём сразу False, то это будет значить, что если не содержит где-нибудь 3 рядом с 3, то условие не выполняется, а это не так, оно может выполниться в другом месте. Полностью соответствующее обратное условие будет нигде не содержит 3 рядом с 3, а это будет известно только когда цикл полностью закончится (нигде не встретилось) и только после этого можно ставить return False. При этом else, как многие уже написали, тут вообще не нужно на самом деле.

→ Ссылка