用 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()不断产生筛选后的新的序列。
![]() | 1 Lonely 2016-11-09 16:57:58 +08:00 然后呢,哪 2 个地方不懂? |
![]() | 2 sensui7 OP 习惯了 ctrl+enter 换行, 不小心发出去了. 我的两个疑问: 1. _not_divisible(n) 函数里的 lambda 中 x 的值从哪里传进去的? 2. ` it = filter(_not_divisible(n), it) # 构造新序列` 这行里 it 是一个生成器, 直接传给 filter 函数, filter 如何获取的值, filter 不是接受一个列表作为参数吗? |
![]() | 4 msg7086 2016-11-09 17:13:07 +08:00 via Android 这种时候我就超想安利 Ruby … |
![]() | 5 songkaiape 2016-11-09 17:17:48 +08:00 filter 接受一个函数和一个数组,所以这里的 x 是数组传入的, n 是前面赋值的序列第一个数 |
![]() | 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) |
![]() | 7 sensui7 OP @Lonely 谢谢, 我搞明白了. filter([fn],iterable) 这里面给它传的是_odd_iter, 一个迭代器, filter 返回的也是一个迭代器对象, 而 ``` def _not_divisible(n): return lambda x: x % n > 0 ``` 这里 lambda 的参数 x 接收的是迭代器当前值, 不是 n 的值. 这里是个闭包 ,_not_divisible(n)的执行结果作为 filter 的参数. |
8 sadscv 2016-11-09 17:32:29 +08:00 可以参考 https://docs.python.org/3/library/functions.html#filter filter 接收的第二个参数就是 iterable object,返回的依然是个 iterable object.知道这个就好理解多了。 |
![]() | 10 laoyuan 2016-11-09 17:43:00 +08:00 我感觉,会用 map 就行了,反正我没用过 reduce 和 filter |
![]() | 11 verydxz 2016-11-09 19:13:18 +08:00 相当于 it 外面不断套了很多层_not_divisible(p)?其中 p 是>=3 ,<当前 n 的素数。 sieve of Eratosthenes ? |
![]() | 12 enenaaa 2016-11-09 19:29:09 +08:00 只要想到这里的 filter 其实是 itertools.ifilter 就明白了 |
![]() | 13 zhuangzhuang1988 2016-11-09 20:11:36 +08:00 ![]() 你需要看的是这个 http://www-inst.eecs.berkeley.edu/~cs61a/sp12/book/streams.html#id5 正统的教程( sicp 的 python 版本) 而不是啥都提一点点的 (*** python 教程) |
![]() | 14 sensui7 OP |
![]() | 15 zhuangzhuang1988 2016-11-09 21:25:08 +08:00 via iPad @sensui7 xx 教程所谓的内容广就是讲各种库的 helloword 用法。。实际上水分大 sicp 上面的内容很丰富的 |
![]() | 16 sensui7 OP @zhuangzhuang1988 孤陋寡闻了, 这书原来这么有名, 资源还不少, xx 教程学起来容易, 但是遗患较深. 有体会. |
![]() | 19 zhuangzhuang1988 2016-11-09 21:53:54 +08:00 via iPad @sensui7 紫魔法书 链接是 python 版本的,虽然没有原来的深入,但是也很丰富了 |
![]() | 20 sensui7 OP @zhuangzhuang1988 注意到了,原版是 mit 写的吧, 用的 scheme, 中文版是 90 年代的第二版, 您发的链接是 0 几年的伯克利改编的 python 版. 突然有种想重新学数学的冲动. (). |
![]() | 21 zhuangzhuang1988 2016-11-09 23:04:16 +08:00 @sensui7 和数学没啥关系, 不要听别人瞎扯 |
![]() | 22 20015jjw 2016-11-10 14:31:36 +08:00 via Android @zhuangzhuang1988 给作者做过助教的飘过 这书 berkeley 没人看... 都直接学 61a... |
![]() | 25 20015jjw 2016-11-10 15:53:22 +08:00 via Android @sensui7 61a 自己的 lab/disc 写的太好(嘿嘿嘿都靠我们助教也)了 这个教科书太无聊了 所以... |
![]() | 26 zhuangzhuang1988 2016-11-10 20:20:29 +08:00 @20015jjw 好厉害。。 |