1

ユーザーに特定の単語を入力してもらうようにしています。

私のコード:

import os

os.system("clear")

def get_answer():
    print "\nWould you like to 'hit', 'stick', 'double' down or 'split'?"
    x = raw_input('> ')
    answers = ['hit', 'stick', 'double', 'split']
    y = [i for i in answers if i in x]
    if y == []:
        get_answer()
    print y
    # exit(0)
    return y

def foo():
    a = get_answer()
    print a

foo()

初めて「ヒット」と答えた場合の出力は次のとおりです。

Would you like to 'hit', 'stick', 'double' down or 'split'?
> hit 
['hit']
['hit']

最初に「blah」と入力してから「hit」と入力した場合の出力は次のとおりです。

Would you like to 'hit', 'stick', 'double' down or 'split'?
> blah

Would you like to 'hit', 'stick', 'double' down or 'split'?
> hit
['hit']
[]
[]

私はこれを研究する方法さえ本当に知りません。それは単純な構文エラーですか、それとも私が理解していないより深い問題がありますか?これを正しく行う方法を知りたいです。

4

2 に答える 2

4

単純にテストする必要がif x in answersあります。これは、入力がの要素の1つであるかどうかを確認しますanswers

また、再帰を使用してユーザーの入力を取得しているため、誤った値を入力するとget_answer()、スタックに別の呼び出しが発生します。その結果、最も内側の呼び出しget_answerが有効な入力を取得している間、外側のget_answer呼び出しは実行を継続し、結果として奇妙な出力が表示されます。

たとえば、2番目のケースで['hit']は、は最も内側の呼び出しによって生成されprint y、最初[]の呼び出しは外側の呼び出しによって生成されprint y(内側がget_answer終了するため)、最後[]はinによって生成さprint aれますfoo()(外側get_answerが戻るため[])。

代わりにおそらくやりたいことは、(a)get_answer呼び出しを変更しreturn get_answer()て、最も内側の呼び出しの値がスタックに送り返されるようにするか、(b)get_answer呼び出しをループに変更して、適切な回答が得られたときにブレークアウトすることです。

ユーザーにオプションの1つだけを入力させようとしていると仮定すると、再帰の代わりにループを使用するようにコードを構造化する方法は次のとおりです。

def get_answer():
    answers = ['hit', 'stick', 'double', 'split']
    while True:
        print "\nWould you like to 'hit', 'stick', 'double' down or 'split'?"
        answer = raw_input('> ')
        if answer in answers:
            return answer

print get_answer()
于 2012-08-25T02:58:06.800 に答える
0

この問題はもう少し根本的なものです。get_answer()関数では、関数をそれ自体の内部から呼び出すことによって再帰します。

if y == []:
    get_answer()

これは機能しますが、意図した動作ではないかと思います。値の入力を適切に求めるには、get_answer()外部に電話する必要があります。get_answer()

とにかく、これが私があなたのコードをどのように構成するかです:

def get_answer(question, answers):
    response = raw_input(question)

    while response not in answers:
        response = raw_input(question)

    return response

if __name__ == '__main__':
    question = "Would you like to 'hit', 'stick', 'double' down or 'split'?\n> "
    answers = ['hit', 'stick', 'double', 'split']

    print get_answer(question, answers)
于 2012-08-25T03:11:23.230 に答える