Python for 循环中的陷阱 - 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
hoxis
V2EX    Python

Python for 循环中的陷阱

  •  
  •   hoxis 2018-07-13 08:58:56 +08:00 6251 次点击
    这是一个创建于 2653 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Python 中的 for 循环和其他语言中的 for 循环工作方式是不一样的,今天就带你深入了解 Python 的 for 循环,看看它是如何工作的,以及它为什么按照这种方式工作。

    https://mp.weixin.qq.com/s?__biz=MjM5NjMyMjUzNg%3D%3D&mid=2448130798&idx=1&sn=baa1799ceeee81dc05ba530845c03b9d&chksm=b2f42f698583a67f7c1066dc2778809327b0ffc0e0d314b2d8757fccf794137477eadcca2285&scene=0

    38 条回复    2018-07-14 13:31:15 +08:00
    bucky
        1
    bucky  
       2018-07-13 10:02:32 +08:00
    感觉写的有点误导人,squares 那个不能叫陷阱,只不过因为你预设了其它编程语言的概念而导致的错误,我觉得要讲 python 就直接讲 python,没有必要拿其它语言里的概念来对比

    我发现许多讲编程语言的都喜欢这种方式,比如学过 java 的讲 python 或者 Javascript,总是非常激动讲函数作为一等对象的特性,本来很自然的概念,让这些人激动的一讲,反而容易误导别人
    kindjeff
        2
    kindjeff  
       2018-07-13 10:12:35 +08:00
    所以说要理解语法先。这三个应该不至于叫陷阱吧,毕竟语法就是这样的。generator 你迭代完就是玩了;迭代 dict 的时候就是迭代的 key。
    对其他语言来的一开始可能有点疑惑,但是 Python 语法确实就是这么写的~如果对 Python 熟悉就不会觉得这个是「陷阱」吧。
    hustlibraco
        3
    hustlibraco  
       2018-07-13 10:16:58 +08:00
    这种文章确实挺误导人的,可迭代对象和 for 循环本身就是两个东西,不能混为一谈。
    cyrbuzz
        4
    cyrbuzz  
       2018-07-13 10:36:55 +08:00
    至少第一个不能叫陷阱吧。
    生成器本身就是为了与普通的列表区分来的。生成器所使用的场景也是迭代前不生成这些数据,迭代后不在需要这些数据。如果需要多次使用的数据,为什么不直接用「列表」或者其他的数据结构而使用生成器呢?
    wqzjk393
        5
    wqzjk393  
       2018-07-13 10:41:19 +08:00
    要么就 for a in b,要么就 for i in range(0:len(b)),和 java c 的 for 就不是一回事
    bumz
        6
    bumz  
       2018-07-13 10:45:10 +08:00   4
    一点用词的区别,被作者拿来大肆渲染

    一点雕虫小技被作者渲染得神乎其神

    这种文章就是毒瘤,善于营销但是不善于合理引导
    kidexp
        7
    kidexp  
       2018-07-13 10:51:41 +08:00
    垃圾文章
    fourstring
        8
    fourstring  
       2018-07-13 11:00:48 +08:00
    已 block
    fourstring
        9
    fourstring  
       2018-07-13 11:01:41 +08:00   8
    @Lived 能否控制该营销号发帖?
    imn1
        0
    imn1  
       2018-07-13 11:08:27 +08:00   1
    既然都说了「生成器」,那不知道生成器只可遍历一次?

    逻辑是先有定义才有判断的,定义的意思没搞清楚、不准确,判断就会错误,就叫做「逻辑不通」了
    lance6716
        11
    lance6716  
       2018-07-13 12:06:22 +08:00 via Android
    有空看这些半吊子博文不如多熟悉官方 ref
    reself
        12
    reself  
       2018-07-13 12:09:23 +08:00 via Android
    辣鸡,block
    wwqgtxx
        13
    wwqgtxx  
       2018-07-13 12:25:01 +08:00 via iPhone
    本来还以为要从 cpython 源代码分析 for 的执行原理,点开一看都是些没啥营养的,初学者才会犯的错
    ex2vkf
        14
    ex2vkf  
       2018-07-13 12:42:37 +08:00 via iPhone
    标题党是万恶之源
    u2386
        16
    u2386  
       2018-07-13 13:10:42 +08:00 via iPhone
    分清列表和生成器...
    zeroten
        17
    zeroten  
       2018-07-13 13:11:28 +08:00
    这种文章俗称标题党
    luw2007
        18
    luw2007  
       2018-07-13 13:52:42 +08:00
    block +1
    cheneydc
        19
    cheneydc  
       2018-07-13 14:09:07 +08:00
    看的我竟然笑了~唉
    Qzier
        20
    Qzier  
       2018-07-13 14:11:23 +08:00 via iPhone
    Generator、Iterator、Iterable,啥子陷阱,搞什么大新闻!
    araraloren
        21
    araraloren  
       2018-07-13 15:34:14 +08:00
    既然 生成器中没有了东西,再迭代为何 python 不抛异常??
    XuAaron
        22
    XuAaron  
       2018-07-13 16:02:33 +08:00
    生成器内部就是这样实现的,看这个还不如去看官方教程,或者推荐看 简明 python 教程,也比看这个好。
    gnozix
        23
    gnozix  
       2018-07-13 16:06:26 +08:00
    这是来搞笑的?
    yanzixuan
        24
    yanzixuan  
       2018-07-13 16:10:18 +08:00
    LZ 是 UC 出来的?起个标题都这样吸引眼球?
    NaVient
        25
    NaVient  
       2018-07-13 16:16:10 +08:00   1
    我觉得人家虽然写得不好,可也算是用心去写了,V2 什么时候风气这样了?你们觉得简单不看就行了嘛,干嘛喷人家?
    aijam
        26
    aijam  
       2018-07-13 16:22:48 +08:00
    TankyWoo
        27
    TankyWoo  
       2018-07-13 16:29:57 +08:00
    这种文章真恶心,讲生成器就好好讲,文章开头说什么陷阱,py 入门书都会说明生成器的概念和行为。
    itskingname
        28
    itskingname  
       2018-07-13 16:41:56 +08:00
    垃圾文章,看到就烦。Block
    whoami9894
        29
    whoami9894  
       2018-07-13 16:51:22 +08:00 via Android
    列表解析外部用小括号返回的是生成器,生成器是一次性的,跟 for 循环有啥关系,更谈不上陷阱
    Atukey
        30
    Atukey  
       2018-07-13 16:54:03 +08:00
    UC 员工吗?
    luozic
        31
    luozic  
       2018-07-13 16:54:27 +08:00
    python 一开始的语法里面就有啊,入门书里面还专门提了这个区别;已经 block
    doraemon1293
        32
    doraemon1293  
       2018-07-13 16:57:01 +08:00
    一句话总结 ()的出来的 express comprehension 是 generator 不是 tuple
    bin381
        33
    bin381  
       2018-07-13 17:00:57 +08:00
    标题党
    BOYPT
        34
    BOYPT  
       2018-07-13 17:06:51 +08:00
    公众号毒瘤
    xpresslink
        35
    xpresslink  
       2018-07-13 17:47:36 +08:00
    这个 不正经程序员 对 python 其实只是一知半解,知其然不知其所以然的程序,主要是做小白粉丝营销的。

    t/466147
    t/466161
    pynix
        36
    pynix  
       2018-07-13 18:08:53 +08:00   1
    震惊,某 Python 半吊子博主发垃圾文被大佬按在地上摩擦!!!
    mingyun
        37
    mingyun  
       2018-07-13 23:46:58 +08:00
    好奇公众号的链接为什么有的这么长 有的短 比如 https://mp.weixin.qq.com/s/oc0hvAr-FoJFtiDF5x2p4Q
    future0906
        38
    future0906  
       2018-07-14 13:31:15 +08:00
    楼主在经营自己的公众号无疑。
    从纯技术的角度讨论说,python 这样做也是有问题的,这样的语法正常的期待也是生成一个 tuple 而不是 generator。

    就像:
    1.type([1,2,3]) = list
    2.type([x for x in xx]) = list
    3.type((1,2,3)) = tuple
    4.type((x for x in xx)) == generator (黑人问号???)
    我猜是需要优化某总语法的性能才这样做,但也是反人类的。

    就像
    type((1)) = int
    type((1,)) = tuple

    一样
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2612 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 12:57 PVG 20:57 LAX 05:57 JFK 08:57
    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