与any()判断函数详解)
Python函数all()与any()判断函数详解一、开篇批量判断的利器假设你需要检查一个列表中的所有元素是否都满足某个条件或者检查是否至少有一个元素满足条件。你可以用for循环但Python提供了两个更优雅的内置函数all()和any()。⌨️ 先看对比# 问题检查所有学生是否都及格分数≥60scores[85,92,78,95,88]# 方法一for循环all_passTrueforsinscores:ifs60:all_passFalsebreak# 方法二all() —— 一行搞定all_passall(s60forsinscores)print(all_pass)# Trueall()和any()让批量条件判断变得简洁优雅。它们与生成器表达式配合使用时还具有短路求值特性——不会做不必要的计算。二、all()全部为真才为真2.1 基本用法# all(iterable)可迭代对象中所有元素为True时返回True# 逻辑上等价于element1 AND element2 AND element3 AND ...print(all([True,True,True]))# Trueprint(all([True,False,True]))# Falseprint(all([1,2,3]))# True —— 所有非零数都是真值print(all([1,0,3]))# False —— 0是假值print(all([hello,world]))# True —— 非空字符串是真值print(all([hello,]))# False —— 空字符串是假值print(all([[1],[2,3]]))# Trueprint(all([[],[2,3]]))# False —— 空列表是假值# all([])的特殊行为——空可迭代对象返回Trueprint(all([]))# True —— 这是数学上的空真vacuous truth# 原因没有元素所以不存在为假的元素因此所有零个元素都为真2.2 与生成器表达式配合# ⌨️ all()的最佳实践与生成器表达式配合# 检查所有元素是否满足条件numbers[1,3,5,7,9]print(all(n%21forninnumbers))# True —— 都是奇数print(all(n0forninnumbers))# True —— 都是正数print(all(n5forninnumbers))# False —— 7和9不小于5# 检查所有字符串是否都符合要求passwords[abc12345,password1,secure99,login_pass]print(all(len(p)8forpinpasswords))# True —— 都≥8位print(all(any(c.isdigit()forcinp)forpinpasswords))# True —— 都有数字# 检查所有字典是否包含某个键users[{name:张三,email:zstest.com},{name:李四,email:lstest.com},{name:王五,email:wwtest.com},]print(all(emailinuserforuserinusers))# True2.3 短路求值# all()具有短路求值遇到第一个False就停止# 后续元素不会被检查——这一点在性能和数据安全上很重要defcheck_with_log(n):带日志的检查函数print(f 检查{n}...)returnn0# 因为all遇到False就停止所以只会打印到0print(all() 短路演示)resultall(check_with_log(n)fornin[1,2,0,-1,3])print(f结果:{result})# 输出# all() 短路演示# 检查 1...# 检查 2...# 检查 0... ← 0 0 是Falseall在这里停止# 结果: False# 注意-1和3没有被检查三、any()任一为真即为真3.1 基本用法# any(iterable)可迭代对象中任一元素为True时返回True# 逻辑上等价于element1 OR element2 OR element3 OR ...print(any([False,False,True]))# Trueprint(any([False,False,False]))# Falseprint(any([0,0,1]))# Trueprint(any([0,,None,False]))# False —— 全是假值print(any([,hello]))# True —— hello是真值# any([])的特殊行为——空可迭代对象返回Falseprint(any([]))# False# 原因没有元素所以不存在为真的元素3.2 典型应用场景# 场景一检查是否包含某类元素numbers[2,4,6,8,9,10]print(any(n%21forninnumbers))# True —— 有奇数(9)print(any(n100forninnumbers))# False —— 没有大于100的print(any(n0forninnumbers))# False —— 没有负数# 场景二检查是否有空值fields[张三,zhangsantest.com,,北京]print(any(fforfinfields))# True —— 有字段为空# 场景三检查用户是否有某种权限user_permissions[read,write]print(any(pinuser_permissionsforpin[admin,delete]))# Falseprint(any(pinuser_permissionsforpin[admin,write]))# True# 场景四单词中是否有元音字母wordrhythmvowelsset(aeiou)print(any(cinvowelsforcinword))# False —— rhythm没有元音3.3 短路求值# any()也有短路求值遇到第一个True就停止defis_expensive_check(n):模拟耗时检查print(f 耗时检查{n}...)returnn50print(any() 短路演示)resultany(is_expensive_check(n)fornin[10,30,80,90,100])print(f结果:{result})# 耗时检查 10...# 耗时检查 30...# 耗时检查 80... ← 80 50 是Trueany在这里停止# 结果: True# 90和100没有被检查四、all()和any()的联合使用4.1 复杂条件判断# 场景新用户注册表单验证defvalidate_registration(data):验证注册表单errors[]# all()所有必填字段必须非空required[username,password,email]ifnotall(data.get(f)forfinrequired):errors.append(所有必填字段必须填写)# any()至少选择一种通知方式notification_methods[email_notify,sms_notify,push_notify]ifnotany(data.get(m)forminnotification_methods):errors.append(至少选择一种通知方式)# 组合密码规则——必须包含字母和数字passworddata.get(password,)has_letterany(c.isalpha()forcinpassword)has_digitany(c.isdigit()forcinpassword)is_long_enoughlen(password)8ifnotall([has_letter,has_digit,is_long_enough]):errors.append(密码至少8位包含字母和数字)returnlen(errors)0,errors# 测试test_data{username:zhangsan,password:abc,# 密码太短email:,email_notify:False,sms_notify:False,}valid,errorsvalidate_registration(test_data)print(f验证结果:{通过ifvalidelse失败})foreinerrors:print(f -{e})4.2 数据质量检查# 检查数据集是否完整有效defis_valid_row(row):检查数据行是否有效——所有字段非空且年龄合理returnall([row.get(name),row.get(email),row.get(age)isnotNone,0row.get(age,-1)150,])defhas_valid_rows(data):检查数据集中至少有一行有效数据returnany(is_valid_row(row)forrowindata)data[{name:张三,email:zstest.com,age:25},{name:,email:,age:None},# 无效{name:李四,email:lstest.com,age:-5},# 无效年龄]print(f所有行有效:{all(is_valid_row(row)forrowindata)})# Falseprint(f有有效行:{has_valid_rows(data)})# True五、总结all()和any()是Python的真值逻辑双胞胎——一个需要全部满足一个只需任一满足。它们和生成器表达式的组合让复杂条件判断变得简洁优雅。核心规则函数空可迭代对象行为短路条件all()返回True全真→True遇到False停止any()返回False有真→True遇到True停止✅最佳场景表单验证all()检查必填any()检查至少选一个数据质量all()确认数据完整any()确认有可用数据权限检查all()需要全部权限any()任一权限即可条件过滤配合生成器避免不必要的循环