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

2016-11-09 16:52:49 +08:00
 sensui7

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

突然有种想重新学数学的冲动. ╮(╯▽╰)╭.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/319330

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX