pythonのandとor演算ロジック--短絡ロジック

19485 ワード

テキストリンク
原文リンクが無効になるのを防ぐためにコピーしました.
pythonにおけるandとor演算の核心思想--短絡論理
1.論理演算子を含む
まず基本的な概念から着手して、pythonの中でどれらのオブジェクトがFalseと見なされますか?どれがTrueなのか.
Pythonでは、None、任意の数値タイプの0、空の文字列""空のメタグループ()、空のリスト[]、空の辞書{}がFalseとして扱われ、カスタムタイプが実装されている場合は_nonzero __ ()または_len __ ()メソッドでメソッドが0またはFalseを返すと、そのインスタンスもFalseとみなされ、他のオブジェクトはTrueとなります.
以下は最も簡単な論理演算です.
    True  and True    ==> True                  True  or True    ==> True
    True  and False   ==> False                 True  or False   ==> True
    False and True    ==> False                 False or True    ==> True
    False and False   ==> False                 False or False   ==> False

上記の2つの例を挙げることができます.
example 1
    >>> a = [0, 1, '' ,3]
    >>> a[0] and a[1]
    0

a[0]=0,a[1]=1なのでa[0]and a[1]は0 and 1(False and True)となるので0(False)となる.
example 2
    >>> a = [0, 1, '' ,3]
    >>> a[2] and a[1]
    ''

両方ともFalseで、左の値を返します.
2.2つ以上の論理演算子を含む
論理演算子and/orが1つ以上あると,その演算規則の核心思想は短絡論理である.では、短絡思想(本人がまとめたもので、ネット上の他の人との出入りがあるかもしれませんが、ゆっくり分析してください):
式は左から右に演算され、orの左側の論理値がTrueの場合、orを短絡した後のすべての式(andであれorであれ)は、orの左側の式を直接出力します.
式は左から右に演算され、andの左側の論理値がFalseである場合、orが現れるまで、その後のすべてのand式を短絡し、and左側の式をorの左側に出力し、次の論理演算に関与する.
orの左側がFalse、またはandの左側がTrueであればショートロジックは使用できません.
抽象的かもしれませんが、大丈夫です.次に例を挙げます.
pythonがこれらの論理文を処理する際の短絡状況を直感的に理解する巧みな方法があります(私も他の人に学んだのです)
では、簡単なことから始めましょう.すべてand文かor文だと仮定します.
example 1
    1>  def a():
    2>      print 'A'
    3>      return []
    4>  def b():
    5>      print 'B'
    6>      return []
    7>  def c():
    8>      print 'C'
    9>      return 1
    10> def d():
    11>     print 'D'
    12>     return []
    13> def e():
    14>     print 'E'
    15>     return 1
    16>
    17> if a() and b() and c() and d() and e():
    18>     print 'ok'
    
    #      
    A
    

a()は偽であり,その後はand文であり,すべて短絡し,最終的にはa()の式のみを返す.短絡された式はすべて出力されないことを覚えておいてください.したがって、ここではAのみが印刷される.
example 2
    1>  def a():
    2>      print 'A'
    3>      return 1
    4>  def b():
    5>      print 'B'
    6>      return 1
    7>  def c():
    8>      print 'C'
    9>      return []
    10> def d():
    11>     print 'D'
    12>     return []
    13> def e():
    14>     print 'E'
    15>     return 1
    16>
    17> if a() and b() and c() and d() and e():
    18>     print 'ok'

    #      
    A
    B
    C

pythonは左から右へa()を実行し、a()が返す論理値はTrue、後はand文なので短絡できない後はb()と論理演算を続け、a()and b()はb()の論理値Trueを出力し、次にc()と論理演算を行い、b()and c()はc()の論理値Falseを出力し、その後はand文であれば全て短絡し、最終的にはA B Cしか印刷されませんでした.
example 3
    1>  def a():
    2>      print 'A'
    3>      return 1
    4>  def b():
    5>      print 'B'
    6>      return []
    7>  def c():
    8>      print 'C'
    9>      return 1
    10> def d():
    11>     print 'D'
    12>     return []
    13> def e():
    14>     print 'E'
    15>     return 1
    16>
    17> if a() or b() or c() or d() or e():
    18>     print 'ok'

    #      
    A
    ok

a()の論理値はTrueで、その後はor文で、すべて短絡し、最終的にはAのみ印刷され、if文はTrueなのでokも印刷されます.
example 4
    1>  def a():
    2>      print 'A'
    3>      return []
    4>  def b():
    5>      print 'B'
    6>      return []
    7>  def c():
    8>      print 'C'
    9>      return 1
    10> def d():
    11>     print 'D'
    12>     return []
    13> def e():
    14>     print 'E'
    15>     return 1
    16>
    17> if a() or b() or c() or d() or e():
    18>     print 'ok'

    #      
    A
    B
    C
    ok

pythonは、左から右にa()を実行し、a()が返す論理値はFalse、後にor文となるので短絡できず、その後b()と論理演算を継続し、a()or b()はb()の論理値Falseを出力し、次にc()と論理演算を行い、b()or c()はc()の論理値Trueを出力し、その後or文であれば全て短絡し、最終的にはA B C OKのみ印刷されました.
次に、andとor文が同時に存在する場合について説明します.
example 5
    1>  def a():
    2>      print 'A'
    3>      return []
    4>  def b():
    5>      print 'B'
    6>      return []
    7>  def c():
    8>      print 'C'
    9>      return 1
    10> def d():
    11>     print 'D'
    12>     return []
    13> def e():
    14>     print 'E'
    15>     return 1
    16> def f():
    17>     print 'F'
    18>     return 1
    19> def g():
    20>     print 'G'
    21>     return []
    22> def h():
    23>     print 'H'
    24>     return 1
    25>
    26> if a() and b() and  c() and d() or e() and f() or g() and h():
    27>     print 'ok'

    #      :
    A
    E
    F
    ok

文が長いと難しいと思わないで、よく分析してみましょう.左から右へ、まずa()の論理値はFalseで、その後or文まで3つのand文があります.a()and b()and c()and d()は、いずれも短絡されています.a()のみ出力し、a()or e()がTrue、出力e()を得、e()and F()がTrue、出力f()を得、その後or文を接続すると、その後すべて短絡する.最終的にはA E F OKのみ印刷されました.△私がまとめた短絡論理の3点をよく理解すれば、大丈夫だと思います.
3.三元演算オペレータ
python 2.5以前、pythonには3元オペレータはありませんでした.Guido Van Rossumはpythonをより簡潔にすることはできないと思っていましたが、c、c++とjavaのプログラミングに慣れたプログラマーはandまたはorで3元オペレータをシミュレートしようとしました.これはpythonの短絡論理集を利用しています.
三元演算オペレータbool?a:b、boolが真であればa、そうでなければb.
python言語に変換:
        bool and a or b
どのように理解しますか?まずa,bはすべて真であり,これはデフォルトである.boolが真であればbool and aが真であり、出力a、短絡bである.boolが偽の場合、短絡a、直接bool or b、出力b.
もっと簡単な書き方に変えてください.
        return a if bool else b
参考資料(ここで感謝!):
[python]閏年に発生したandとorの優先度を計算する問題と短絡論理
pythonのショートエフェクト
Pythonでand,orの計算ルールはどうなっていますか?
python and or
詳細Python(3):and、orおよびand-or
python短絡論理と条件式