Python 和&;还是在print()函数中工作?

Python 和&;还是在print()函数中工作?,python,Python,在搜索时看到了这一点,我无法理解背后的逻辑。and&or方法在print()中如何工作 T=[input().split()中s的int(s)] 打印(T和已排序(已排序(T,reverse=True),key=abs)[0]或0) 我试图简化它,以了解它如何处理不同的输入 打印(A和B或C) 当B不是0时返回B,当B是0时返回C,但从未到达A。这是使用三元条件运算符的一种老式方法 它与打印无关 看 在大多数情况下,它的功能与此代码相同 print(T and sorted(sorted(T

在搜索时看到了这一点,我无法理解背后的逻辑。and&or方法在print()中如何工作

T=[input().split()中s的int(s)]
打印(T和已排序(已排序(T,reverse=True),key=abs)[0]或0)
我试图简化它,以了解它如何处理不同的输入

打印(A和B或C)

当B不是0时返回B,当B是0时返回C,但从未到达A。

这是使用三元条件运算符的一种老式方法

它与
打印
无关

在大多数情况下,它的功能与此代码相同

print(T and sorted(sorted(T,reverse=True),key=abs)[0] or 0)
print(sorted(sorted(T,reverse=True),key=abs)[0] if T else 0)
它之所以能够工作,是因为Python中
以及
的工作方式——它们不返回
bool
,而是返回第一个或第二个操作数,具体取决于它是转换为True还是False

有更多的细节

基本上是两次手术

first = T and sorted(sorted(T,reverse=True),key=abs)[0]
返回第一个Falsy值(如果有),否则返回表达式中的最后一个值

所以它要么返回
[]
(T的可能值),要么返回排序列表中的第一个元素

result = first or 0
返回第一个真值(如果有),否则返回表达式中的最后一个值

因此,如果T是Truthy,我们在
first
中已经有一个Truthy值(除非它是0,这是特殊情况,但是
0或0
无论如何都是
0
),它将被返回


如果
T
[]
,它将返回0。

作为答案的一部分,如果给出一个非空的整数列表
T
,表达式

sorted(sorted(T,reverse=True),key=abs)[0]
返回列表中最接近零的整数。例如,如果
T=[3,-2,4,5]
,它将返回
-2


微妙的一点是,在像
T=[3,-2,4,2]
这样的情况下,
-2
2
是紧密相连的。在这种情况下,它将返回
2
,而不是
-2
。这种特殊情况的逻辑是
排序(T,reverse=True)
将所有正数放在任何负数之前,因此
2
将放在
-2
之前。当使用
key=abs
再次对排序结果进行排序时,
2
-2
已经按照排序顺序(相对于
key=abs
),因此它们不会被交换,因此列表的第一个元素将是
2
而不是
-2
。代码实际上有些微妙,这取决于它是一个稳定的排序算法。

检查:“
运算符不只是对其操作数执行布尔运算,而是给出布尔结果。它们给出的结果总是它们的一个操作数。这些运算符从左到右求值,
的优先级高于
,它们会短路,这意味着它们会尽快停止求值操作数。“
print
始终返回
None
a和B或C
的工作原理与打印与否相同。