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
tanteng
V2EX  ›  Python

Python 减少循环层次和缩进技巧

  •  1
     
  •   tanteng ·
    tanteng · 2015-05-08 23:18:58 +08:00 · 5436 次点击
    这是一个创建于 3479 天前的主题,其中的信息可能已经有所发展或是发生改变。
    25 条回复    2015-05-13 10:45:33 +08:00
    Septembers
        1
    Septembers  
       2015-05-08 23:38:33 +08:00
    这图,这不算技巧把,这个逻辑优化在任何语言上都适用
    greatyao
        2
    greatyao  
       2015-05-08 23:41:58 +08:00 via Android
    good
    yukirock
        3
    yukirock  
       2015-05-08 23:51:28 +08:00
    ```
    if is_for_sale(item) && compute_cost(item) > wallet.money:
    buy(item)
    ```
    laotaitai
        4
    laotaitai  
       2015-05-08 23:53:51 +08:00
    我觉得第一个易读.
    mimzy
        5
    mimzy  
       2015-05-08 23:56:04 +08:00
    感谢分享。写 C# 的时候 Resharper 有一个自选的功能叫 Invert "if" statement to reduce nesting,和楼主说的应该是同样的道理。
    donghouhe
        6
    donghouhe  
       2015-05-09 00:51:17 +08:00 via Android
    @yukirock 大哥你二了,用and不是&&吧
    我也来个
    ```
    if all( is_for_sale(item), compute_cost(item) > wallet.money ): buy(item)
    ```
    chevalier
        7
    chevalier  
       2015-05-09 00:55:21 +08:00
    <代码大全>里面专门有教这个,把多个嵌套的循环/判断改写的可读性好
    zhengkai
        8
    zhengkai  
       2015-05-09 01:06:48 +08:00   ❤️ 2
    是的,真有心想以编程为职业的话,还是去看下《代码大全》吧,这本书不会让你得到什么深奥的计算机知识,都是些基本常识,我觉得具备常识和不具备常识的人之间沟通是有障碍的。明明是花一个月时间就能整本书几百页看完都掌握的了知识,却要隔三差五去把其中的零碎的只言片语当成什么花哨技巧,从而一辈子都没法去学完

    《代码大全》讲了减少缩进有很多种方法,还比方说,没有循环的情况下,如果 if 层数太多,可以加个 do { ... } while (false) ,然后每个 if 里都是 break
    powergx
        9
    powergx  
       2015-05-09 01:13:03 +08:00
    代码短,好看 != 性能好

    把自己当成解释器跑人脑跑一边就知道了
    geeklian
        10
    geeklian  
       2015-05-09 03:47:39 +08:00 via iPhone
    为了代码的可读性,可维护性,应该优先选择接近业务逻辑和自然语言的,而不是代码好看。
    ryd994
        11
    ryd994  
       2015-05-09 04:51:00 +08:00
    其实性能上是一样的
    层数多又不影响大O
    puncsky
        12
    puncsky  
       2015-05-09 05:59:32 +08:00
    Code Complete +1
    billgreen1
        13
    billgreen1  
       2015-05-09 10:48:53 +08:00
    不应该用列表推导式吗?
    [by(item) for item in items if is_for_sale(item) and compute_cost(item)<= wallet.money]
    erik0
        14
    erik0  
       2015-05-09 11:19:42 +08:00
    教你学用continue
    tanteng
        15
    tanteng  
    OP
       2015-05-09 12:49:34 +08:00
    @chevalier 这个例子是否是对的
    yukirock
        16
    yukirock  
       2015-05-09 12:55:20 +08:00
    @donghouhe
    多謝指正
    不過 all() 有類似 and 的 Short-circuit evaluation 麼?
    lilydjwg
        17
    lilydjwg  
       2015-05-09 13:40:04 +08:00
    @yukirock 必然有的嘛。
    Gandum
        18
    Gandum  
       2015-05-09 15:01:18 +08:00 via iPhone
    一猜就是continue
    handleyan
        19
    handleyan  
       2015-05-09 17:01:02 +08:00 via iPhone
    楼主好不容易在编程的世界里迈出了可贵的一步,你们就不能给点掌声吗?谁当年不是这么一步一步过来的,楼主加油!
    ctexlive
        20
    ctexlive  
       2015-05-09 17:20:32 +08:00 via Android
    这个代码唯一好处就是改进了缩进样式。
    fatestigma
        21
    fatestigma  
       2015-05-09 17:41:31 +08:00 via iPad
    这个好像是叫德摩根定律。。
    shierji
        22
    shierji  
       2015-05-09 21:19:19 +08:00 via Android
    感觉很有用 谢谢
    x88484532
        23
    x88484532  
       2015-05-10 14:39:55 +08:00
    前段代码只是加深了判断层次,并没有加深循环层次
    hhstore
        24
    hhstore  
       2015-05-13 10:24:31 +08:00
    用continue除了让代码变得不直观,增加debug的麻烦.看不出有啥意义.
    写可维护性高,易读,易debug,不易出错的代码,比炫技更重要.

    代码少,你用continue还可控.
    代码量大了,过段时间,估计你自己都不确信自己当初是否是想表达这样的逻辑.

    个人不喜欢版本2的写法,团队里,谁滥用这种写法,估计是神烦的.

    不过倒是引起一个好奇,有必要检索一下常见的框架源码(Django,Flask)中有多少continue关键词.
    看看正经的项目,有多少滥用continue的.
    hhstore
        25
    hhstore  
       2015-05-13 10:45:33 +08:00
    我简单的在pycharm中检索了我的开发环境/Library/Python/2.7/site-packages目录下出现continue的包:

    统计如下:
    =======================================


    项目 / 源码 / 单元测试
    django /220次(口算求和,不一定准确) 10次
    flask /2次
    tornado /40次 /10次
    bottle /9次
    requests /16次
    jinja2 /24次
    httplib2 /6次
    bs4 /7次
    scrapy /13次
    sqlalchemy /101次 /5次


    =======================================

    简单挑了几个,可以看出来.大多数的项目,使用continue的关键字都是极少.
    我检索了我所有的开发包,总共出现942次continue.
    安装的很多包,都是0次~

    =======================================
    感兴趣的小伙伴,自行看看自己的pycharm,做这个统计,还是很轻松的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2650 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:30 · PVG 12:30 · LAX 20:30 · JFK 23:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.