У меня проблемы с пониманием того, что переменная делает прямо перед циклом for - PullRequest
1 голос
/ 09 мая 2019

Я новичок в python, и мне трудно понять, что делает переменная перед 'for' в этом операторе возврата.Я получил слегка измененную версию этого кода из этого вопроса

word = "boom"

def find_all(word, guess):
    return [i for i, letter in enumerate(word) if letter == guess]

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

Что же делает

i for i

?Я ничего не могу найти на нем, и когда я вынимаю это, это нарушает код.Есть ли способ записать это не в ответе?

Мой модифицированный код потом говорит о состояниях

board = "_" * len(word)
listed_board = list(board)

while board != word:
    guess = input("Input a letter here ").lower()
    if guess in word:
        indices = find_all(word, guess)
        print(indices)
        listed_board = list(board)
        for i in indices:
            listed_board[i] = guess
            board = "".join(listed_board)
        print(listed_board)

Единственная другая часть, которую я не понимаю, это когда она говорит

listed_board[i] = guess

Что это делает?На перечисленной доске это только подчеркивание в этой точке, так как же найти правильную позицию для вставки слова и установить его в соответствии с предположением пользователя?

Оцените ответы, спасибо!

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Хорошо, вот как работает ваш код:

word = "boom"

def find_all(word, guess):
    return [i for i, letter in enumerate(word) if letter == guess]

enumerate(word) создает новый итерируемый объект. Каждое письмо от 'boom' получает свой собственный idex: [(0, 'b'), (1, 'o'), (2, 'o'), (3, 'm')]. Теперь цикл for проходит через этот новый объект, где i равен индексу (число из списка выше), а letter (переменная) равна букве (значение из списка). Поэтому эта функция вернет список индексов для вашего предположения. Если предположение равно 'b', оно вернет [0], для 'o' это будет [1, 2], для 'm', [3], иначе этот список будет пустым.

Идем дальше:

while board != word:
    guess = input("Input a letter here ").lower()
    if guess in word:
        indices = find_all(word, guess)  # This will return all index where 'guess' is equal to letter from world. For example for word='foo', guess='o' it will return [1,2]
        print(indices)
        listed_board = list(board)
        for i in indices:  # for each index you have found:
            listed_board[i] = guess  # replace '_' with correct letter (guess)
            board = "".join(listed_board)  # change list to string
        print(listed_board)

Надеюсь, этот код сейчас более очевиден для вас.

1 голос
/ 09 мая 2019

enumerate(word) возвращает таблицу значений, которую вы можете перебрать с помощью i, letter. я был бы индексом, по которому вы перебираете, а буква - это элемент в перечисленном слове. i for i, letter означает, что вы выбираете только индекс, если условие (letter == guess) является правильным.

...