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。空的可迭代对象被认为是真值。未定义__bool__()和__len__()函数时,all()函数也返回True.
新闻热点
疑难解答