0

ここに私のコードがあります

a="yes"
b="no"
c=a[0].upper() + a[1:]
d=b[0].upper() + b[1:]
e=a.upper()
f=b.upper()
def shut_down(s):
    if s == a or c or e:
        return "Shutting down..."
    if s == b or d or f:
        return "Shutdown aborted"
    else:
        return"yeah"

そのため、関数を呼び出しても正しく実行されません (すべての if ステートメントを実行しません)。私は Python が初めてで、これがなぜなのかわかりませんが、次のように作業をやり直すと、次のように機能します。意図されました

a="yes"
b="no"
c=a[0].upper() + a[1:]
d=b[0].upper() + b[1:]
e=a.upper()
f=b.upper()
def shut_down(s):
    if s == a: 
        return "Shutting down..."
    if s== e:
        return "Shutting down..." 

    if s ==c:
        return "Shutting down..."
    if s == b:
        return "Shutdown aborted!"
    if s == d:
        return "Shutdown aborted!"
    if s == f:
        return "Shutdown aborted!"

else:
    return "Sorry, I didn't understand you."

なぜこれが起こっているのか誰か教えてください

4

2 に答える 2

0

これは、新しいプログラマがよく経験する問題です。コンピューターは、人が期待するように動作するのではなく、指示されたとおりに動作します。

等値比較はすべての項に分散さorれるのではなく、最初の項のみで実行されます。すべての条件で自分で提供する必要があります。

if s == a or s == c or s == e:

Python には、包含チェックに基づいて、このための代替構文もあります (ただし、操作はまったく同じではありません)。

if s in (a, c, e):

この場合、 のオペランドは 2 つしかなくin、タプル要素全体に分散する必要はありません。

于 2013-08-06T07:41:47.477 に答える
0

問題は、s == a or c or e意図したとおりに動作しない式 (およびそのバリエーション) にあります。

次のように評価されます(s == a) or bool(c) or bool(e)ceは常に「真の」値 (空でない文字列) であるため、式orは常に真になります。

いくつかの代替ソリューションがあります。

  1. 現在のバージョンの式で等値テストを配布すると、結果は になりますがs == a or s == c or s == e、それは多くのテキストの繰り返しです。

  2. もう 1 つの方法はin、値がコンテナー内にあるかどうかをテストする演算子を使用することですs in (a, c, e)。入力は少なくなりますが、それでも 3 つのテストを実行します。

  3. より良い解決策では、複数のテストを完全に回避できます。代わりに、大文字と小文字を完全に区別しない単一のテストを作成できますs.lower() == a

3 番目の解決策では、変数cde、またはを計算する必要はありませんf(さらに、"yes"および"no"リテラルをテストに直接配置して、aおよびを削除することもできbます!)。さらにいくつかの入力テキスト (例: "yEs") に一致しますが、これはおそらくバグではなく機能です。

于 2013-08-06T08:02:52.077 に答える