web-dev-qa-db-ja.com

Python文字列で「and」および「or」演算子を使用する

行の意味がわかりません:

parameter and (" " + parameter) or ""

パラメータは文字列です

なぜand演算子とor演算子を、一般にpython文字列で使用したいのでしょうか?

24
user1264304

parameterの値を使用しているが、値がNoneである場合、Noneの代わりに空の文字列""を使用したいとします。一般的に何をしますか?

if parameter:
    # use parameter (well your expression using `" " + parameter` in this case
else:
    # use ""

これがその表現がしていることです。最初に、andおよびor演算子の機能を理解する必要があります。

  • a and bは、aがbの場合にTrueを返し、そうでない場合はaを返します。
  • a or bは、aがaの場合にTrueを返し、そうでない場合はbを返します。

だから、あなたの表現:

parameter and (" " + parameter) or ""

これは実質的に次と同等です。

(parameter and (" " + parameter)) or  ""
#    A1               A2               B
#           A                     or   B

次の場合に式が評価される方法:

  • parameter - A1Trueに評価されます:

    result = (True and " " + parameter) or ""
    
    result = (" " + parameter) or ""
    
    result = " " + parameter
    
  • parameter - A1None

    result = (None and " " + parameter) or ""
    
    result = None or ""
    
    result = ""
    

一般的な提案として、条件式にA if C else B形式の式を使用する方がより読みやすくなります。したがって、次を使用する必要があります。

" " + parameter if parameter else ""

指定された式の代わりに。 if-else式の背後にある動機については、 PEP 308-条件式 を参照してください。

26
Rohit Jain

Pythonは、空の文字列はブール値が「false」であり、空でない文字列はブール値が「true」であると見なします。

したがって、式の結果は2つしかありません。つまり、空の文字列と空でない文字列の結果です。

2番目に注意することは、「or」および「and」演算子のどの値が返されるかです。 Pythonはtrueまたはfalseの値を返すだけでなく、文字列および/または演算子に対して文字列の1つを返します(trueまたはfalseの値があると考えてください)。Python遅延アプローチを使用します:

「and」演算子の場合、左の値がtrueであれば、右の値がチェックされて返されます。左の値がfalseの場合、返されます

「または」演算子の場合、最初の値がtrueの場合、それが返されます。それ以外の場合、2番目の値がfalseの場合、2番目の値が返されます

parameter = 'test'
print( parameter and (" " + parameter) or "" )

出力:テスト

parameter = ''
print( parameter and (" " + parameter) or "" )

出力:(空の文字列)

6

Pythonの空の文字列は、空のリストと同じように、Falseブール値と同等です。表示した行はPython =三項演算子のバージョン(以下のコメントに記載されているように、最近ではPython 現在は実際の三項演算子があります )として廃止されています。ルール:

  • にとって a and baFalseの場合、bは評価されません
  • にとって a or baTrueの場合、bは評価されません
  • 論理句の値は、最後に評価された式の値です

parameterTrueと評価される場合、and句の2番目の部分が評価されます:(" " + parameter)。したがって、空の文字列でない場合は、parameterの先頭にスペースを追加します。 or句の2番目の部分は評価されません。式全体がTrueTrueまたは何かが常にTrueであることがすでにわかるためです。 )。

parameterFalse(このコンテキストでは空の文字列)の場合、and句の2番目の部分は評価されません。既にFalseFalseおよび何でも常にFalse)。したがって、or句の2番目の部分が評価され、空の文字列が返されます。

より詳細な方法で記述できます。

if parameter:
    return " " + parameter
else:
    return ""
4
BartoszKP

このTTLを考慮してください。次に、さまざまなシナリオをプラグインして、何が起こるかを確認します:)

andorそれらを「成功」または「失敗」にした最初の値を評価であり、これはTrueまたはFalseである必要はありません。

a    b    a or b   a and b
--   --   ------   ------- 
T    T    a (T)    b (T)
T    F    a (T)    b (F)
F    T    b (T)    a (F)
F    F    b (F)    a (F)

TおよびFは、「Truth-y」および「False-y」の値を表します。この式チェーンworks演算子はTrueまたはFalseを返す必要がないため、aまたはbの値になります。

2
user2246674

parameterに値があるかどうかを確認します。存在する場合は、スペースを追加します。そうでない場合は、空の文字列を返します。

$ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = 'bar'
>>> foo and (" " + foo) or ""
' bar'
2
Cfreak

すべての良い答えで、これらの声明は私がこれをよりよく覚えて、私の脳がどのように機能するかに合うのに役立つことを発見しました(そして願わくばそこにもっともっとあるために)

  • 「and」は、最初のFalseアイテム(None、「」、[]、()、{}、0)を返すか、ない場合は最後のアイテム(Falseが見つからないなど)を返します。

  • 「または」は、最初のTrueアイテムまたは最後のアイテムを返します(Trueが見つからないなど)

要約すると、それらはすべて、ステートメントの結果を決定する最初の項目を返します。 (最悪の場合、シーケンスの最後の項目)

このルールは、連鎖するすべての「and」またはすべての「or」ステートメントにも適用されることに注意してください。

0
Zhenhua