Я не могу исправить проблему с кодом в python

Я пытаюсь определить 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]) дает истинный результат. Почему это происходит?

Это из-за отступа. В myfunction, если условие num[0:2] == [3,3] не выполняется, то функция сразу возвращает False. В то время как в has_33 он перебирает весь список, а затем возвращает False только в том случае, если нет последовательных [3,3].

Aneesh Palsule 19.02.2019 12:15

@AneeshPalsule: Возможно, вы могли бы написать свой комментарий в качестве ответа.

quamrana 19.02.2019 12:26

@quamrana Проблема с написанием этого в качестве ответа заключается в том, что основная проблема отступов дублируется до тошноты и представляет собой не более чем опечатку (сделанную кем-то, кто не осознает значение таких опечаток)

John Coleman 19.02.2019 12:27

@JohnColeman: Да, я хотел бы что-нибудь сделать с этой вечной проблемой. Но в то же время есть еще один пользователь, который нуждается в поощрении.

quamrana 19.02.2019 12:33

Часть проблемы @quamrana заключается в том, что, несмотря на то, что эта ошибка появляется все время, редко бывает хорошая повторяющаяся цель (особенно та, которую можно разумно ожидать от человека, задающего проблему). Если бы они знали, как искать отступы, они могли бы решить свою проблему, не спрашивая.

John Coleman 19.02.2019 12:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
5
74
3

Ответы 3

Привет, в обоих кодах есть разница в отступах: в первой функции второй возврат находится внутри цикла 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

Давайте шаг за шагом в функции

  1. for i in range(0,len(num)-1)

    i инициализируется 0, то есть i = 0.

  2. nums[i:i+2]

    Поскольку i есть 0, становится nums[0:2], т.е. [nums[0], nums[1]].

  3. 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 не будет выполнен.

  4. Поскольку return False находится в цикле for и условие if не выполнено, выполняется следующая строка, то есть return False. Здесь выполнение функции останавливается.

Теперь вторая функция:

nums = [1,2,3,3,5]

has_33(nums)
True

Шаг за шагом

  1. То же, что моя функция.
  2. То же, что моя функция.
  3. То же, что моя функция.
  4. Вот в чем загвоздка. Поскольку return False записывается вне цикла for, i увеличивается на 1. i = 1
  5. nums[i:i+2] это nums[1:3] который есть [nums[1], nums[2]].
  6. Цикл продолжается до тех пор, пока вы не получите [3,3] ИЛИ i = len(nums) - 1.

Надеюсь, это поможет вам понять, что пошло не так.

Другие вопросы по теме