行の意味がわかりません:
parameter and (" " + parameter) or ""
パラメータは文字列です
なぜand
演算子とor
演算子を、一般にpython文字列で使用したいのでしょうか?
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 - A1
はTrue
に評価されます:
result = (True and " " + parameter) or ""
result = (" " + parameter) or ""
result = " " + parameter
parameter - A1
はNone
:
result = (None and " " + parameter) or ""
result = None or ""
result = ""
一般的な提案として、条件式にA if C else B
形式の式を使用する方がより読みやすくなります。したがって、次を使用する必要があります。
" " + parameter if parameter else ""
指定された式の代わりに。 if-else
式の背後にある動機については、 PEP 308-条件式 を参照してください。
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 "" )
出力:(空の文字列)
Pythonの空の文字列は、空のリストと同じように、False
ブール値と同等です。表示した行はPython =三項演算子のバージョン(以下のコメントに記載されているように、最近ではPython 現在は実際の三項演算子があります )として廃止されています。ルール:
a and b
a
がFalse
の場合、b
は評価されませんa or b
a
がTrue
の場合、b
は評価されませんparameter
がTrue
と評価される場合、and
句の2番目の部分が評価されます:(" " + parameter)
。したがって、空の文字列でない場合は、parameter
の先頭にスペースを追加します。 or
句の2番目の部分は評価されません。式全体がTrue
(True
または何かが常にTrue
であることがすでにわかるためです。 )。
parameter
がFalse
(このコンテキストでは空の文字列)の場合、and
句の2番目の部分は評価されません。既にFalse
(False
および何でも常にFalse
)。したがって、or
句の2番目の部分が評価され、空の文字列が返されます。
より詳細な方法で記述できます。
if parameter:
return " " + parameter
else:
return ""
このTTLを考慮してください。次に、さまざまなシナリオをプラグインして、何が起こるかを確認します:)
and
とor
それらを「成功」または「失敗」にした最初の値を評価であり、これは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
の値になります。
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'
すべての良い答えで、これらの声明は私がこれをよりよく覚えて、私の脳がどのように機能するかに合うのに役立つことを発見しました(そして願わくばそこにもっともっとあるために)
「and」は、最初のFalseアイテム(None、「」、[]、()、{}、0)を返すか、ない場合は最後のアイテム(Falseが見つからないなど)を返します。
「または」は、最初のTrueアイテムまたは最後のアイテムを返します(Trueが見つからないなど)
要約すると、それらはすべて、ステートメントの結果を決定する最初の項目を返します。 (最悪の場合、シーケンスの最後の項目)
このルールは、連鎖するすべての「and」またはすべての「or」ステートメントにも適用されることに注意してください。