0

これは、例として使用している私のプログラムのダムダウンバージョンです。

GOTOを使用すると、コードがずさんで混乱するため、悪い習慣であることを私は知っていますが、私が抱えているこの問題を解決するには完璧です(問題は投稿の下部に詳しく説明されています)。

def prompt():
    while True:
        user_input = raw_input:
        if input == '?':
            print help_o
        elif not user_input.isalpha():
            print "You entered bad characters"
        elif user_input == 'r': ##Restart
            ???????????
        else:
            return user_input


load_word_list() ##Load words into list

for word in wordList: ##Loop that needs to restart
    for i in range(5):
        to_speak = "Spell, %s" %word
        subprocess.Popen(['espeak', to_speak])
        answer = prompt()
        if answer != word:
            print "You got it wrong"


#Print results

プロンプトで、wordListリストをリロードし、外側のforループを再開します。

GOTOを使用すると、???? ... GOTO load_word_list()の代わりに使用できます。

しかし、これはPythonであるため(そしてPythonは優れたコードに関するものです)、この問題を解決するためのPythonの方法は何ですか?

4

5 に答える 5

3

からタプルを返すことができますprompt()

    elif user_input == 'r': #Restart
        return True, None
    else:
        return False, user_input

    restart, answer = prompt()
    if restart:
        break
    if answer != word:
        print "You got it wrong"
于 2012-09-21T00:17:07.537 に答える
1
class RestartException(Exception):
    pass

def prompt():
    while True:
        user_input = raw_input:
        if input == '?':
            print help_o
        elif not user_input.isalpha():
            print "You entered bad characters"
        elif user_input == 'r': #Restart
            raise RestartException
        else:
            return user_input


load_word_list() ##Load words into list

for word in wordList: ##Loop that needs to restart
    try:
        for i in range(5):
            to_speak = "Spell, %s" %word
            subprocess.Popen(['espeak', to_speak])
            answer = prompt()
            if answer != word:
                print "You got it wrong"
     except RestartException:
        pass
于 2012-09-21T00:19:16.933 に答える
1

jsbuenosソリューションの別の見方。これは実際に外側のforループを再実行します。

def prompt():
    while True:
        user_input = raw_input()
        if input == '?':
            print help_o
        elif not user_input.isalpha():
            print "You entered bad characters"
        elif user_input == 'r': #Restart
            raise RestartException
        else:
            return user_input


class RestartException(Exception):
    pass


while True:
    load_word_list() ##Load words into list
    try:
        for word in wordList: ##Loop that needs to restart
            for i in range(5):
                to_speak = "Spell, %s" %word
                subprocess.Popen(['espeak', to_speak])
                answer = prompt()
                if answer != word:
                    print "You got it wrong"
    except RestartException:
        # catch the exception and return to while loop
        pass
    else:
        # exit while loop
        break
于 2012-09-21T02:27:12.123 に答える
0

私はあなたが何をしたいのかあまり理解していませんが、forループpromptの特殊なケースを削除して直接処理することができます'r'

于 2012-09-21T00:16:55.100 に答える
0
def prompt():
    while True:
        user_input = raw_input("enter words")
        if input == '?':
            print help_o
        elif not user_input.isalpha():
            print "You entered bad characters"
        elif user_input == 'r': #Restart
            return False
        else:
            return user_input


answer = True

while answer == True:
    load_word_list() ##Load words into list

    for word in wordList: ##Loop that needs to restart
        for i in range(5):
            to_speak = "Spell, %s" %word
            subprocess.Popen(['espeak', to_speak])
            answer = prompt()
            if answer == False:
                answer = True # reset for the while loop
                break # break to while loop
            elif answer != word:
                print "You got it wrong"

print results
于 2012-09-21T01:14:53.693 に答える