Python all()函數是Python的內置函數之一。
Python all()函數的作用是判斷給定的可迭代對象的所有元素是否都為真(或者可迭代對象是否為空),如果是則all()函數返回True,否則返回False。
在前面的文章中關于Python中bool值進行介紹過:在Python中,任何值為0的數字類型、空的字符串、空的列表、空的元組、空的集合等都為False,值為None或False的對象也是False,其它情況都為True.
該函數與any()函數具有相似性,讀者可以了解一下any()函數的使用方法。
但該函數對于空的可迭代對象將返回True。
all(iterable)
iterable:用于判斷所有元素是否都為真的可迭代對象。
該函數的返回值是邏輯值True或False.
如果可迭代對象中的所有元素為真或可迭代對象為空則返回True,否則返回False。
該函數等價于下面的函數定義:
def all(iterable):
for item in iterable:
if not item:
return False
return True
lst = [] #空列表
print(all(lst))
t = () #空元組
print(all(t))
d = {} #空字典
print(all(d))
s = set() #空集合
print(all(s))
st = '' #空字符串
print(all(st))
輸出結果:
True
True
True
True
True
從上面輸出結果可以看出,all()函數對于空的可迭代對象返回True.
lst1 = [0, 1, 2, 3]
print(all(lst1))
lst2 = [1,2,3,4]
print(all(lst2))
lst3 = ['','b','i','y','e','5','u']
print(all(lst3))
print(all(lst3[1:])) #排除第一個元素
lst4 = ["Python","R","SPSS",None]
print(all(lst4))
print(all(lst4[:-1])) #排除最后一個元素
輸出結果:
False
True
False
True
False
True
從上面的輸出結果可以看出,對于包含空字符串、0、None的可迭代對象,all()函數返回False,否則返回True.
lst5 = [[],1,2,3]
lst6 = [(),1,2,3]
lst7 = [[1,2,None],1,2]
lst8 =[[],[]]
print(f"{all(lst5)},{all(lst6)},{all(lst7)},{all(lst8)}")
輸出結果:
False,False,True,False
從上面的例子可以看出,列表中有空的列表,元組的,all()函數返回False,可迭代對象中的子列表中的元素不全是False,且可迭代對象的其它元素不為False時,all()函數返回True.
在講解bool()函數的用法時說過,在Python3.x中,用戶自定義對象中如果定義了__bool__()函數,則對象的真假由__bool__()函數決定,如果沒定義__bool__()函數,則如果對象中定義了__len__()函數,則對象的真假由__len__()函數決定。對于長度非0的對象返回True,否則返回False.
如果自定義對象中既沒有定義__boo__()函數,也沒有定義__len__()函數,all()函數返回True.
(1)定義了__bool__()和__len__()函數
class Student:
name = ""
def __init__(self, name):
self.name = name
def __bool__(self):
print(self.name,"調用__bool__()")
return bool(self.name)
def __len__(self):
print("調用__len__()")
return len(self.name)
lst_objs1 = [Student("Wang"),Student("Li")]
print(all(lst_objs1))
lst_objs2 = [Student(""),Student("Liu")]
print(all(lst_objs2))
輸出結果:
Wang 調用__bool__()
Li 調用__bool__()
True
調用__bool__()
False
從輸出結果中,我們可以得到兩個信息:一是在自定義對象中在既定義了__bool__()函數又定義了__len__()函數時,程序使用__bool__()函數決定對象的真假;二是注意到在lst_objs2中只輸出了一個“ 調用__bool__()”內容,說明當all()函數在確定了某一個元素已經是False時,不再判斷下面的元素。
(2)只定義__len__()函數
class Teacher:
name = ""
def __init__(self, name):
self.name = name
def __len__(self):
print(f"{self.name}調用__len__()")
return len(self.name)
lst_objs1 = [Teacher("Wang"),Teacher("Li")]
print(all(lst_objs1))
lst_objs2 = [Teacher(""),Teacher("Liu")]
print(all(lst_objs2))
輸出結果:
Wang調用__len__()
Li調用__len__()
True
調用__len__()
False
(3)未定義__len__()和__bool__()函數
class Department:
name = ""
def __init__(self, name):
self.name = name
lst_objs1 = [Department("M"),Department("C")]
print(all(lst_objs1))
lst_objs2 = [Department(""),Department("A")]
print(all(lst_objs2))
輸出結果:
True
True
從上面的輸出結果可以看出,對于用戶自定義對象,若沒有定義__bool__()函數,也沒有定義__len__()函數的情況下,all()函數一律返回True.
all()函數是判斷可迭代對象中的元素中是否都為真值,若可迭代對象中不含0值,空值,False值,None值時,則返回True,否則返回False??盏目傻鷮ο蟊徽J為是真值。未定義__bool__()和__len__()函數時,all()函數也返回True.
新聞熱點
疑難解答