Python 中 if..else 的优化。。。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Dragonish3600
V2EX    Python

Python 中 if..else 的优化。。。

  •  
  •   Dragonish3600 2019-07-13 20:39:46 +08:00 6017 次点击
    这是一个创建于 2338 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新手,按照逻辑写了个循环。如下

    list_a= [] old = [] new = [] test = [] ... for i in list_a: if 'keyword' in list_a[0]: if list_a[1] == A: new.append[list[2]] else: old.append[list[2]] else: if list_a[1]== B and ConditionB: test.append[list[2]] if len(old) == 0 and len(new)>10: dosomething() else: if len(new) < len(old) and len(test) ==0: dosomething2(0) else: if len(test)==0: dosomething3() else: if len(test) > 5: dosomething4() 

    老码农同事说我 if else 写的太多,让别人不容易看懂,建议优化下代码比如用 If .. continue。 但是我想了下似乎这种有众多子条件的似乎不太适合用 if ...contiune 来做啊。 请教大家这段代码有啥优化建议么

    第 1 条附言    2019-07-13 22:55:18 +08:00
    补充下,因为程序有字数限制,所以像下面这写法,字数就会比我主楼里的多很多。。。容易超标

    if 'keyword' in list_a[0] and list_a[1] == A:
    elif 'keyword' in list_a[0] and list_a[1] != A:
    21 条回复    2019-07-14 23:30:09 +08:00
    Yvette
        1
    Yvette  
       2019-07-13 20:44:56 +08:00   1
    misaka19000
        2
    misaka19000  
       2019-07-13 20:56:18 +08:00 via Android
    下面那个为啥不用 elif
    uyhyygyug1234
        3
    uyhyygyug1234  
       2019-07-13 21:03:39 +08:00
    @Yvette 这个,,,把所有的 css 都拿掉了,有 gnu 的感觉。。。。
    Dragonish3600
        4
    Dragonish3600  
    OP
       2019-07-13 21:11:14 +08:00
    @misaka19000 可以用 elseif。。。主要用 else 我个人感觉更好理解啊。。
    secondwtq
        5
    secondwtq  
       2019-07-13 21:13:52 +08:00 via iPad
    确实是有一定优化空间的,我能想到的:

    第一段的 append[list[2]] 这个逻辑是重复的,你可以把 if 判断抽出来成一个变量或者函数,然后再 append

    下面那个可以单独搞一个函数,然后 if len(old) == 0 and len(new)>10: return dosomething() 这样
    cdwyd
        6
    cdwyd  
       2019-07-13 21:17:06 +08:00 via Android
    看着不舒服,我习惯把一种情况这写在一起
    比如
    if 'keyword' in list_a[0] and if list_a[1] == A:
    pass
    lhx2008
        7
    lhx2008  
       2019-07-13 21:17:57 +08:00
    if len(old) == 0 and len(new)>10:
    dosomething()
    return;

    if len(new) < len(old) and len(test) ==0:
    dosomething2(0)
    return;
    if len(test)==0
    dosomething3()
    return
    if len(test) > 5:
    dosomething4()
    return
    ysoserious
        8
    ysoserious  
       2019-07-13 21:48:07 +08:00 via Android
    这样写,时间久了可能自己都忘了,实在不行就写点注释把逻辑注释出来就好了。同 5 楼,一般遇到这样的情况就把重复部分提取出来做 function 调用。
    starsriver
        9
    starsriver  
       2019-07-13 21:51:50 +08:00 via Android
    同七楼,面向未来写法
    Dragonish3600
        10
    Dragonish3600  
    OP
       2019-07-13 22:06:26 +08:00 via iPhone
    @lhx2008 我也考虑过这种写法,但是感觉这样写效率不如我那样写啊。我的写法满足了 if 额度条件,就不会再去 elif 里做判断。而你这个写法,会把所有的 if 做一个判断啊,哪怕是在第一个 if 就满足了。
    wi
        11
    wi  
       2019-07-13 22:10:23 +08:00
    多用 return,少用 else,也许有的根本就不好优化,看你这个方法在干什么咯,看着头就大,怎么有这么多 else
    yumenoks
        12
    yumenoks  
       2019-07-13 22:16:35 +08:00
    if 'keyword' in list_a[0]:
    if list_a[1] == A:
    =============
    这里可不可以这个 if 'keyword' in list_a[0] and list_a[1] == A:
    lhx2008
        13
    lhx2008  
       2019-07-13 22:27:15 +08:00
    @ladypxy #10 最后一节要 return 了再用,前面就 if else
    lhx2008
        14
    lhx2008  
       2019-07-13 22:27:36 +08:00
    @ladypxy #10 如果不是最后一节要用,就拆函数。
    BruceLi
        15
    BruceLi  
       2019-07-13 22:30:47 +08:00
    可以用 filter 和 lambda 表达式
    Dragonish3600
        16
    Dragonish3600  
    OP
       2019-07-13 22:53:21 +08:00
    @yumenoks 可以。但是这么写有个问题。

    ```
    if 'keyword' in list_a[0]:
    if list_a[1] == A:
    new.append[list[2]]
    else:
    old.append[list[2]]
    ```
    这段我就要写成
    ```
    if 'keyword' in list_a[0] and list_a[1] == A:
    elif 'keyword' in list_a[0] and list_a[1] != A:

    ```
    这样字数就变多了。。。这程序有大小限制。。。这么写容易超出字数限制。。
    skywatcher
        17
    skywatcher  
       2019-07-14 00:14:08 +08:00
    说实话,真的很难看懂你可以把这串代码要做什么详细描述一下,可能大家能提供更有效、简洁的写法
    skywatcher
        18
    skywatcher  
       2019-07-14 00:37:37 +08:00
    ```python
    def process():
    for i in range(len(list_a)):
    if 'keyword' in list_a[i]:
    if list_a[i] == A:
    new_.append(list_[i])
    else:
    old.append(list_[i])
    elif list_a[i]== B and ConditionB:
    test.append(list_[i+1])

    # situation 1: some description
    if len(old) == 0 and len(new_)>10:
    do_something()
    return

    # situation 2: some description
    if len(new_) < len(old) and len(test) ==0:
    do_something2()
    return

    # situation 3: some description
    if len(test) != 0 and len(test) > 5:
    do_something4()
    else:
    do_something3()
    ```
    lynskylate
        19
    lynskylate  
       2019-07-14 00:47:10 +08:00
    因为不知道你具体逻辑 只能简单的帮你优化一下了
    ```python
    list_a = []
    old_list = []
    new_list = []

    for i in list_a:
    k, w, res, *_ = list_a # 使用解包,变量名再优化下可以增加可读性
    if 'keyword' in k and w == A:
    new_list.append(res)
    else:
    old_list.append(res)


    old_list_length = len(old_list)
    new_list_length = len(new_list)

    if old_list_length == 0 and new_list_length > 10:
    do_something()
    return # 如果后面没有的话,直接在此处 return 减少 if else

    if new_list_length < old_list_length and len(test) == 0
    dosomething2(2)
    return # 同上

    if len(test) == 0:
    dosomething3()
    return # 同上

    if len(test) > 5:
    dosomething4()
    ```
    如果知道你具体逻辑,这个判断应该是能优化不少的。
    vkhsyj
        20
    vkhsyj  
       2019-07-14 17:02:54 +08:00
    把这段代码拆分成两个函数看起来就会好很多了
    imycc
        21
    imycc  
       2019-07-14 23:30:09 +08:00
    `list_a`跟`i`跟`keyword`应该是你简写给我们看的时候写错了,几个变量有点乱,不好说怎么优化。

    单说下面那一部分用`if...elif...elif...elif`会好点,减少缩进的层级。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2567 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 08:48 PVG 16:48 LAX 00:48 JFK 03:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86