如何在 Python 中使用 any()
目录
作为 Python 程序员,您会经常处理布尔值和条件语句——有时是非常复杂的语句。在这些情况下,您可能需要依赖可以简化逻辑和整合信息的工具。幸运的是,any()
在Python 中有这样一个工具。它查看可迭代对象中的元素并返回一个值,该值指示任何元素在布尔上下文中是否为真或真。
在本教程中,您将学习:
- 如何使用
any()
- 如何在
any()
和之间做出决定or
Python的进站:本教程是一个快速和实用的找到您需要的信息的方式,所以你会回来在任何时候你的项目!
如何any()
在 Python 中使用
想象一下,您正在为雇主的招聘部门编写程序。您可能想要安排与满足以下任一条件的候选人的面试:
- 已经了解 Python
- 有五年以上的开发经验
- 有一个学位
您可以用来编写此条件表达式的一种工具是or
:
# recruit_developer.py
def schedule_interview(applicant):
print(f"Scheduled interview with {applicant['name']}")
applicants = [
{
"name": "Devon Smith",
"programming_languages": ["c++", "ada"],
"years_of_experience": 1,
"has_degree": False,
"email_address": "devon@email.com",
},
{
"name": "Susan Jones",
"programming_languages": ["python", "javascript"],
"years_of_experience": 2,
"has_degree": False,
"email_address": "susan@email.com",
},
{
"name": "Sam Hughes",
"programming_languages": ["java"],
"years_of_experience": 4,
"has_degree": True,
"email_address": "sam@email.com",
},
]
for applicant in applicants:
knows_python = "python" in applicant["programming_languages"]
experienced_dev = applicant["years_of_experience"] >= 5
meets_criteria = (
knows_python
or experienced_dev
or applicant["has_degree"]
)
if meets_criteria:
schedule_interview(applicant)
在上面的示例中,您检查每个申请人的凭据并安排面试,如果申请人满足您的三个标准中的任何一个。
技术细节: Python的any()
,并or
不仅限于评估布尔表达式。相反,Python对每个参数执行真值测试,评估表达式是真还是假。例如,非零整数值被认为是真值,零被认为是假值:
>>> 1 or 0
1
在此示例中,即使or
非零值1
不是布尔类型,也将其计算为真值。or
返回1
,不需要评估 的真实性0
。在本教程的后面,您将了解有关 的返回值和参数评估的更多信息or
。
如果您执行此代码,那么您将看到 Susan 和 Sam 将接受采访:
$ python recruit_developer.py
Scheduled interview with Susan Jones
Scheduled interview with Sam Hughes
该计划之所以选择安排对 Susan 和 Sam 的采访,是因为 Susan 已经了解 Python 并且 Sam 拥有学位。请注意,每个候选人只需要满足一个标准。
另一种评估申请人证书的方法是使用any()
. any()
在 Python 中使用时,必须将申请人的凭据作为可迭代参数传递:
for applicant in applicants:
knows_python = "python" in applicant["programming_languages"]
experienced_dev = applicant["years_of_experience"] >= 5
credentials = (
knows_python,
experienced_dev,
applicant["has_degree"],
)
if any(credentials):
schedule_interview(applicant)
any()
在 Python 中使用时,请记住,您可以将任何可迭代对象作为参数传递:
>>> any([0, 0, 1, 0])
True
>>> any(set((True, False, True)))
True
>>> any(map(str.isdigit, "hello world"))
False
在每个示例中,any()
循环遍历不同的 Python 可迭代对象,测试每个元素的真值,直到找到真值或检查每个元素。
注意:最后一个示例使用 Python 的内置map()
,它返回一个迭代器,其中每个元素都是将字符串中的下一个字符传递给 的结果str.isdigit()
。这是any()
用于更复杂检查的有用方法。
您可能想知道它any()
是否只是or
. 在下一节中,您将了解这些工具之间的差异。
如何区分or
和any()
Pythonor
和any()
Python之间有两个主要区别:
- 句法
- 返回值
首先,您将了解语法如何影响每个工具的可用性和可读性。其次,您将了解每个工具返回的值的类型。了解这些差异将帮助您决定哪种工具最适合特定情况。
句法
or
是一个operator,所以它需要两个参数,一个在两边:
>>> True or False
True
any()
另一方面,是一个函数,它接受一个参数,一个可迭代的对象,它循环遍历以评估真实性:
>>> any((False, True))
True
这种语法差异非常重要,因为它会影响每个工具的可用性和可读性。例如,如果您有一个可迭代对象,那么您可以将其直接传递给any()
. 要从 获得类似的行为or
,您需要使用循环或类似的函数reduce()
:
>>> import functools
>>> functools.reduce(lambda x, y: x or y, (True, False, False))
True
在上面的示例中,您曾经reduce()
将一个可迭代对象作为参数传递给or
. 这可以用 更有效地完成any
,它直接接受可迭代对象作为参数。
为了说明每个工具的语法影响其可用性的另一种方式,假设您想避免测试条件,如果任何前面的条件是True
:
def knows_python(applicant):
print(f"Determining if {applicant['name']} knows Python...")
return "python" in applicant["programming_languages"]
def is_local(applicant):
print(f"Determine if {applicant['name']} lives near the office...")
should_interview = knows_python(applicant) or is_local(applicant)
如果is_local()
执行时间相对较长,那么您不想在knows_python()
已经返回时调用它True
。这称为惰性求值或短路求值。默认情况下,or
懒惰地评估条件,而any
不会。
在上面的例子中,程序甚至不需要确定 Susan 是否是本地人,因为它已经确认她知道 Python。这足以安排面试。在这种情况下,懒惰地调用函数or
将是最有效的方法。
为什么不any()
改用?您在上面学习了any()
将可迭代对象作为参数,Python 根据可迭代对象类型评估条件。因此,如果您使用列表,Python 将在调用之前执行knows_python()
并is_local()
在创建该列表期间执行any()
:
should_interview = any([knows_python(applicant), is_local(applicant)])
在这里,Python 会招揽is_local()
每一位申请者,即使是那些懂 Python 的人。因为is_local()
执行需要很长时间并且有时是不必要的,所以这是一种低效的逻辑实现。
当您使用可迭代对象时,有一些方法可以延迟 Python 调用函数,例如使用map()
或使用生成器表达式构建迭代器:
any((meets_criteria(applicant) for applicant in applicants))
此示例使用生成器表达式生成布尔值,指示申请人是否符合面试条件。一旦申请人符合条件,any()
将True
不检查其余申请人而返回。但请记住,这些类型的变通方法也存在其自身的问题,可能并不适用于所有情况。
要记住的最重要的事情是any()
和之间的语法差异or
会影响它们的可用性。
语法并不是影响这些工具可用性的唯一差异。接下来,让我们看看不同的返回值,any()
以及or
它们如何影响您决定使用哪种工具。
返回值
Python 的any()
和or
返回不同类型的值。any()
返回一个布尔值,表示它是否在迭代中找到了一个真值:
>>> any((1, 0))
True
在这个例子中,any()
找到了一个真值(整数1
),所以它返回了布尔值True
。
or
,另一方面,返回它找到的第一个真值,它不一定是布尔值。如果没有真值,则or
返回最后一个值:
>>> 1 or 0
1
>>> None or 0
0
在第一个示例中,or
评估1
为真值,并在没有评估的情况下返回它0
。在第二个例子中,None
是假的,所以接下来or
计算0
,也是假的。但由于没有更多的表达式要检查,or
返回最后一个值,0
。
当您决定使用哪种工具时,考虑您是想知道对象的实际值还是只想知道对象集合中某处是否存在真值会很有帮助。
结论
恭喜!你学会了插件和使用的出局any()
在Python和之间的差异any()
和or
。对这两种工具有了更深入的了解后,您就可以在自己的代码中做好在它们之间做出决定的准备了。
你现在知道:
- 如何
any()
在 Python 中使用 - 为什么你会使用
any()
而不是or
如果你想继续学习的条件表达式,以及如何使用工具,如or
与any()
在Python,那么你就可以检查出以下资源:
- 点赞
- 收藏
- 关注作者
评论(0)