相关疑难解决方法(0)

Python的任何和所有功能如何工作?

我想了解如何any()all()Python的内置函数的工作.

我试图比较元组,以便如果任何值不同,那么它将返回True,如果它们都是相同的,它将返回False.他们如何在这种情况下返回[False,False,False]?

d是一个defaultdict(list).

print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该输出

# [False, True, False]
Run Code Online (Sandbox Code Playgroud)

因为(1,1)是相同的,(5,6)是不同的,并且(0,0)是相同的.

为什么所有元组的评估为False?

python

199
推荐指数
6
解决办法
26万
查看次数

Python:any() / all() 中的惰性函数求值

Python 中的逻辑运算符是惰性的。具有以下定义:

def func(s):
    print(s)
    return True
Run Code Online (Sandbox Code Playgroud)

呼叫or接线员

>>> func('s') or func('t')
's'
Run Code Online (Sandbox Code Playgroud)

只计算第一个函数调用,因为or识别表达式计算为 True,而不管第二个函数调用的返回值。and行为类似。

但是,当以下列方式使用any()(类比:)时all()

>>> any([func('s'), func('t')])
's'
't'
Run Code Online (Sandbox Code Playgroud)

所有函数调用都会被评估,因为在any开始迭代其项目的布尔值之前,首先构造内部列表。当我们省略列表构造而只写时,也会发生同样的情况

>>> func('s') or func('t')
's'
Run Code Online (Sandbox Code Playgroud)

这样,我们失去的力量any短路,它只要迭代的第一个元素是truish打破该装置。如果函数调用代价高昂,那么预先评估所有函数是一个很大的损失,并且浪费了any. 从某种意义上说,人们可以将其称为 Python 陷阱,因为对于尝试利用 的此功能的用户来说可能出乎意料any,并且any通常被认为只是链接一系列or语句的另一种语法方式。但any只是短路,而不是懒惰,这就是这里的区别。

any正在接受一个 iterable。因此,应该有一种创建迭代器的方法,该迭代器不会预先评估其元素,而是将未评估的元素传递给any并让它们any仅在内部评估,以实现完全懒惰的评估。

所以,问题是:我们如何使用any真正的惰性函数评估?这意味着:我们如何制作一个any可以消费的函数调用迭代器,而无需预先评估所有函数调用?

python lazy-evaluation short-circuiting any

8
推荐指数
1
解决办法
431
查看次数

所有(列表)都使用短路评估吗?

我希望使用Python all()函数来帮助我计算某些东西,但是如果all()它没有在它命中时就进行评估,那么这个东西可能会花费更长的时间False.我想它可能是短路评估,但我只是想确定.另外,有没有办法告诉Python如何评估函数?

python evaluation short-circuiting

6
推荐指数
2
解决办法
1687
查看次数