2012-04-20 8 views
2

場合は、私がここにいくつかのコードを持っていないのPythonなしと条件

if not m and n: 
    print "Something happens" 

何も起こりません。

しかし、私は行うことができます。

m, n = 1,2 
if m and n: 
    print "Something happens" 
>>> Something happens 

なぜあるかと同じように処理されない場合は? 「そうでなければ」、「取らない」と言うのか?

はあなたがoperator precedence問題を抱えているあなたに

+0

よりも低い優先順位を持っていない私はそれがに良い習慣であることをどこかで見てきましたアイデンティティを使ってNoneと比較してください。例: 'mがNone、nがNoneでない場合:'。 – Fenikso

答えて

11

ありがとうございます。

if not m and nif (not m) and nと同等です。あなたが望むのはif not m and not nまたはif not (m or n)です。

も参照してください:そのクローゼットのオペランドに適用De Morgan's Laws

+0

ありがとう、本当にシンプル – Neeran

+1

疑問があるときはカッコで囲みます。私は時々、言語があなたが質問があるかもしれないどんな条件でも明示的なグループ分けを使用することを必要とするなら、どれくらいの時間が節約されるのだろうと思っています。あなたは余分な()を入力するのに数秒を費やすでしょうが、このような混乱を避けるためにはじめてあなたを保存します。そして、この愚かな言い回しの中で()のすべてについて、水クーラーの嫌になる時間の2倍の時間を無駄にするでしょう。 –

+0

@BillKあなたは基本的にそれがどのようにlispで動作するかを記述しています。 –

2

not。あなたはif not m and nと書いており、はTrueで、andのため、nFalseと評価されており、したがって文全体はFalseと評価されています。

1

私はあなたがこの記事を探していると思う:Truth Value Testing

任意のオブジェクトがある場合やwhileの条件で使用するために以下のブール演算のオペランドとして、真理値を試験することができます。以下の値は偽と見なされていません:たとえば任意の数値型の

  • ゼロ

    • なし、00L0.00j
    • 例えば、任意の空のシーケンス、''()[]
    • 空のマッピングは、たとえば{}です。ユーザ定義クラスの
    • インスタンス、クラスがそのメソッドがFalse整数ゼロまたはブール値を返し__nonzero__()または__len__()方法を定義している場合。多くの種類のオブジェクトは常に真であるので -

    他のすべての値が真であると見なされています。特に断りのない限り 操作とブール結果を持っている組み込み関数は、常に、真のために偽と1またはTrueため0またはFalseを返します。 (重要な例外:ブーリアン演算またはandと常にオペランドの1つを返します。)

  • 特に次の章では、あなたのケース(Boolean Operations — and, or, notを)説明:

    は非ブール演算子