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