私は通常とは異なるPythonのTruthyとFalsyの値があることを知っただけですか?TrueFalse
誰かが真実で偽りの価値とは何かを詳細に説明できますか?
どこで使用すればよいですか?
真実とTrue値と偽とFalse値の違いは何ですか?
__nonzero__と__bool__
私は通常とは異なるPythonのTruthyとFalsyの値があることを知っただけですか?TrueFalse
誰かが真実で偽りの価値とは何かを詳細に説明できますか?
どこで使用すればよいですか?
真実とTrue値と偽とFalse値の違いは何ですか?
__nonzero__と__bool__
回答:
コメントで説明されているように、TrueまたはFalseに評価される値を参照しています。
たとえば、次のようにチェックする代わりに、リストが空でないかどうかを確認します。
if len(my_list) != 0:
print("Not empty!")
あなたは単にこれを行うことができます:
if my_list:
print("Not empty!")
これは、空のリストなどの一部の値は、ブール値に対して評価されるときにFalseと見なされるためです。空でないリストはTrueです。
同様に、整数0の場合、空の文字列 ""など(Falseの場合)、ゼロ以外の整数、空でない文字列の場合、Trueの場合。
「truthy」や「falsy」などの用語の概念は、上記のような場合にTrueと見なされる値とFalseと見なされる値を単に指します。
たとえば、空のリスト([])は「偽」と見なされ、空でないリスト(たとえば[1])は「真実」と見なされます。
ドキュメントのこのセクションも参照してください。
if my_list「my_listが空でない場合」をif not my_list意味し、「my_listが空の場合」を意味します。
if a:このタイプの条件が何を意味するかなど、多くの場所を見てきました。これは、aがtrueの場合、またはaがfalseの場合の意味ですか?それともaが真実か、それともaが偽物か?
if []:が実行されない理由です。
次の「偽」を除いて、すべての値は「真実」と見なされます。
NoneFalse00.00jDecimal(0)Fraction(0, 1)[] - 空っぽ list{} - 空っぽ dict() - 空っぽ tuple'' - 空っぽ strb'' - 空っぽ bytesset() - 空っぽ setrangeようなrange(0)obj.__bool__() 戻り値 Falseobj.__len__() 戻り値 0 「真実の」値は、ifor whileステートメントによって実行されるチェックを満たします。「真実」と「虚偽」を使用して、bool値Trueとを区別しますFalse。
__bool__最初に探し、次に__len__。どちらも定義されていない場合、すべてのインスタンスが「true」と見なされます。これについては、object.__bool__メソッドのドキュメントで説明されています
timedelta(0)ゼロのようなものです。これは、真夜中を表す時間値が不正であることが発見されたときに持ち上がりました。これは最終的に修正されました。lwn.net
Pythonは、やのような式bool()で返される、TrueまたはFalse使用される型に適用することによって、真実性を判断します。ifwhile
以下はカスタムクラスの例で、大きさ(ベクトルの長さ)が0 Vector2dの場合にインスタンスが返されFalseますTrue。それ以外の場合はです。
import math
class Vector2d(object):
def __init__(self, x, y):
self.x = float(x)
self.y = float(y)
def __abs__(self):
return math.hypot(self.x, self.y)
def __bool__(self):
return bool(abs(self))
a = Vector2d(0,0)
print(bool(a)) #False
b = Vector2d(10,0)
print(bool(b)) #True
注:__bool__ユーザー定義クラスのインスタンスはデフォルトで真と見なされるため、定義しなかった場合は常にTrueを返します。
本の例:「Pythonに堪能、明確、簡潔、効果的なプログラミング」
TruthyまたはFalsyの値をどこで使用するべきですか?これらはシンタックスシュガーなので、常に回避できますが、使用するとコードが読みやすくなり、効率が上がります。さらに、Pythonであるかどうかにかかわらず、多くのコード例でそれらを見つけることができます。
他の回答で述べたように、それらをifテストやwhileループで使用できます。ここで組み合わせるデフォルト値でパイソン3における2つの他の例はor、s文字列変数です。同様の状況にも拡張されます。
真実なし
if len(s) > 0:
print(s)
else:
print('Default value')
真実でそれはより簡潔です:
print(s or 'Default value')
Python 3.8では、割り当て式を利用できます :=
真実なし
if len(s) == 0:
s = 'Default value'
do_something(s)
真実でそれも短いです
s or (s := 'Default value')
do_something(s)
またはさらに短く、
do_something(s or (s := 'Default value'))
代入式がなければ、
s = s or 'Default value'
do_something(s)
しかし、短くはありません。一部の人々はs =...それに対応するためにラインを満足できないと思います
if len(s)>0:
s = s # HERE is an extra useless assignment
else:
s = "Default value"
それでも、このコーディングスタイルに慣れている場合は、このコーディングスタイルを順守できます。
bool(value)結果がであればTrue、それvalueは真実です。