Python 和&;还是在print()函数中工作?
在搜索时看到了这一点,我无法理解背后的逻辑。and&or方法在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
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
的工作原理与打印与否相同。