1

この質問には2つの質問があります。

  1. whileループの条件に関連する特定の条件優先ルールのセットはありますか?
  2. 2つの満たされた条件(つまり、condition_xまたはcondition_y)のいずれかを取得してループを終了するにはどうすればよいですか?

詳細:

Pythonの初心者として、特定の条件が他の条件よりも優先されるwhileループの状況に遭遇しています。

私は作ろうとしています:

  1. 必要な2つの値のいずれか、つまり「y」または「n」
  2. ただし、「n」が選択されている場合は、値「ok」を許可するカスタムプロンプトを返します。
  3. ステップ1の「y」またはステップ3の「ok」のいずれかの入力がループを終了するようにします。

何が起こっているのかというと、「n」を入力すると、最初の条件が優先され、ステートメントが返されます。

please enter 'y' or 'n'

私がそれを返したいとき:

oh come on, enter 'ok'

コード:

(2つbreakの'の使用がおそらく間違っていることを認識しています-ループを終了するために'y'または'ok'のいずれかを取得する方法を理解できませんでした)

while True:
    user_input = raw_input('question? (y/n)')
    my_string = 'here is a string '
    if len(user_input) == 0:
        print 'question? (y/n)'
    elif user_input is not 'y' or 'n':
        print 'please enter \'y\' or \'n\''
    elif user_input is 'n':
        print 'oh come on, enter \'ok\''
    elif user_input is 'ok':
        print my_string + ', ' \
        .join(list_var[:-1]), list_var[-1] + '?'
        break
    else:
        print my_string + ', ' \
        .join(list_var[:-1]), list_var[-1] + '?'
        break
4

1 に答える 1

2

ブール論理を間違って構築しています。使用する:

elif user_input not in ('y', 'n'):

代わりは。

user_input is not 'y' or 'n'は、として解釈されます(user_input is not 'y') or ('n')。これは常にTrueになります(空でない文字列はTrueブール値のコンテキストで考慮されます)。

>>> if 'n': print 'n!'
...
n!

==また、同一性テストの代わりに同等性テストを使用する必要がありisます。is2つのオペランドが同じオブジェクトであるかどうかを==テストし、が同じ値であるかどうかをテストします。たまたま両方ともTrueであるが、それはPythonの最適化であり、すべての文字列で機能するために信頼できるものではない小さな文字列の場合。

次の問題は、ユーザー入力がの使いすぎである場合に何が起こるかということですelifuser_inputの場合ok、たとえば、そうではないので 、他のすべてのブランチを除いて一致します。ynelif user_input not in ('y', 'n')elif

あなたは本当にあなたの論理を単純化したいです:

if user_input not in ('y', 'n', 'ok'):
    print "please enter 'y' or 'n'"
elif user_input == 'n':
    print "oh come on, enter 'ok'"
else:
    print '{}{}{}?'.format(my_string, ', '.join(list_var[:-1]), list_var[-1])
    break

whileこれはループとは何の関係もありません。

于 2013-03-20T14:46:45.960 に答える