цикл for повторяет только первую букву

#python #debugging #for-loop

#python #отладка #цикл for

Вопрос:

Кажется, что мой цикл повторяет первую букву, а затем прерывается, хотя предполагается, что он повторяет каждую букву в секретном слове, например, приведенный ниже код должен выводить «_pp_e», но вместо этого он выводит только «_». Я не понимаю, в чем проблема с этим кодом??

 def getGuessedWord(secretWord, lettersGuessed):
    '''
    secretWord: string, the word the user is guessing
    lettersGuessed: list, what letters have been guessed so far
    returns: string, comprised of letters and underscores that represents
      what letters in secretWord have been guessed so far.
    '''
    # FILL IN YOUR CODE HERE...
    for letter in secretWord:
        if letter in lettersGuessed:
            return letter
        else:
            return '_'

print(getGuessedWord("apple",  ['e', 'i', 'k', 'p', 'r', 's']))
  

Комментарии:

1.Ну, вы return из функции на первой итерации. return завершает функцию там и тогда, так for что цикл тоже не будет продолжаться.

2. вы должны создать набор результатов из своего цикла, прежде чем определять свой ответ, так как вы сокращаете возврат, как сказал Мартинн.

3. В образовательных целях вы также можете использовать понимание списка для этого: ''.join([x if x in lettersGuessed else '_' for x in secretWord])

Ответ №1:

Вы return из функции на первой итерации. return завершает функцию там и тогда, поэтому for цикл также не будет продолжаться.

Вам нужно создать возвращаемое значение в самой функции. Создавайте результирующую строку по одному символу за раз, используя список для хранения всех символов, а затем объединяя их в одну строку в конце:

 def getGuessedWord(secretWord, lettersGuessed):
    '''
    secretWord: string, the word the user is guessing
    lettersGuessed: list, what letters have been guessed so far
    returns: string, comprised of letters and underscores that represents
      what letters in secretWord have been guessed so far.
    '''
    guessed = []
    for letter in secretWord:
        if letter in lettersGuessed:
            guessed.append(letter)
        else:
            guessed.append('_')
    return ''.join(guessed)
  

Если вы чувствуете себя предприимчивым, вы могли бы даже сделать это для понимания списка и выполнить всю работу в одной строке:

 def getGuessedWord(secretWord, lettersGuessed):
    '''
    secretWord: string, the word the user is guessing
    lettersGuessed: list, what letters have been guessed so far
    returns: string, comprised of letters and underscores that represents
      what letters in secretWord have been guessed so far.
    '''
    return ''.join([l if l in lettersGuessed else '_' for l in secretWord])
  

Любая из версий дает ожидаемый результат:

 >>> print(getGuessedWord("apple",  ['e', 'i', 'k', 'p', 'r', 's']))
_pp_e
  

Ответ №2:

Ключевое слово return завершает работу вызывающей функции. Это должно сработать:

 def getGuessedWord(secretWord, lettersGuessed):

    result = ''
    for letter in secretWord:
        if letter in lettersGuessed:
            result  = letter
        else:
            result  = '_'
    return result

print(getGuessedWord("apple",  ['e', 'i', 'k', 'p', 'r', 's']))
  

Здесь вы начинаете с пустой строки в качестве результата и либо добавляете букву (если она была включена в список), либо символ подчеркивания (если его не было), затем возвращаете результирующую строку.