Выдает ошибку TypeError: warn_the_sheep_begin() missing 2 required positional arguments: 'herd'


herd =['sheep', 'sheep', 'sheep', 'sheep', 'sheep', 'wolf', 'sheep', 'sheep']
def where_wolf():
    for i in range (0,len(herd)):
        if herd[i]=='wolf':
            return i
i = where_wolf()

def warn_the_sheep_begin(herd):
    i = i+1
    while herd[i]=='sheep':
        herd.remove(i)
        i = i+1
        return herd
print(warn_the_sheep_begin())


Ответы (1 шт):

Автор решения: Zhihar

у вас функция требует входной параметр

def warn_the_sheep_begin(herd)

но вы вызываете ее без параметра

print(warn_the_sheep_begin())

когда вы это исправите, то получите ошибку в строке

def warn_the_sheep_begin(herd):
    i = i+1 # <- ошибка тут

потому что вы пытаетесь изменить внешнюю переменную, а питон этого не любит, как только вы начинаете менять переменную она становится локальной, а локальная переменная i в функции warn_the_sheep_begin не определена

когда вы исправите эту ошибку, то следующая будет логической:

    herd.remove(i)
    i = i+1

нельзя удалять из списка элемент, а потом еще и делать шаг вперед, так вы легко будете выходить за границы, удалять не те элементы и не удалять которые нужно

затем при других данных вы словите ошибку вот здесь

i = where_wolf()

ведь если волк не найден, то функция where_wolf ничего не возвращает, т.е. будет возвращено None, а вы это никак не обрабатываете, считая что в i всегда число

далее у вас ошибка в цикле while

while herd[i]=='sheep':
    herd.remove(i)
    i = i+1
    return herd

в чем смысл цикла, если вы его сразу прерываете через return

кроме того в функции warn_the_sheep_begin у вас опять нет общего return из-за чего функция будет возвращать None если волки идут один за другим

P.S.

это вообще ваш код или вы пытаетесь что-то наваять на чужом, но с нулевыми знаниями в питоне?

P.P.S.

как я понимаю, ваш? код должен был делать только это:

herd = ['sheep', 'sheep', 'sheep', 'sheep', 'sheep', 'wolf', 'sheep', 'sheep', 'wolf']


def warn_the_sheep_begin(herd):
    start = herd.index('wolf') if 'wolf' in herd else -1

    if start == -1:
        return herd

    finish = herd.index('wolf', start + 1) if 'wolf' in herd[start + 1:] else -1

    return herd[:start + 1] + (herd[finish:] if finish != -1 else [])


print(warn_the_sheep_begin(herd))

P.P.P.S.

вот так функция даже попонятнее и побыстрее будет

def warn_the_sheep_begin(herd):
    try:
        start = herd.index('wolf')
    except ValueError:
        return herd

    try:
        finish = herd.index('wolf', start + 1)
    except ValueError:
        return herd[:start + 1]

    return herd[:start + 1] + herd[finish:]
→ Ссылка