廖雪峰 python 教程的有 2 个地方看不懂 - 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
sensui7
V2EX    Python

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

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

    用 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 /td>
        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 的教科书吗?
    2015jjw
        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     Solana     4409 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:10 PVG 18:10 LAX 03:10 JFK 06:10
    Do have faith in what you're doing.
    ubao 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