Функция возвращает внутри цикла? - PullRequest
0 голосов
/ 10 апреля 2020

Как операторы return функции работают внутри для циклов? Посмотрите мой код ниже, что заставило меня задуматься об этом.

Это похоже на игру в скрэббл. Вам дают n букв (мы будем называть это рукой), и цель состоит в том, чтобы сделать слово из вашей руки. Рука находится в форме словаря, вот так:

yellow = {'y':1, 'e':1, 'l':2, 'o':1, 'w':1}

Я написал функцию с именем get_frequency_dict для преобразования строки в эту форму.

Я хочу написать функцию, которая сообщает мне, является ли данное слово правильным или нет. У меня есть список допустимых слов в переменной word_list

Вызов функции: is_valid_word(word, hand, word_list), которая принимает три входа.

word: string
hand: dictionary (string: int)
word_list: list of lowercase strings

Итак, я хотел написать эту функцию, которая возвращает True, если слово допустимо, и False, если слово недопустимо:

def is_valid_word(word, hand, word_list):


    word_dict = get_frequency_dict(word.lower())


    if word.lower() in word_list:

        for char in word_dict:
            if (char in hand) and (hand[char] >= word_dict[char]):
                return True
            else:
                return False

    else:
        return False

Эта функция отлично работает с различными различные входные данные, но я не совсем уверен, что понимаю логи c за функцией, возвращаемой в for l oop?

Как мы l oop через ключи в словаре (буквы) , мы получим True или False в зависимости от того, выполнено условие или нет. Итак, как функция знает, что вернуть? Что если один символ возвращает False, а следующий символ возвращает True? Мгновенно ли он возвращает False, как только он видит один False в for для l oop?

Код, представленный ниже, имеет для меня больший смысл:

total_false = 0

    for char in word_dict:
        if (char in hand) and (hand[char] >= word_dict[char]):
            pass
        else:
            total_false += 1

    if word.lower() not in word_list:
        return False
    elif total_false > 0:
        return False
    else:
        return True

Имеет ли первый сегмент кода сделать этот "подсчет" за кадром? Как, если мы увидим Ложь, она вернет Ложь?

1 Ответ

0 голосов
/ 10 апреля 2020

Просто переберите список и, если вы обнаружите ошибку, остановитесь:

def is_valid_word(word, hand, word_list):


    word_dict = get_frequency_dict(word.lower())


    if word.lower() in word_list:

        for char in word_dict:
            if (char in hand) and (hand[char] >= word_dict[char]):
                continue
            else:
                return False #This will stop the function and return false

    else:
        return False #This will do the same


    #At the end, this means that all of the criteria are met, so we return True
    return True

Как мы видим, в тот момент, когда символ не соответствует критериям, функция останавливается и возвращает false. Если он отвечает всем критериям, он возвращает true.

...