鱼C论坛

 找回密码
 立即注册
查看: 3033|回复: 6

[已解决]Python中(x < y and [x] or [y])[0] 实现什么样的功能?

[复制链接]
发表于 2021-4-30 03:44:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

(x < y and [x] or [y])[0] 实现什么样的功能?有无栗子可举,谢谢宁!
最佳答案
2021-4-30 06:44:26
本帖最后由 洋洋痒 于 2021-4-30 06:45 编辑

首先呢,[x]和[y]肯定是为真的,因为这是两个列表,只要不为空就是True
然后呢,如果x<y为真,x < y and [x] or [y]结果就是[x][0]也就是x  短路逻辑 True and [x]结果是[x],是True,or后边就不看了
             如果x<y为假,x < y and [x] or [y]结果就是[y][0]也就是y False and True为False ,然后再or [y],结果就是[y]
结论,功能就是返回x,y两个数中比较小的一个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-30 06:37:03 From FishC Mobile | 显示全部楼层
按照逻辑短路法则往里套呗
目测是x<y  返回一个值,否则返回另一个值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-30 06:44:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 洋洋痒 于 2021-4-30 06:45 编辑

首先呢,[x]和[y]肯定是为真的,因为这是两个列表,只要不为空就是True
然后呢,如果x<y为真,x < y and [x] or [y]结果就是[x][0]也就是x  短路逻辑 True and [x]结果是[x],是True,or后边就不看了
             如果x<y为假,x < y and [x] or [y]结果就是[y][0]也就是y False and True为False ,然后再or [y],结果就是[y]
结论,功能就是返回x,y两个数中比较小的一个数

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
Judie + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-30 09:22:48 | 显示全部楼层
洋洋痒 发表于 2021-4-29 17:44
首先呢,[x]和[y]肯定是为真的,因为这是两个列表,只要不为空就是True
然后呢,如果x

我不太理解[x]和[y]这两个东西 能麻烦宁再讲讲吗www
还有就是不太理解下面两句 能麻烦宁在细讲讲吗 谢谢宁!
如果x<y为真,x < y and [x] or [y]结果就是[x][0]也就是x
如果x<y为假,x < y and [x] or [y]结果就是[y][0]也就是y
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-30 09:50:43 | 显示全部楼层
##    (x < y and [x] or [y])[0]
##
##    举例说明 :
##
##    x = 1
##
##    y = 2
##
##    [x] == [1]
##
##    [y] == [2]
##
##    bool([x]) == bool([1]) == True
##
##    bool([y]) == bool([2]) == True
##
##    事实上,只要是 [x] 类型 bool([x]) 就一定是 True
##
##    因为 lst = [x] 这个列表中一定 一定包含有元素
##
##    哪怕 x == None 结果依然是 bool([x]) == True
##
##    所以原式中只需要判断 x < y 为 True 或者 False
##
##    如果 x < y 为 True
##
##    原式就变成了
##
##    (True and [x] or [y])[0] ==> [x][0] ==> x
##
##    如果 x < y 为 False
##
##    原式就变成了
##
##    (False and [x] or [y])[0] ==> [y][0] ==> y

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
Judie + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-30 10:02:07 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-4-30 10:34 编辑
Judie 发表于 2021-4-30 09:22
我不太理解[x]和[y]这两个东西 能麻烦宁再讲讲吗www
还有就是不太理解下面两句 能麻烦宁在细讲讲吗 谢谢 ...


and 与逻辑,是 若前一个表达式为True,才会执行 and后面的一个表达式。
or 或逻辑,是 只有前面的所有表达式为False时,才会去执行 or后面的一个表示。
In [15]: a, b = 1, 2

In [16]: (a > b and [a] or [b])  #a>b为 假,故跳过and后的[a]不执行,而执行or后的[b],所以结果为[2],是列表。
#(若反过来,a > b 为真,会接着执行and后的[a],然后两者都为真,则or后的表达式,就不执行了 )
Out[16]: [2]

In [17]: (a > b and [a] or [b])[0]  #[2][0]从列表里取出2 (即b的值)
Out[17]: 2


要不要听“更复杂的解释”?—— 从 运算符的优先级 来看计算机到底是怎么计算的?
在(a > b and [a] or [b])[]  这里的运算符有 小括号()、索引运算符[]、比较运算符 >,逻辑运算符and和or
小括号优先级别最高,故先计算小括号里的表达式——a>b and [a] or [b] 这一表达式中,因为 比较运算符 大于号,优先于逻辑运算符,故先运行;

然后,and的优先级高于or的优先级,故先执行and,但因为and逻辑与,有其“短路逻辑”,
即 and的前后,只要前面的有一个为假,它就不会再执行其后一个表达式( 比如 False and 1+1 and 1-1 因为第一个就为假,后面的就不再执行了)。

所以,or只有在a>b为假时,它才会被执行(这里刚好是 1>2 为假,故会执行or后的[b],而不是and后的[a])。

于是 小括号里的运算结果为 [b],即 [2],是一个列表(且只有一个元素,下标/索引为0)。
于是,再使用索引运算符[],取它的第一个元素,即 [2][0] ,最终结果 即为 2. 

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
Judie + 2 + 2 谢谢宁!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-30 20:45:23 | 显示全部楼层
Judie 发表于 2021-4-30 09:22
我不太理解[x]和[y]这两个东西 能麻烦宁再讲讲吗www
还有就是不太理解下面两句 能麻烦宁在细讲讲吗 谢谢 ...

[x]就是一个列表,里边只有一个元素x

表达式从左至右运算,若 or 的左侧逻辑值为 True ,则短路 or 后所有的表达式(不管是 and 还是 or),直接输出 or 左侧表达式 。若 or 的左侧逻辑值为 False ,则输出or右侧的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
表达式从左至右运算,若 and 的左侧逻辑值为 False ,则短路其后所有 and 表达式,直到有 or 出现,输出 and 左侧表达式到 or 的左侧,参与接下来的逻辑运算。若 and 的左侧逻辑值为 True,则输出其后的表达式,不论其后表达式是真是假,整个表达式结果即为其后表达式的结果
若 or 的左侧为 False ,或者 and 的左侧为 True 则不能使用短路逻辑。

所以x<y为真时候,x < y and [x] or [y]  就是True and [x] or [y] 若 and 的左侧逻辑值为 True,则输出其后的表达式。即为[x]再在后边加个[0],意思就是列表的第一个元素,即为x

下边那个也用短路逻辑带一下你就懂了

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
Judie + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表