Python if 语句写法,能更精简更难懂吗?

2022-06-02 11:21:26 +08:00
 coolair

正常写法:

if a == 1:
    x = 1
    y = 2
elif a in [2, 3] and b == 1:
    x = 1
    y = 3

少几行代码,可读性变差:

if a == 1 or (a in [2, 3] and b == 1):
    x = 1
    y = 2 if a == 1 else 3

还有其他写法吗?

1826 次点击
所在节点    问与答
21 条回复
shintendo
2022-06-02 11:23:12 +08:00
y = 2 if a == 1 else 3 就是其它语言的三目运算符吧
sadfQED2
2022-06-02 11:40:15 +08:00
我觉得这挺好懂的呀,这种语法糖没啥好怕的。怕的是有些人 if 条件写几十行再给你来几个位运算,还没个注释,那才看不懂
mekingname
2022-06-02 11:59:39 +08:00
@sadfQED2 我觉得楼主应该是在主动寻找更难懂的写法,他不是在吐槽 Python 的 if 难懂。
Leviathann
2022-06-02 12:02:41 +08:00
match
ipwx
2022-06-02 12:03:36 +08:00
我认为正常写法更好
imn1
2022-06-02 12:06:43 +08:00
if a in {3,2,1}: y=((x:=bool(a&3))+1)+bool(b==1)
imn1
2022-06-02 12:15:12 +08:00
呃,前面错了,位运算在这没啥用
if a in {3,2,1}: y=((x:=bool(a))+1)+bool(b==1)
coolair
2022-06-02 12:18:26 +08:00
@mekingname 是的。
BeautifulSoap
2022-06-02 12:55:07 +08:00
Kotlin 表示?

val result = if (a > b) a else if (a < b ) sum(a,b,c,d,e,f,g) else (if (c > d) c else d)
smallfount
2022-06-02 13:00:59 +08:00
简单结构不做太多嵌套还好吧。。
Buges
2022-06-02 13:30:28 +08:00
动态语言,最难懂的就是利用上各种隐式转换规则。
这也是很多 obfuscator 的实现原理。
makelove
2022-06-02 13:55:00 +08:00
@Buges 举个例子 python 有哪个隐式转换规则难懂的?
Buges
2022-06-02 14:09:37 +08:00
@makelove 比如用数字运算的结果表示转义字符、用 Bool 表示数字等等。
难懂的不是规则本身,而是把这些隐式转换组合(滥用)起来,从而可以实现代码混淆的效果。
marcong95
2022-06-02 15:13:31 +08:00
来个一行流:

import functools import reduce; x, y = reduce(lambda s, t: t[1] if (a, b) == t[0] else s, (((1, type('ae', (object, ), { "__eq__": lambda s, o: True })()), (1, 2)), ((2, 1), (1, 3)), ((3, 1), (1, 3))), None) or (None, None)
deplivesb
2022-06-02 15:22:37 +08:00
if a == 1 or (a in [2, 3] and b == 1)
你觉得这个可读性变差????
aneureka
2022-06-02 22:12:47 +08:00
```python
if a in range(1, 4):
if a == 1:
x, y = 1, 2
elif b == 1:
x, y = 1, 3
```
HankAviator
2022-06-03 20:57:40 +08:00
@aneureka 可能性扩充太大了,不妥
aneureka
2022-06-03 21:11:37 +08:00
@HankAviator #17 “可能性扩充太大了”不太理解🤨
HankAviator
2022-06-10 20:53:56 +08:00
@aneureka 我不会 python 哈,但是 range 函数里面是可以取非整数值?这样会把 op 隐含的只包含整数的限制去掉。
aneureka
2022-06-10 22:28:59 +08:00
@HankAviator #19 那你还是先学下吧 2333

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/856888

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX