2016-06-21 7 views
0

Python3のチュートリアルでは、「比較や他のブール式の結果を変数に代入することは可能です」と記載されています。指定された例は次のとおりです。Python: 'or'演算子を使って文字列を比較する

>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance' 
>>> non_null = string1 or string2 or string3 
>>> non_null 
'Trondheim' 

文字列を比較するとき、正確に "or"演算子は何をしますか?なぜトロンヘイムは選ばれたのですか?

+0

もしも、string1 == Trueならばnon_null = string1 else string2 == trueならばnon_null = string2 else string3 == True then non_null = string3 Pythonでは空でない文字列が真であるので、string2で止まります。 – bi0phaz3

+0

@ bi0phaz3: "string" == Trueはfalseです。あなたはbool(string1)== Trueを意味します。 – RemcoGerlich

+0

Pythonは暗黙のうちにキャストできます。 – bi0phaz3

答えて

1

、空の文字列がFalseを返し、非空の文字列はTrueを返します。

Pythonは短絡をサポートしているので、式a or bでは、aがTrueの場合、bは評価されません。

例では、'' or 'Trondheim' or 'Hammer Dance'です。

この式は左から右に評価されるため、最初に評価されるのは'' or 'Trondheim'、つまりFalse or Trueです。これはTrueを返します。次に、Pythonは'Trondheim' or 'Hammer Dance'を評価しようとし、次にTrue or 'Hammer Dance'になります。前述の短絡のために、左のオブジェクトがTrueであるため、'Hammer Dance'Trueに評価されないため、'Trondheim'が返されます。 non_nullの割り当てで

1

orは、true-ishの場合は値を、そうでない場合は右側の値を返します。

文字列の場合、""(空文字列)のみがtrue-ishでなく、その他の文字はすべてです。

ので

>>> "" or "Test" 
"Test" 

>>> "One" or "Two" 
"One" 

これは、すべての比較を行いません。

+0

ああ、そうです。ショートサーキット?今私は少しばかげて感じる – uncreative

+0

ええ、それは短絡。 – RemcoGerlich

2

インクルーシブorは、この場合、文字列リテラルとしてはstripのチェックのこのタイプを実行するときに時々好ましい'Trondheim'

>>> bool('') 
False 
>>> bool('Trondheim') 
True 

ある(左から右にチェック)最初の非falsy文字列を選択します空白を選択しない場合は空白も真実です。ブール値として処理すると

>>> bool(' ') 
True 
1

は、or比較はこれに変換され、順番に評価されます。

if string1: 
    non_null = string1 
elif string2: 
    non_null = string2 
elif string3: 
    non_null = string3 
else: 
    non_null = False 

しかし、あなたの例では、string1Falseとして評価され、空の文字列で、あなたは確認することができます(プロンプトにif not '':print("Empty")と入力します)。

string2は空ではないため、Trueと評価され、non_nullに割り当てられます。