找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2572|回复: 5

[求助] 求助一个 filter列表的问题

3

主题

8

帖子

8

积分

贫民

积分
8
lyl5530330 发表于 2017-12-26 19:52:47 | 显示全部楼层 |阅读模式
先说下这个例子,是雪峰老师的例子,筛选出素数,首先,列出从2开始的所有自然数,构造一个序列:
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取新序列的第一个数5,然后用5把序列的5的倍数筛掉:
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
不断筛下去,就可以得到所有的素数。这是原理,很简单,然后我是这样实现的:
def born():        n=2        while True:                yield n                n=n+1    #这个是产生序列
def fx(n):
        return lambda x:x%n>0   #筛选没有n公约数的数

>>> def prime():
        it=born()
        while True:
                m=next(it)
                yield m
                it=filter(fx(m),it)  #执行

               
>>> for n in prime():
        if n<99:
                print(n)
        else:
                break
我的问题是这样的,在prime函数中,从列表中取出来第一个数,又放回去(因为第一个数肯定是素数),那么放回去这个数是放在哪里的,是列表最后?还是第一个。还有在filter()中,it列表的数据为什么不是传给m而是传给了fx中的x啊,咋就这么神奇.....


回复

使用道具 举报

2

主题

21

帖子

21

积分

贫民

积分
21
zamzus 发表于 2017-12-27 10:22:31 | 显示全部楼层
第一个问题:假设 list(it) = [3,5,7,9,11,13,15,17,19,21,23,25,27,29,31] while True第一轮: m = 3 , yield 3 , it =filter(fx(3),it) (这里过滤掉3的倍数),所以,这时的 list(it) = [5,7,11,13,17,19,23,25,29,31]。 while True第二轮:m=next(it) = 5 , yield 5 ,it = filter(fx(5),it)(过滤掉5的倍数),所里,这时的 list(it)=[7,11,13,17,19,23,29,31]以此类推,list(prime())=[3,5,7,11...,31],就取出其中的素数了。。。。。
第二个问题:
def fx(n):
    return lambda  x:x % n > 0
# 相当于下面的函数
def fx(n):
    def fy(x):
        return x % n > 0
    return fy
只不过这里使用的匿名函数 lambda而已。
所以 fx(3) = fy ,fx(3)(6) = 调用的内部函数fy(6) ,return False  (6%3>0)。 懂?
回复 支持 反对

使用道具 举报

2

主题

21

帖子

21

积分

贫民

积分
21
zamzus 发表于 2017-12-27 10:30:10 | 显示全部楼层
注意:filter(fx,it)这样才是传给 fx(m)中的m,所以 filter(fx(m),it)就相当于把it传递给函数 fx(m)(x)中 x
回复 支持 反对

使用道具 举报

3

主题

8

帖子

8

积分

贫民

积分
8
lyl5530330  楼主| 发表于 2017-12-28 19:30:28 | 显示全部楼层
zamzus 发表于 2017-12-27 10:22
第一个问题:假设 list(it) = [3,5,7,9,11,13,15,17,19,21,23,25,27,29,31] while True第一轮: m = 3 , yie ...

谢谢大神指点,第二个问题懂了,第一个还是没懂,
第一轮:m = 3 , yield 3 , it =filter(fx(3),it) (这里过滤掉3的倍数),所以,这时的 list(it) = [5,7,11,13,17,19,23,25,29,31]。     这时候it里的3不就过滤掉了吗,
while True第二轮:m=next(it) = 5 , yield 5 ,it = filter(fx(5),it)(过滤掉5的倍数),所里,这时的 list(it)=[7,11,13,17,19,23,29,31],          同上面的问题,这时候it里的5不就过滤掉了吗。
for n in prime():
        if n<99:
                print(n)
        else:
                break         还有这个循环,prime()函数里面的什么值参与循环了啊,他并没有返回值呀,那这个n的值是从哪个范围取的
回复 支持 反对

使用道具 举报

3

主题

8

帖子

8

积分

贫民

积分
8
lyl5530330  楼主| 发表于 2017-12-28 19:30:54 | 显示全部楼层
zamzus 发表于 2017-12-27 10:30
注意:filter(fx,it)这样才是传给 fx(m)中的m,所以 filter(fx(m),it)就相当于把it传递给函数 fx(m)(x)中 x ...

谢谢大神解答,这个问题懂了
回复 支持 反对

使用道具 举报

2

主题

21

帖子

21

积分

贫民

积分
21
zamzus 发表于 2018-1-4 10:40:36 | 显示全部楼层
lyl5530330 发表于 2017-12-28 19:30
谢谢大神指点,第二个问题懂了,第一个还是没懂,
第一轮:m = 3 , yield 3 , it =filter(fx(3),it) (这 ...

你可能不太了解 yield的作用,以后你见识多了,自然就明白了。yield 这个东西它有点类似return,但又不是。举个例子:
def f():
    for i in [1,3,5,9]:
        yield i
那么这个函数的返回值就是一个 [1,3,5,9]的生成器,此时 list(f()) = [1,3,5,9]。当然
for i in f():
    print(i)
输出:
1
3
5
9
所以prime()函数里面的 yield 3, yield 5 ……其实返回的就是 [3,5,……]的一个生成器
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表