Остальное условие всегда работает - PullRequest
0 голосов
/ 05 октября 2018

В моем коде есть ошибка, которую я не могу определить.Этот код должен возвращать True, если список содержит [3,3].

Но, если я напишу условие else, оно всегда показывает False.Если я пропущу условие else, код работает нормально.

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
    pass

Приведенный выше код возвращает:

# Check
has_33([1, 3, 3]) . -- > False

# Check
has_33([1, 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
    pass

Код работает нормально:

# Check
has_33([1, 3, 3]) --> True

# Check
has_33([1, 3, 1, 3]) -- > Returns nothing , False.

Почему это происходит?

Ответы [ 4 ]

0 голосов
/ 05 октября 2018

Вы также можете внести небольшую корректировку в свою функцию и уменьшить отступ оператора «else» следующим образом:

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
    pass

Это стандартная структура цикла «for» в Python - если ваш цикл завершается правильнобез прерывания (в вашем случае - без нахождения двух последующих «3» в вашем списке), он выполняет оператор «else».

0 голосов
/ 05 октября 2018

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

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

    return flag
0 голосов
/ 05 октября 2018

Другие ответы объясняют ошибку довольно хорошо.Однако я хотел указать на две вещи.

  1. Лучшая практика в Python - избегать итераций по набору индексов, если это возможно, вместо этого предпочитая итерировать по объекту (например, for n in nums).
  2. Существуют библиотечные функции, которые значительно упрощают вашу жизнь.

Рассмотрим следующий код с использованием встроенных функций any() и zip().

def has_33(nums):
    return any(x==y==3 for x, y in zip(nums, nums[1:]))

Если вы хотите, вы можете сделать это более общим, чтобы его можно было применять в других проектах.Использование значения по умолчанию сохраняет исходное поведение.

def has_duplicate(nums, val=3):
    return any(x==y==val for x, y in zip(nums, nums[1:]))
0 голосов
/ 05 октября 2018

Это потому, что сначала выполняется условие else.У вас есть цикл for, который просматривает все числа в вашем списке [1,3,3], сначала он проверяет, является ли первое число 1, а затем второе число 3;

if nums[i]==3 and nums[i+1]==3:

В этом случае nums [i] равен 1, что означает, что nums [i] == 3 не соответствует True, что означает, что ваш код будет идти прямо к Else

Ирешение вашей проблемы простое:

def has_33(nums):
    for i in range(len(nums)):
        if nums[i]==3 and nums[i+1]==3:return True
    return False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...