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

廖雪峰 python 教程的有 2 个地方看不懂

  •  
  •   sensui7 · 2016-11-09 16:52:49 +08:00 · 5926 次点击
    这是一个创建于 2696 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 Python 来实现这个算法,可以先构造一个从 3 开始的奇数序列:

    def _odd_iter():
        n = 1
        while True:
            n = n + 2
            yield n
    

    注意这是一个生成器,并且是一个无限序列。

    然后定义一个筛选函数:

    def _not_divisible(n):
        return lambda x: x % n > 0
    

    最后,定义一个生成器,不断返回下一个素数:

    def primes():
        yield 2
        it = _odd_iter() # 初始序列
        while True:
            n = next(it) # 返回序列的第一个数
            yield n
            it = filter(_not_divisible(n), it) # 构造新序列
    这个生成器先返回第一个素数 2 ,然后,利用 filter()不断产生筛选后的新的序列。
    
    26 条回复    2016-11-10 20:20:29 +08:00
    Lonely
        1
    Lonely  
       2016-11-09 16:57:58 +08:00
    然后呢,哪 2 个地方不懂?
    sensui7
        2
    sensui7  
    OP
       2016-11-09 16:58:43 +08:00
    习惯了 ctrl+enter 换行, 不小心发出去了.

    我的两个疑问:
    1. _not_divisible(n) 函数里的 lambda 中 x 的值从哪里传进去的?
    2. ` it = filter(_not_divisible(n), it) # 构造新序列`
    这行里 it 是一个生成器, 直接传给 filter 函数, filter 如何获取的值, filter 不是接受一个列表作为参数吗?
    Lonely
        3
    Lonely  
       2016-11-09 17:05:51 +08:00
    @sensui7 filter(function, iterable),传入一个函数和一个可迭代对象。
    msg7086
        4
    msg7086  
       2016-11-09 17:13:07 +08:00 via Android
    这种时候我就超想安利 Ruby …
    songkaiape
        5
    songkaiape  
       2016-11-09 17:17:48 +08:00
    filter 接受一个函数和一个数组,所以这里的 x 是数组传入的, n 是前面赋值的序列第一个数
    btjoker
        6
    btjoker  
       2016-11-09 17:23:33 +08:00
    1.关键就是, return lambda x: x % n > 0. it 就是 x 参数
    2,filter(function or None, iterable)
    sensui7
        7
    sensui7  
    OP
       2016-11-09 17:27:49 +08:00
    @Lonely 谢谢, 我搞明白了.

    filter([fn],iterable)

    这里面给它传的是_odd_iter, 一个迭代器, filter 返回的也是一个迭代器对象,


    ```
    def _not_divisible(n):
    return lambda x: x % n > 0
    ```
    这里 lambda 的参数 x 接收的是迭代器当前值, 不是 n 的值. 这里是个闭包 ,_not_divisible(n)的执行结果作为 filter 的参数.
    sadscv
        8
    sadscv  
       2016-11-09 17:32:29 +08:00
    可以参考 https://docs.python.org/3/library/functions.html#filter
    filter 接收的第二个参数就是 iterable object,返回的依然是个 iterable object.知道这个就好理解多了。
    sensui7
        9
    sensui7  
    OP
       2016-11-09 17:40:34 +08:00
    @sadscv 对迭代器不熟, 思路总是停留在数组上
    laoyuan
        10
    laoyuan  
       2016-11-09 17:43:00 +08:00
    我感觉,会用 map 就行了,反正我没用过 reduce 和 filter
    verydxz
        11
    verydxz  
       2016-11-09 19:13:18 +08:00
    相当于 it 外面不断套了很多层_not_divisible(p)?其中 p 是>=3 ,<当前 n 的素数。 sieve of Eratosthenes ?
    enenaaa
        12
    enenaaa  
       2016-11-09 19:29:09 +08:00
    只要想到这里的 filter 其实是 itertools.ifilter 就明白了
    zhuangzhuang1988
        13
    zhuangzhuang1988  
       2016-11-09 20:11:36 +08:00   ❤️ 2
    你需要看的是这个
    http://www-inst.eecs.berkeley.edu/~cs61a/sp12/book/streams.html#id5
    正统的教程( sicp 的 python 版本)
    而不是啥都提一点点的 (*** python 教程)
    sensui7
        14
    sensui7  
    OP
       2016-11-09 21:15:29 +08:00
    @zhuangzhuang1988
    好书, 重新学下程序基础结构.不过覆盖面挺广, 内容却不多, 不知道有没有配套的公开课什么的.
    谢谢
    zhuangzhuang1988
        15
    zhuangzhuang1988  
       2016-11-09 21:25:08 +08:00 via iPad
    @sensui7 xx 教程所谓的内容广就是讲各种库的 helloword 用法。。实际上水分大
    sicp 上面的内容很丰富的
    sensui7
        16
    sensui7  
    OP
       2016-11-09 21:39:55 +08:00
    @zhuangzhuang1988 孤陋寡闻了, 这书原来这么有名, 资源还不少,
    xx 教程学起来容易, 但是遗患较深. 有体会.
    Vhc
        17
    Vhc  
       2016-11-09 21:48:43 +08:00
    @sensui7 习惯了 enter 换行,微信上总是想换行时按一下 enter 键就把消息发出去了。。。
    Vhc
        18
    Vhc  
       2016-11-09 21:50:01 +08:00
    @Vhc Electronic WeChat ,没找到在哪里修改快捷键。
    zhuangzhuang1988
        19
    zhuangzhuang1988  
       2016-11-09 21:53:54 +08:00 via iPad
    @sensui7 紫魔法书 链接是 python 版本的,虽然没有原来的深入,但是也很丰富了
    sensui7
        20
    sensui7  
    OP
       2016-11-09 22:48:58 +08:00
    @zhuangzhuang1988 注意到了,原版是 mit 写的吧, 用的 scheme, 中文版是 90 年代的第二版, 您发的链接是 0 几年的伯克利改编的 python 版.

    突然有种想重新学数学的冲动. ╮(╯▽╰)╭.
    zhuangzhuang1988
        21
    zhuangzhuang1988  
       2016-11-09 23:04:16 +08:00
    @sensui7 和数学没啥关系, 不要听别人瞎扯
    20015jjw
        22
    20015jjw  
       2016-11-10 14:31:36 +08:00 via Android
    @zhuangzhuang1988 给作者做过助教的飘过 这书 berkeley 没人看... 都直接学 61a...
    sensui7
        23
    sensui7  
    OP
       2016-11-10 15:03:31 +08:00 via iPhone
    @20015jjw 这不就是 61a 的教科书吗?
    20015jjw
        24
    20015jjw  
       2016-11-10 15:52:27 +08:00 via Android
    @sensui7 但是没人看 我学 61a 的时候没人看 教 61a 的时候更没人看...
    20015jjw
        25
    20015jjw  
       2016-11-10 15:53:22 +08:00 via Android
    @sensui7 61a 自己的 lab/disc 写的太好(嘿嘿嘿都靠我们助教也)了 这个教科书太无聊了 所以...
    zhuangzhuang1988
        26
    zhuangzhuang1988  
       2016-11-10 20:20:29 +08:00
    @20015jjw 好厉害。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3016 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 15:02 · PVG 23:02 · LAX 08:02 · JFK 11:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.