V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
coolair
V2EX  ›  问与答

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

  •  
  •   coolair · 71 天前 · 1465 次点击
    这是一个创建于 71 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正常写法:

    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
    

    还有其他写法吗?

    21 条回复    2022-06-10 22:34:07 +08:00
    shintendo
        1
    shintendo  
       71 天前
    y = 2 if a == 1 else 3 就是其它语言的三目运算符吧
    sadfQED2
        2
    sadfQED2  
       71 天前 via Android
    我觉得这挺好懂的呀,这种语法糖没啥好怕的。怕的是有些人 if 条件写几十行再给你来几个位运算,还没个注释,那才看不懂
    mekingname
        3
    mekingname  
       71 天前
    @sadfQED2 我觉得楼主应该是在主动寻找更难懂的写法,他不是在吐槽 Python 的 if 难懂。
    Leviathann
        4
    Leviathann  
       71 天前
    match
    ipwx
        5
    ipwx  
       71 天前
    我认为正常写法更好
    imn1
        6
    imn1  
       71 天前
    if a in {3,2,1}: y=((x:=bool(a&3))+1)+bool(b==1)
    imn1
        7
    imn1  
       71 天前
    呃,前面错了,位运算在这没啥用
    if a in {3,2,1}: y=((x:=bool(a))+1)+bool(b==1)
    coolair
        8
    coolair  
    OP
       71 天前
    @mekingname 是的。
    BeautifulSoap
        9
    BeautifulSoap  
       71 天前
    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
        10
    smallfount  
       71 天前
    简单结构不做太多嵌套还好吧。。
    Buges
        11
    Buges  
       71 天前 via Android
    动态语言,最难懂的就是利用上各种隐式转换规则。
    这也是很多 obfuscator 的实现原理。
    makelove
        12
    makelove  
       71 天前
    @Buges 举个例子 python 有哪个隐式转换规则难懂的?
    Buges
        13
    Buges  
       71 天前 via Android
    @makelove 比如用数字运算的结果表示转义字符、用 Bool 表示数字等等。
    难懂的不是规则本身,而是把这些隐式转换组合(滥用)起来,从而可以实现代码混淆的效果。
    marcong95
        14
    marcong95  
       71 天前
    来个一行流:

    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
        15
    deplivesb  
       71 天前
    if a == 1 or (a in [2, 3] and b == 1)
    你觉得这个可读性变差????
    aneureka
        16
    aneureka  
       71 天前
    ```python
    if a in range(1, 4):
    if a == 1:
    x, y = 1, 2
    elif b == 1:
    x, y = 1, 3
    ```
    HankAviator
        17
    HankAviator  
       70 天前 via Android
    @aneureka 可能性扩充太大了,不妥
    aneureka
        18
    aneureka  
       70 天前 via iPhone
    @HankAviator #17 “可能性扩充太大了”不太理解🤨
    HankAviator
        19
    HankAviator  
       63 天前 via Android
    @aneureka 我不会 python 哈,但是 range 函数里面是可以取非整数值?这样会把 op 隐含的只包含整数的限制去掉。
    aneureka
        20
    aneureka  
       63 天前
    @HankAviator #19 那你还是先学下吧 2333
    HankAviator
        21
    HankAviator  
       63 天前
    @aneureka 哈哈哈露怯了,哦不,是中毒了😂
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2521 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 03:10 · PVG 11:10 · LAX 20:10 · JFK 23:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.