2

私は次のコードを書きました。渡された数値が1、0、または2の文字列表現である場合はyesを出力し、それ以外の場合はfalseを出力するだけです。

number=raw_input()
if number is "1" or "0" or "2":
    print "Yes"
else:
     print "no"

目的のロジックを機能させる方法は知っていますが、raw_inputに渡す任意の数値に対してyesが出力される理由を知りたいだけです。答えをできるだけ詳しく説明したいのですが、なぜ失敗するのか理解できないので、私には十分にpythonicのようです。

4

3 に答える 3

4

問題は、Pythonに対するコードが次のように読み取られることです。

if (number is "1") or "0" or "2":

また、空でない文字列はに評価されるためTrue、常に。になりTrueます。

やりたいことをするための良い構文は次のとおりです。

if number in {"1", "0", "2"}:

ここでのセットの使用に注意してください-この場合(3つの値のみ)はそれほど重要ではありませんが、セットのメンバーシップテストはOではなくO(1)であるため、セットに対するチェックはリストよりも高速です(n)。

これは、これを書くのがより良くて簡単です:

if number == "1" or number == "0" or number == "2":

それはあなたが望んでいたものです。

値を比較するときは、常に使用し==ないisisください。これはIDチェックです(2つの値は同じオブジェクトです)。通常、またはisのようなものに使用する必要があります。is Trueis None

これを数値として処理したい場合は、次のようにすることができます。

try:
   value = int(number)
except ValueError:
   value = None
if value is not None and 0 <= value <= 2:
    ...

これは、広範囲の数値と比較したい状況でより役立つ可能性があります。Pythonの便利な比較チェーン(0 <= value <= 2ではなく0 <= value and value <= 2)を使用していることに注意してください。

于 2012-05-05T10:32:55.950 に答える
3

正しい構文は次のとおりです。

if number == "1" or number == "0" or number == "2":
    print "Yes"

またはよりPythonic:

if number in ["1", "2", "3"]:
    print "Yes"

intまたは、キャストして試すことができます:

if int(number) in range(1,4):
    print "Yes"

コードが常に評価される理由は、およびTrueの真理を評価しているためです。これは、Pythonではステートメントとして真です。"0""2"

于 2012-05-05T10:35:13.167 に答える
0

なぜなら、の間のすべての式orはブール式として評価されるからです。

if TrueTrueにif 1:評価され、 Trueに評価され、Trueにif "0":評価されます。

したがって、あなたが書いたものは、多かれ少なかれ次のものと同等です。

if number is "1":
    print "Yes"
elif "0":
    print "Yes"
elif "2":
    print "Yes"
else:
     print "no"

あなたは書くべきだったif number is "1" or number is "0" or number "2":、あるいはもっとpythonic:if number in ("1", "0", "2"):

于 2012-05-05T10:33:31.550 に答える