1. 程式人生 > >Python物件真值判定邏輯粗解與簡明例子

Python物件真值判定邏輯粗解與簡明例子

Python的真值判定

python3.7
Shawn
文件:
https://docs.python.org/3.7/library/stdtypes.html#truth-value-testing


  • python中有很多時候可以直接將物件用在if和while中.
  • 但是在功能上,這些位置是需要通過Boolean來進行判斷的.
  • 這就牽扯到Python對於True和False的設計概念.
  • 在預設狀態下,python會認定你的物件恆為真直到物件的__bool__()方法返回false或者物件的__len__()返回0.
  • 包括但不限於以下狀況:
    • None與False
    • 任何數學形式的0:0,0.0,0j,Decimal(0),Fraction(0,1)
    • 空佇列/集合:’’,(),[],{},set(),range(0)

  • 以下案例說明了:
    • 1.無__len__()與__bool__()狀態下,python將物件恆判斷為真.
    • 2,3.在有__len__()或__bool__()狀態下,python根據其返回結果來判斷真偽.
    • 4.1,4.2:在__len__()與__bool__()同時存在時,python只會承認__bool__()的結果,無視__len__()的結果.
# 1.在無__len__()與__bool__()狀態下:

class test:
    def __init__(self,n):
        self.lis = []
        for i in range(n):
            self.lis.append(i)

    def print(self):
        try:
            print(self.lis.pop())
        except:
            print("empty list")

=================== RESTART: F:\PyWorkspace\booleanTest.py ===================
>>> t = test(9)
>>> while t:
	t.print()

	
8
7
6
5
4
3
2
1
0
empty list
empty list
empty list
empty list
...




# 2.在定義了__len__()的狀態下:

class test:
    def __init__(self,n):
        self.lis = []
        for i in range(n):
            self.lis.append(i)

    def print(self):
        try:
            print(self.lis.pop())
        except:
            print("empty list")

    def __len__(self):
        return len(self.lis)
        
=================== RESTART: F:\PyWorkspace\booleanTest.py ===================
>>> t = test(10)
>>> while t:
	t.print()

	
9
8
7
6
5
4
3
2
1
0
>>> 

# 3.在定義了__bool__()的狀態下:

class test:
    def __init__(self,n):
        self.flag = False
        self.lis = []
        for i in range(n):
            self.lis.append(i)
            self.flag = True

    def print(self):
        try:
            print(self.lis.pop())
        except:
            print("empty list")
            self.flag = False

    def __bool__(self):
        return self.flag


=================== RESTART: F:\PyWorkspace\booleanTest.py ===================
>>> t = test(5)
>>> while t:
	t.print()

	
4
3
2
1
0
empty list
>>> 

# 4.1在同時定義了__len__()與__bool__()的狀態下:

class test:
    def __init__(self,n):
        self.flag = False
        self.lis = []
        for i in range(n):
            self.lis.append(i)
            self.flag = True

    def print(self):
        try:
            print(self.lis.pop())
        except:
            print("empty list")
            self.flag = False

    def __bool__(self):
        return self.flag

    def __len__(self):
        return len(self.lis)

=================== RESTART: F:\PyWorkspace\booleanTest.py ===================
>>> t = test(4)
>>> while t:
	t.print()

	
3
2
1
0
empty list
>>> 

# 4.2在同時定義了__len__()與__bool__()的狀態下:

class test:
    def __init__(self,n):
        self.flag = False
        self.lis = []
        for i in range(n):
            self.lis.append(i)
            self.flag = True

    def print(self):
        try:
            print(self.lis.pop())
        except:
            print("empty list")
            self.flag = False

    def __bool__(self):
        return True

    def __len__(self):
        return len(self.lis)

=================== RESTART: F:\PyWorkspace\booleanTest.py ===================
>>> t = test(4)
>>> while t:
	t.print()

	
3
2
1
0
empty list
empty list
empty list
empty list
empty list
empty list
empty list
...