真実と偽りとは何ですか?真と偽とどう違うのですか?


118

私は通常とは異なるPythonのTruthyFalsyの値があることを知っただけですか?TrueFalse

誰かが真実偽りの価値とは何かを詳細に説明できますか?

どこで使用すればよいですか?

真実True値とFalse値の違いは何ですか?


20
bool(value)結果がであればTrue、それvalue真実です。
wnnmaw 2016年

4
あなたはそれらの言葉を自分で発明したのではないでしょうか?とにかく、見る__nonzero____bool__
zvone

6
Truthy / Falsy値は、なんらかのバイナリテストが必要な場合に便利です。それはより単純なコードを可能にし、単純なコードは多くの場合、バグの可能性が少なく、読みやすくなります。
Mark Ransom

4
@zvoneプログラミング言語にブール値がない場合、Truthy and falsyはコードゴルフで一般的に使用されます。
MilkyWay90 2018

6
@zvone: 'Truthy'と 'falsy'は、プログラミング言語を比較する際に広く使用されています(例:PHPとPERLとPythonとJS)。(絶対にコードゴルフだけではありません)。
smci

回答:


77

コメントで説明されているように、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])は「真実」と見なされます。

ドキュメントのこのセクションも参照してください。


または、my_listがtrueかどうかを意味しますか?

これらのことをPythonシェルで試して、自分の目で確かめることをお勧めします。;)if my_list「my_listが空でない場合」をif not my_list意味し、「my_listが空の場合」を意味します。
B.エクルズ2016年

1
わかりました。最後に少し混乱しました。if a:このタイプの条件が何を意味するかなど、多くの場所を見てきました。これは、aがtrueの場合、またはaがfalseの場合の意味ですか?それともaが真実か、それともaが偽物か?

1
それは「もしもが真なら」を意味します。私の回答で説明したように、また他の人がコメントや他の回答で説明したように、さまざまなことが真または偽と見なされていますが、実際にはそうではありません。たとえば、空のリストはFalseと見なされます。それif []:が実行されない理由です。
B.エクルズ2016年

つまり、a:がtrueかどうか(aが整数または文字列の場合)を意味し、a:がfalseを意味するかどうかは、aが空のリストまたは空のdictまたはfalse値の場合です!

199

次の「偽」を除いて、すべての値は「真実」と見なされます。

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - 空っぽ list
  • {} - 空っぽ dict
  • () - 空っぽ tuple
  • '' - 空っぽ str
  • b'' - 空っぽ bytes
  • set() - 空っぽ set
  • 空のrangeようなrange(0)
  • オブジェクト
    • obj.__bool__() 戻り値 False
    • obj.__len__() 戻り値 0

「真実の」値は、ifor whileステートメントによって実行されるチェックを満たします。「真実」と「虚偽」を使用して、boolTrueとを区別しますFalse

真理値テスト


5
素晴らしいリスト、ありがとう。完全に学術的な質問ですが、実行順序が何であるか知っていますか?boolがTrueを返し、lenが0を返す(またはその逆)オブジェクトを作成できると考えていました。
Hayden Crocker 2017年

16
@HaydenCrocker __bool__最初に探し、次に__len__。どちらも定義されていない場合、すべてのインスタンスが「true」と見なされます。これについては、object.__bool__メソッドのドキュメントで説明されています
Patrick Haugh、2017年

3
3.5より前のバージョンのPythonでは、真夜中のUTCを表す時間オブジェクトはFalseと見なされていました。この記事では、問題のバグレポートの概要と最終的な解決策について説明します。
Jason V.

1
興味深いことに、datetimeパッケージの場合、datetime.minは真実であり、timedelta(0)は誤りです。
デビッドキングホーン

1
@DavidKinghornそれは意味がありますよね?最小の日時値は、他の日付と同様に単なる日付であり、決してゼロではありません。対照的に、timedelta(0)ゼロのようなものです。これは、真夜中を表す時間値が不正であることが発見されたときに持ち上がりました。これは最終的に修正されました。lwn.net
Patrick Haugh

5

真実の値は、ブール値のコンテキストで使用されるオブジェクトを参照し、trueまたはfalseを返すブール値ではありません。以下に例を示します。

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True

4

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に堪能、明確、簡潔、効果的なプログラミング」


2

TruthyまたはFalsyの値をどこで使用するべきですか?これらはシンタックスシュガーなので、常に回避できますが、使用するとコードが読みやすくなり、効率が上がります。さらに、Pythonであるかどうかにかかわらず、多くのコード例でそれらを見つけることができます。

他の回答で述べたように、それらをifテストやwhileループで使用できます。ここで組み合わせるデフォルト値でパイソン3における2つの他の例はors文字列変数です。同様の状況にも拡張されます。

真実なし

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"

それでも、このコーディングスタイルに慣れている場合は、このコーディングスタイルを順守できます。


-1
while 0:
    print("Inside the loop.", counter)
    counter -= 1
print("Outside the loop.", counter)

このループを実行すると、while 0:= while false:

0は偽物と見なされます


-2

Falsyは、空の値またはNoneを持つすべてのデータ型として、空のリスト、タプルのような空の何かを意味します。真実の意味:真実を除いて

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.