Python 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
songkaiape
V2EX    Python

Python else 还可以这样用?

  •  
  •   songkaiape 2016-09-21 10:34:36 +08:00 4643 次点击
    这是一个创建于 3358 天前的主题,其中的信息可能已经有所发展或是发生改变。
    for i in range(x): if i>80: break #这里遍历一个列表元素是否满足条件 else: print('go') #如果全部都不满足条件会跳转执行这一步 

    比较好奇这个 else 居然可以正确执行,最开始我还为是代码缩进错误,官方有类似这种写法的范例么?

    37 条回复    2016-09-22 11:07:18 +08:00
    tinyproxy
        1
    tinyproxy  
       2016-09-21 10:39:13 +08:00
    songkaiape
        2
    songkaiape  
    OP
       2016-09-21 10:41:41 +08:00
    Lonely
        4
    Lonely  
       2016-09-21 10:44:30 +08:00
    这也能发个帖
    tftk
        5
    tftk  
       2016-09-21 10:49:21 +08:00
    曾经面试的时候这么用了,被面试官批我逻辑不清晰呵呵呵
    songkaiape
        6
    songkaiape  
    OP
       2016-09-21 10:54:44 +08:00
    @tftk 可能那个面试官也不是很了解这个特性吧。第一次见确实感觉比较奇怪
    linuxchild
        7
    linuxchild  
       2016-09-21 10:55:53 +08:00 via iPhone
    @tftk 逻辑上看上去的确不清晰吧 可读性不太好
    ericls
        8
    ericls  
       2016-09-21 10:59:41 +08:00
    @tftk 应该的
    songkaiape
        9
    songkaiape  
    OP
       2016-09-21 10:59:55 +08:00   2
    @Lonely 不喜直接无视就好了啊,何必回复呢,我又不想骗你铜币。你知道不代表别人都知道。 V2 Python 初学者那么多,就当给他们提个醒
    prefere
        10
    prefere  
       2016-09-21 11:10:38 +08:00
    if else
    for else
    while else
    容易弄混
    jiang42
        11
    jiang42  
       2016-09-21 11:28:25 +08:00 via iPhone
    @tftk
    @songkaiape 如果我是面试官,有人敢写 for else ,肯定也是要批的,这不是熟不熟这个特性的问题,而是代码风格问题
    loryyang
        12
    loryyang  
       2016-09-21 11:31:31 +08:00
    这个 else 逻辑比较坑爹,不建议用,很多人看不懂,而且容易搞反
    TheCure
        13
    TheCure  
       2016-09-21 11:43:14 +08:00
    for a in xrange(10):
    for b in xrange(20):
    if something(a, b):
    # Break the inner loop...
    break
    else:
    # Continue if the inner loop wasn't broken.
    continue
    # Inner loop was broken, break the outer.
    break

    这个 else 逻辑很坑
    在我的项目里写这种代码绝对不给过 review
    mgna17
        14
    mgna17  
       2016-09-21 12:03:33 +08:00
    for - else 挺好用的啊, for 没有被 break 则会执行后续 else 中的代码。
    不过 else 这个词的确是个槽点,要是把 else 改成 than 之类的就好了。
    wizardforcel
        15
    wizardforcel  
       2016-09-21 12:08:45 +08:00
    effective python 第 12 条:不要在 for 和 while 循环后面写 else 块
    ytmsdy
        16
    ytmsdy  
       2016-09-21 12:13:46 +08:00
    还是按照正常的语法来吧,时间久了,很容易看错的
    echopan
        17
    echopan  
       2016-09-21 12:29:46 +08:00
    不要再 for 后面写 else,一般 if 后面写
    Trim21
        18
    Trim21  
       2016-09-21 12:37:11 +08:00
    for i in range(x):
    ....if i>80:
    ........break
    #这里遍历一个列表元素是否满足条件
    ....else:
    ........print('go')
    #如果全部都不满足条件会跳转执行这一步

    这两种在逻辑上有什么区别吗.....
    Kabie
        19
    Kabie  
       2016-09-21 13:02:43 +08:00
    ...特定情况很好用。。。

    说看不懂的只是写得太少了。。。
    yongzhong
        20
    yongzhong  
       2016-09-21 13:07:19 +08:00
    看标题知内容系列
    scipio
        21
    scipio  
       2016-09-21 13:33:24 +08:00
    没人吐槽代码中的这句注释么?

    > #如果全部都不满足条件会跳转执行这一步

    这样的理解是误人子弟。
    songkaiape
        22
    songkaiape  
    OP
       2016-09-21 13:54:20 +08:00
    ifaii
        23
    ifaii  
       2016-09-21 14:01:24 +08:00
    @Trim21 明显有不同吧,楼主的是 range(x)中所有的元素都不满足 if 时才执行 else ,你这样写就变成了只要遇到不满足 if 就执行 else
    21grams
        24
    21grams  
       2016-09-21 14:20:46 +08:00
    我觉得挺好的,简洁,要不这么写的话,你还要加判断循环是执行完了还是 break 了。
    zhanglintc
        25
    zhanglintc  
       2016-09-21 15:58:30 +08:00
    pythonic 进阶必备
    dalang
        26
    dalang  
       2016-09-21 17:15:21 +08:00
    for else 在部分场合很好用呀。
    easing
        27
    easing  
       2016-09-21 17:16:08 +08:00
    没用过的人表示逻辑确实不清晰,坑爹。。
    spikeLIN
        28
    spikeLIN  
       2016-09-21 17:32:07 +08:00 via iPhone
    不建议这么用
    likuku
        29
    likuku  
       2016-09-21 17:34:36 +08:00
    茴香豆的“茴”字有九九八十一种写法...
    lynx
        30
    lynx  
       2016-09-21 17:43:15 +08:00
    这个特性挺好用的,没必要为了照顾一部分人改写成一堆很麻烦的语句
    这个语法也不属于偏门
    weyou
        31
    weyou  
       2016-09-21 17:54:23 +08:00
    这个特性很好用啊, 我一直用,很久以前发现了就感觉逻辑很清晰自然啊,在循环查找时可以少定义一个变量来判断。类似的还有 try...except...else... 他们的含义就是如果没有 break ( except )就执行 else
    laoyur
        32
    laoyur  
       2016-09-21 18:00:23 +08:00
    @mgna17
    > for - else 挺好用的啊, for 没有被 break 则会执行后续 else 中的代码。
    > 不过 else 这个词的确是个槽点,要是把 else 改成 than 之类的就好了。

    Python 初学者表示不知道这个特性,在没有去看文档的情况下,先斗胆自己猜测一下 for else 的意思:
    for 如果没有执行到 break ,就会执行 else 中的代码

    那么问题来了,如果我有意在 for 的最后一次 loop 中 break ,那这个 else 会不会执行?
    mgna17
        33
    mgna17  
       2016-09-21 18:06:53 +08:00
    @laoyur 不会
    geew
        34
    geew  
       2016-09-21 18:23:26 +08:00
    @laoyur 只要 break 执行了 else 里面的就不会执行
    In [626]: for i in range(10):
    .....: print i,
    .....: if i == 9:
    .....: break
    .....: else:
    .....: print 'else'
    .....:
    0 1 2 3 4 5 6 7 8 9
    mingyun
        35
    mingyun  
       2016-09-21 22:29:44 +08:00
    @songkaiape 这个解释不错
    techmoe
        36
    techmoe  
       2016-09-22 05:48:36 +08:00 via Android
    这个和 while 简单拼拼也能和 for 一样用的道理差不多吧
    shily
        37
    shily  
       2016-09-22 11:07:18 +08:00 via Android
    作为 Java 程序员一眼就猜到是 for-else 语句。
    看了楼上才明白 else 是在没有 break 的情况下才执行的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     953 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 19:24 PVG 03:24 LAX 11:24 JFK 14:24
    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