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

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

  •  
  •   coolair · 2022-06-02 11:21:26 +08:00 · 1933 次点击
    这是一个创建于 909 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正常写法:

    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  
       2022-06-02 11:23:12 +08:00
    y = 2 if a == 1 else 3 就是其它语言的三目运算符吧
    sadfQED2
        2
    sadfQED2  
       2022-06-02 11:40:15 +08:00 via Android
    我觉得这挺好懂的呀,这种语法糖没啥好怕的。怕的是有些人 if 条件写几十行再给你来几个位运算,还没个注释,那才看不懂
    mekingname
        3
    mekingname  
       2022-06-02 11:59:39 +08:00
    @sadfQED2 我觉得楼主应该是在主动寻找更难懂的写法,他不是在吐槽 Python 的 if 难懂。
    Leviathann
        4
    Leviathann  
       2022-06-02 12:02:41 +08:00
    match
    ipwx
        5
    ipwx  
       2022-06-02 12:03:36 +08:00
    我认为正常写法更好
    imn1
        6
    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
        7
    imn1  
       2022-06-02 12:15:12 +08:00
    呃,前面错了,位运算在这没啥用
    if a in {3,2,1}: y=((x:=bool(a))+1)+bool(b==1)
    coolair
        8
    coolair  
    OP
       2022-06-02 12:18:26 +08:00
    @mekingname 是的。
    BeautifulSoap
        9
    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
        10
    smallfount  
       2022-06-02 13:00:59 +08:00
    简单结构不做太多嵌套还好吧。。
    Buges
        11
    Buges  
       2022-06-02 13:30:28 +08:00 via Android
    动态语言,最难懂的就是利用上各种隐式转换规则。
    这也是很多 obfuscator 的实现原理。
    makelove
        12
    makelove  
       2022-06-02 13:55:00 +08:00
    @Buges 举个例子 python 有哪个隐式转换规则难懂的?
    Buges
        13
    Buges  
       2022-06-02 14:09:37 +08:00 via Android
    @makelove 比如用数字运算的结果表示转义字符、用 Bool 表示数字等等。
    难懂的不是规则本身,而是把这些隐式转换组合(滥用)起来,从而可以实现代码混淆的效果。
    marcong95
        14
    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
        15
    deplivesb  
       2022-06-02 15:22:37 +08:00
    if a == 1 or (a in [2, 3] and b == 1)
    你觉得这个可读性变差????
    aneureka
        16
    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
        17
    HankAviator  
       2022-06-03 20:57:40 +08:00 via Android
    @aneureka 可能性扩充太大了,不妥
    aneureka
        18
    aneureka  
       2022-06-03 21:11:37 +08:00 via iPhone
    @HankAviator #17 “可能性扩充太大了”不太理解🤨
    HankAviator
        19
    HankAviator  
       2022-06-10 20:53:56 +08:00 via Android
    @aneureka 我不会 python 哈,但是 range 函数里面是可以取非整数值?这样会把 op 隐含的只包含整数的限制去掉。
    aneureka
        20
    aneureka  
       2022-06-10 22:28:59 +08:00
    @HankAviator #19 那你还是先学下吧 2333
    HankAviator
        21
    HankAviator  
       2022-06-10 22:34:07 +08:00
    @aneureka 哈哈哈露怯了,哦不,是中毒了😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3848 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:29 · PVG 18:29 · LAX 02:29 · JFK 05:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.