Я пытаюсь определить 2 функции, но работает только has_33, а myfunction не работает.
Я пробую этот код в блокноте jupyter:
def myfunction(num):
for i in range(0, len(num)-1):
if num[i:i+2] == [3,3]:
return True
return False
и этот код:
def has_33(nums):
for i in range(0, len(nums)-1):
if nums[i:i+2] == [3,3]:
return True
return False
myfunction([1,2,4,3,3]) должен давать истину, но дает ложный результат, а has_33([1,2,4,3,3]) дает истинный результат. Почему это происходит?
@AneeshPalsule: Возможно, вы могли бы написать свой комментарий в качестве ответа.
@quamrana Проблема с написанием этого в качестве ответа заключается в том, что основная проблема отступов дублируется до тошноты и представляет собой не более чем опечатку (сделанную кем-то, кто не осознает значение таких опечаток)
@JohnColeman: Да, я хотел бы что-нибудь сделать с этой вечной проблемой. Но в то же время есть еще один пользователь, который нуждается в поощрении.
Часть проблемы @quamrana заключается в том, что, несмотря на то, что эта ошибка появляется все время, редко бывает хорошая повторяющаяся цель (особенно та, которую можно разумно ожидать от человека, задающего проблему). Если бы они знали, как искать отступы, они могли бы решить свою проблему, не спрашивая.






Привет, в обоих кодах есть разница в отступах: в первой функции второй возврат находится внутри цикла for, где, как и во второй функции, он находится вне цикла for:
Итак, в первой функции, когда условие ложно, и оно возвращается ко второму возврату и возвращает ложное значение для первого значения 0
Во второй функции, если оценка остается ложной, пока i не станет 3, а цикл for не выполняет return. Как только оценка становится истинной при i = 0, она выполняет возврат if и возвращает true, поэтому управление выходит из функции, а второй возврат из for не выполняется:
исправлена первая функция:
def myfunction(num):
for i in range(0,len(num)-1):
if num[i:i+2] == [3,3]:
return True
return False
Ошибка отступа! Просто нужно было стереть пробел из последней строки вашего первого кода. Теперь цикл for вернет False. Попробуйте так:
def myfunction(num):
for i in range(0,len(num)-1):
if num[i:i+2] == [3,3]:
return True
return False
Размещение моего комментария в качестве ответа, предложенного @quamrana.
Такое поведение связано с отступом. В myfunction, если условие nums[0:2] == [3,3] не выполняется, то функция сразу возвращает False. В то время как в has_33 он перебирает весь список, а затем возвращает False только в том случае, если нет последовательных [3,3].
например
nums = [1,2,3,3,5]
myfunction(nums)
False
for i in range(0,len(num)-1)
i инициализируется 0, то есть i = 0.
nums[i:i+2]
Поскольку i есть 0, становится nums[0:2], т.е. [nums[0], nums[1]].
if num[i:i+2] == [3,3]
Становится if num[0:2] == [3,3]. Так как nums[0] = 1 и nums[1] = 2, [nums[0], nums[1]] != [3,3]. Таким образом, блок if не будет выполнен.
return False находится в цикле for и условие if не выполнено, выполняется следующая строка, то есть return False. Здесь выполнение функции останавливается.Теперь вторая функция:
nums = [1,2,3,3,5]
has_33(nums)
True
return False записывается вне цикла for, i увеличивается на 1.
i = 1nums[i:i+2] это nums[1:3] который есть [nums[1], nums[2]].[3,3] ИЛИ i = len(nums) - 1.Надеюсь, это поможет вам понять, что пошло не так.
Это из-за отступа. В
myfunction, если условиеnum[0:2] == [3,3]не выполняется, то функция сразу возвращает False. В то время как вhas_33он перебирает весь список, а затем возвращает False только в том случае, если нет последовательных[3,3].