Я получаю сообщение об ошибке, когда заканчиваю оператор if заключительным оператором else - PullRequest
0 голосов
/ 16 марта 2020

Я написал этот Python код, который проверял бы список и возвращал True, если два элемента в списке рядом друг с другом имеют одинаковое значение:

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

Результат 1:

>>> samer([1,3,44,5,5,8])
False

Здесь я озадачен, потому что чувствую, что он должен вернуться True.

Результат 2:

>>> samer([3,3,49,93,5,8])
True

Возвращается True только если первое и второе число в списке - True.

Решение:

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

Приведенный выше код работает хорошо, поэтому мой вопрос в том, что оператор else имеет отступ под if Цель условия - вернуть False, если ни один номер в списке не находится рядом друг с другом в процессе for l oop, почему я все еще получаю False в Результат 1?

Это то, что он не l oop снова после проверки первых двух полей и почему, так как это цель от for l oop до go на каждой итерации, а затем проверить условия

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Когда функция возвращается, все. Функция завершена, завершена, завершена ..

Поскольку вы возвращаете либо true, либо false при проверке каждого элемента, вы действительно проверяете только время first через l oop (элементы один и два), как вы заметили.

Вы должны возвращать true, если совпадение найдено, и возвращать false только в конце, когда вы проверили everything и, следовательно, , нет совпадений найдено. Этот код уже в вашем вопросе, бит под The solution.

0 голосов
/ 16 марта 2020

Таким образом, чтобы добавить сюда, как только произойдет первая проверка итерации, мы знаем, что она будет возвращать False, так как первые два элемента не совпадают, и программа заканчивается там. Если вы хотите действительно увидеть, что это так, используйте встроенную функцию print(), чтобы видеть, что происходит каждый раз, когда элемент повторяется в for l oop:

Примерно так:

 def samer(nums):
    for i in range(0,len(nums)-1): 
       if (nums[i]) == (nums[i+1]):
          print(True)
       else:
          print(False)

 ### adding a main method is always a good idea for clarity.   
 if __name__ == "__main__":
   print(samer([1,3,44,5,5,8]))

Вывод такой:

 False
 False
 False
 True 
 False

Посмотрите, что возвращено True для 3-го элемента, поскольку они равны и расположены рядом друг с другом.

Но с учетом того, как вы структурировали его в первом примере, он возвращает False, когда попадает в контрольно-пропускной пункт после того, как проверит и увидит, что первая итерация не равна друг другу и, таким образом, вернула False ,

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

 if __name__ == "__main__":
  print(samer([1,3,44,5,5,8]))

Вывод:

False

С вашим подходом решение , который великолепен, l oop только "завершается", когда оно действительно не может найти совпадение (те же два числа), он вернет False без зависимости от оператора else. Поэтому, если он найдет совпадение, он вернет True, что делает, а затем прекратит итерацию и выйдет из программы.

...