用 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 2
你需要看的是这个
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 好厉害。。
|