Как использовать функцию main и while вместе - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь написать цикл, который выполняет мою функцию, пока пользователь продолжает вводить слова.(то есть останавливается, когда слово не вводится.)

Все, кроме части цикла, работает.Я не знаю, как использовать while функцию с основной функцией.

done = False
while not done:

    def main():
        words = str(input("Please enter a word: "))
        words = words.split()
        for word in range(len(words)):
            i = words[word]
            if i[0] in ['a', 'e', 'i', 'o', 'u']:
                words[word] = i+'way'
            elif i[0] not in ['a', 'e', 'i', 'o', 'u']:
                words[word] = i[1:]+i[0]+'ay' 
            else:
                print('STOP')
                done = True
                break
            return ' '.join(words)

    def t(str):
            return str[0]+str[1]

    if __name__ == "__main__":
            x = main()
            print(x)

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вот рефакторинг, который вносит следующие изменения:

  • def должен быть вне цикла while;переопределение той же функции снова и снова не имеет смысла.
  • Цикл read-eval-print находится в main, что вызывает pig_latin для фактической логики Pig Latin.

Некоторые дополнительные комментарии в строке.

def pig_latin(string):
    # Don't use the same variable name for a string and a list
    words = string.split()
    for word in range(len(words)):
        i = words[word]
        if i[0] in ['a', 'e', 'i', 'o', 'u']:
            words[word] = i+'way'
        # no need for "elif", you already tested this
        else:
            words[word] = i[1:]+i[0]+'ay' 
    # Outdented -- don't return too early
    return ' '.join(words)

# Commented out -- this function is not used
"""
def t(str):
        return str[0]+str[1]
"""

def main():
    while True:
        # No need for str(); input always returns a string
        words = input("Please enter a word: ")
        if words == "":
            print('STOP')
            break
        print(pig_latin(words))

if __name__ == "__main__":
    # Put absolutely no real logic here; just dispatch
    main()

Обратите внимание, что все взаимодействие с пользователем выделено одним куском, а фактическая функция (sic) для перевода текста является отдельной.

0 голосов
/ 11 февраля 2019

Идея наличия главной функции состоит в том, чтобы инкапсулировать весь код в нем и выполнять его, только если файл не вызывается как модуль (if __name__ == '__main__').Не очень питонно с моей точки зрения, но все будет примерно так:

def t(str):
    # unused function btw
    return str[0]+str[1]

def main():
    done = False
    while not done:

        words = str(input("Please enter a word: "))
        words = words.split()
        for word in range(len(words)):
            i = words[word]
            if i[0] in ['a', 'e', 'i', 'o', 'u']:
                words[word] = i+'way'
            elif i[0] not in ['a', 'e', 'i', 'o', 'u']:
                words[word] = i[1:]+i[0]+'ay' 
            else:
                # this doesn't make any sense
                # you're covering all possible scenarios
                # with the if and elif
                # this code will never be executed
                print('STOP')
                done = True
                break
        # note that this return has to be out of the for
        # otherwise it would only make one iteration
        # probably out of the while loop too
        return ' '.join(words)

if __name__ == "__main__":
        x = main()
        print(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...