这个输入如何与 Python 的‘any’函数一起工作?[重复]
- 2025-03-11 08:54:00
- admin 原创
- 53
问题描述:
在 的 Python 文档页面中any
,该函数的等效代码any()
如下:
def any(iterable):
for element in iterable:
if element:
return True
return False
如果以这种形式调用它,这个函数怎么知道我想要测试什么元素?
any(x > 0 for x in list)
从函数定义中,我所能看到的就是我正在传递一个可迭代对象。循环如何for
知道我在寻找某些东西> 0
?
解决方案 1:
如果您使用,any(lst)
则会看到它lst
是可迭代的,它是一些项目的列表。如果它包含[0, False, '', 0.0, [], {}, None]
(所有项目的布尔值均为False
),则将any(lst)
是False
。如果lst
还包含以下任何一项[-1, True, "X", 0.00001]
(所有项目的计算结果均为True
),则将any(lst)
是True
。
在您发布的代码中,x > 0 for x in lst
这是一种不同类型的可迭代对象,称为生成器表达式。在将生成器表达式添加到 Python 之前,您将创建一个列表推导式,它看起来非常相似,但周围有[]
:[x > 0 for x in lst]
。从lst
包含的[-1, -2, 10, -4, 20]
,您将获得这个理解列表:[False, False, True, False, True]
。然后,这个内部值将传递给any
函数,该函数将返回True
,因为至少有一个True
值。
但是使用生成器表达式True(s)
,Python 不再需要创建和的内部列表,当函数迭代生成器表达式一次生成的一个值时,False(s)
将生成值。并且,由于 是短路,它会在看到第一个值时立即停止迭代。如果您使用类似的东西创建(或者如果您使用的是Python2.x ),这将特别方便。即使这个表达式将生成超过十亿个条目,当它到达 时,只需要到第三个条目,它会对 进行求值,因此可以返回。any
`anyTrue
lstlst = range(-1,int(1e9))
xrangeany
1True
x>0any
True`
如果您创建了列表推导式,Python 首先必须在内存中创建十亿元素列表,然后将其传递给any
。但是通过使用生成器表达式,只要看到或值,您就可以让 Python 的内置函数(如any
和)提前跳出。all
`True`False
解决方案 2:
>>> names = ['King', 'Queen', 'Joker']
>>> any(n in 'King and john' for n in names)
True
>>> all(n in 'King and Queen' for n in names)
False
它只是将几行代码简化为一行。您不必编写如下冗长的代码:
for n in names:
if n in 'King and john':
print True
else:
print False
解决方案 3:
(x > 0 for x in list)
在该函数调用中创建一个生成器表达式,例如
>>> nums = [1, 2, -1, 9, -5]
>>> genexp = (x > 0 for x in nums)
>>> for x in genexp:
print x
True
True
False
True
False
在遇到第一个求值的对象时使用any
和短路True
解决方案 4:
这是因为可迭代对象是
(x > 0 for x in list)
请注意,x > 0
返回True
或False
,因此您有一个布尔值的可迭代。
解决方案 5:
简单地说,any() 可以完成这样的工作:根据条件,即使在列表中遇到一个满足条件的值,它也返回 true,否则返回 false。
list = [2,-3,-4,5,6]
a = any(x>0 for x in lst)
print a:
True
list = [2,3,4,5,6,7]
a = any(x<0 for x in lst)
print a:
False
扫码咨询,免费领取项目管理大礼包!