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

请教一个关于 map 和 itertools.chain 嵌套的问题

  •  
  •   quinoa42 ·
    quinoa42 · 2017-08-16 13:36:33 +08:00 · 1864 次点击
    这是一个创建于 2416 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    import itertools
    flaten = itertools.chain.from_iterable # 方便起见
    
    def a(i):
        print("a", i)
        return list(range(i))
    def b(i):
        print("b", i)
        return "+"*i
        
    list(map(b,flaten((map(a, [1,2,3,4,5])))))
    

    在解释器下输出为:

    a 1
    b 0
    a 2
    b 0
    b 1
    a 3
    b 0
    b 1
    b 2
    a 4
    b 0
    b 1
    b 2
    b 3
    a 5
    b 0
    b 1
    b 2
    b 3
    b 4
    Out[6]:
    ['',
     '',
     '+',
     '',
     '+',
     '++',
     '',
     '+',
     '++',
     '+++',
     '',
     '+',
     '++',
     '+++',
     '++++']
    

    我之前以为会像嵌套的函数一样先执行内层再执行外层(即输出为a a a a a ... b b b b b...),结果发现似乎并非如此。我的理解为,实际上的过程似乎是在 calllist()的时候才执行。在map(b, ...)第一次调用chain对象的__next__时,chain调用了内层的map__next__,而这又返回了a(i)的值(一个list)。而接下来的几次chain.__next__都只是从这个list中取值直到用尽,用尽后再次调用内层的map.__next__

    请问这样的理解是否正确?

    2 条回复    2017-08-16 15:13:13 +08:00
    guyskk
        1
    guyskk  
       2017-08-16 15:08:43 +08:00
    Python3 里面 map/range/flaten... 返回的都是生成器,不迭代它它就不会执行
    gemini
        2
    gemini  
       2017-08-16 15:13:13 +08:00
    楼上正解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3265 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:16 · PVG 22:16 · LAX 07:16 · JFK 10:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.