首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

Python for 循环中的陷阱

  •  
  •   hoxis · 7 天前 · 2796 次点击

    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
        1
    bucky   7 天前
    感觉写的有点误导人,squares 那个不能叫陷阱,只不过因为你预设了其它编程语言的概念而导致的错误,我觉得要讲 python 就直接讲 python,没有必要拿其它语言里的概念来对比

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

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

    这种文章就是毒瘤,善于营销但是不善于合理引导
        7
    kidexp   7 天前
    垃圾文章
        8
    fourstring   7 天前
    已 block
        9
    fourstring   7 天前   ♥ 8
    @Lived 能否控制该营销号发帖?
        10
    imn1   7 天前   ♥ 1
    既然都说了「生成器」,那不知道生成器只可遍历一次?

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

    https://www.v2ex.com/t/466147
    https://www.v2ex.com/t/466161
        36
    pynix   7 天前   ♥ 1
    震惊,某 Python 半吊子博主发垃圾文被大佬按在地上摩擦!!!
        37
    mingyun   7 天前
    好奇公众号的链接为什么有的这么长 有的短 比如 https://mp.weixin.qq.com/s/oc0hvAr-FoJFtiDF5x2p4Q
        38
    future0906   6 天前
    楼主在经营自己的公众号无疑。
    从纯技术的角度讨论说,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

    一样
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   实用小工具   ·   639 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 18ms · UTC 19:50 · PVG 03:50 · LAX 12:50 · JFK 15:50
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1