filter(_not_divisible(n), it) 一句中,这样写:_not_divisible(n) 为什么不会报错

2015-06-25 22:34:18 +08:00
 Tiande

用 filter 求素数

## 埃氏筛法 求 素数
### 从 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) # 构造新序列
### 测试结果
for n in primes():
    if n < 100:
        print(n)
    else:
        break

目前查到关于 filter(function, sequence) 的例子并没有这种用法:

filter(_not_divisible(n), it)

n 是 _odd_iter() 返回的一个 奇数,那 _not_divisible(n) 不就不是指向 函数,而是指向 函数的结果 了吗。

filter 为啥还能 如丝般运行

懵逼了 ;(

求一语到破人生迷思。

3756 次点击
所在节点    Python
7 条回复
weyou
2015-06-25 22:43:31 +08:00
return lambda x: x % n > 0
是返回的一个lambda函数啊,怎么会是函数结果呢?不知道你要表达什么.
Tiande
2015-06-25 22:47:16 +08:00
@weyou

谢谢,没补到 lambda,以为返回的是结果。我再试试看。

以后不能瞎猜了 ;)
deanguqiang
2015-06-25 23:20:36 +08:00
Python 3 的 filter 返回的是 iterator 了?
deanguqiang
2015-06-25 23:27:00 +08:00
@deanguqiang 查了一下,还真是。。。
Tiande
2015-06-25 23:48:45 +08:00
@deanguqiang p2 p3 好可怕hhhh
firemiles
2015-06-26 07:40:04 +08:00
@dtdnqsb 感觉python3删除了很多冗余的东西,少了很多语法糖,但函数的行为更加一致,记忆更方便。
Tiande
2015-06-26 07:45:48 +08:00
@firemiles 直接学的 3,不知道以后会遇到什么坑。

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

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

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

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

© 2021 V2EX