使用“and”关键字连接语句

6
我正在执行以下操作:
if ycoords[0] > 0 and ycoords[1] > 0 and ycoords[2] > 0:
    # do stuff

您能否通过类似以下方式缩短此代码:

if (ycoords[0] and ycoords[1] and ycoords[2]) > 0:
    # do stuff

还相关的内容:https://dev59.com/qGgv5IYBdhLWcg3wW_d_ - Dimitris Fasarakis Hilliard
3个回答

9

是的,你可以使用all:

if all(x > 0 for x in ycoords):

如果ycoords的元素个数大于3,则使用ycoords[:3]


3
不行,但是你可以使用min来简化语法测试:
if min(ycoords[0],ycoords[1],ycoords[2]) > 0:
    # do stuff

鉴于ycoords恰好有三个元素,代码可以更短:

if min(*ycoords) > 0:
    #do stuff

你可以像@Tagc所说的那样,省略星号(*):
if min(ycoords) > 0:
    #do stuff

但这样做会导致一些额外的开销。
另一个选项是使用all
if all(x > 0 for x in [ycoords[0],ycoords[1],ycoords[2]]):
    # do stuff

或者,如果ycoords仅包含这三个元素:

if all(x > 0 for x in ycoords):
    # do stuff

3
更短的写法:if min(*ycoords) > 0。甚至更短:if min(ycoords) > 0 - Tagc

1

有一点不太直观的是 and

“不管是 and 还是 or 都不会限制它们返回的值和类型为 False 和 True,而是返回最后一个被评估的参数”

只需打开 Python 终端并执行以下操作:

>> 4 and 3
3

为什么需要考虑这个问题?

你可能会认为:

(ycoords[0] and ycoords[1] and ycoords[2]) > 0 

等同于:

ycoords[0] > 0 and ycoords[1] > 0 and ycoords[2] > 0

或者等价于:

(bool(ycoords[0]) and bool(ycoords[1]) and bool(ycoords[2])) > 0

但它实际上等效于:
ycoords[2] > 0

因此,请注意,解释器并不是在执行您认为它正在执行的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接