3

Python では、次のような構成を作成することが有効です。

def a(): 
    return 0

if a: 
    print "Function object was considered True"
else:  
    print "Function object was considered False"

関数ポインターが True に評価されるロジックは何ですか。

この種の構文が言語に挿入されたのはなぜですか?

4

4 に答える 4

13

多くのものTrueが Python で評価されます。ブール演算子に関するドキュメントから:

ブール演算のコンテキストで、また制御フロー ステートメントで式が使用される場合、次の値は false として解釈されます: FalseNone、すべての型の数値ゼロ、および空の文字列とコンテナー (文字列、タプル、リスト、辞書、セットを含む)およびフリーズセット)。他のすべての値は true として解釈されます。

Python の関数は、他の多くのものと同様にオブジェクトであり、空ではありません。したがって、ブール値のコンテキストでは、True と評価されます。

于 2012-10-02T19:59:43.663 に答える
3

「真実性」を評価するためのルールは、 Python ドキュメントのTruth Value Testingの章にあります。

特に注意してください

他のすべての値は true と見なされます。したがって、多くの型のオブジェクトは常に true です。

結論は; 関数オブジェクトは常に true です。

于 2012-10-02T20:00:17.720 に答える
2

Python で False になるオブジェクトのリスト:

  • None
  • []
  • {}
  • empty set
  • empty frozenset
  • False
  • 0
  • 0.0
  • 0L
  • 0j
  • 空のdefaultdict
  • Classesメソッドを実装__nonzero__()し、偽の値を返すもの、それ以外の場合__len__()は呼び出されます。Python 3x__bool__()では__nonzero__().
于 2012-10-02T20:00:06.953 に答える
1

@Magnus Hoff がリンクしている Truth Value Testing で、最も有益なステートメントは次のとおりであることがわかりました。

デフォルトでは、オブジェクトで呼び出されたときにFalse を返す_ bool _() メソッドまたは0 を返す_ len _() メソッドがそのクラスで定義されていない限り、オブジェクトは true と見なされます。

私は自分のクラスを定義しようとしましたが、_ bool _() が _ len _() よりも優先されるようです。これは理にかなっています:

class Falsish(object):
    def __init__(self):
        self.val = "False, even though len(self) > 0"
    def __bool__(self):
        return False
    def __len__(self):
        return 2

class StillFalsish(object):
    def __init__(self):
        self.val = "False, even though len(self) > 0"
    def __len__(self):
        return 2
    def __bool__(self):
        return False

class Truish(object):
    def __init__(self):
        self.val = "True, even though len(self) = 0"
    def __bool__(self):
        return True
    def __len__(self):
        return 0

class StillTruish(object):
    def __init__(self):
        self.val = "True, even though len(self) = 0"
    def __len__(self):
        return 0
    def __bool__(self):
        return True

class NowFalsish(object):
    def __init__(self):
        self.val = "False, with no __bool__(), since len(self) = 0"
    def __len__(self):
        return 0

class NowTruish(object):
    def __init__(self):
        self.val = "True, with no __bool__(), since len(self) > 0"
    def __len__(self):
        return 2

class EvenThisIsTruish(object):
    pass


mybool1 = Falsish()
mybool2 = StillFalsish()
mybool3 = Truish()
mybool4 = StillTruish()
mybool5 = NowFalsish()
mybool6 = NowTruish()
mybool7 = EvenThisIsTruish()
if mybool1: print("mybool1 is true")
if mybool2: print("mybool2 is true")
if mybool3: print("mybool3 is true")
if mybool4: print("mybool4 is true")
if mybool5: print("mybool5 is true")
if mybool6: print("mybool6 is true")
if mybool7: print("mybool7 is true")

上記のコードの出力は次のとおりです。

mybool3 is true
mybool4 is true
mybool6 is true
mybool7 is true
于 2020-05-21T14:17:34.137 に答える