关于廖雪峰老师的python教程中函数式编程章节中的filter实现素数的代码的理解

"""为了描述清楚,我给每个it都起个别名"""

1 def _odd_iter():
2    n = 1
3   while True:
4        n = n + 2
5        yield n


6 def _not_divisible(n):
7    print("n = ", n)
8    return lambda x: x % n > 0  # 把是n的倍数的数字除去


9 def primes():
10    yield 2
11    it3 = _odd_iter()  # [3,5,7,9,...]
12   while True:
13        n = next(it2)
14        yield n
15        # filter第二个参数是可迭代对象就可以
16        it4 = filter(_not_divisible(n), it3) 
        """ 
        _not_divisible函数中的x参数,是由it3生成的,
        当程序第一次执行到16行时,it4是一个包含除去it3生成的数字中3的倍数的数字,如果it3是一个 
        列表,it4中的值可以直接next出来,不需要由it3生成x参数。但此时it3是一个生成器,也就是说
        我们在取x的值的时候,程序要运行_odd_iter来生成x。
        执行完16行后,开始取filter过滤后的数字了,next去取的时候,先计算x的值,这次运行后x=5, 
        然后运行filter中的过滤条件,也就是_not_divisible函数体中的语句,如果满足条件,说明第13 
        行中的n取到值了,此时,可以yield这个素数了。
        然后第二次执行第16行,此时it4是一个包含除去it3中5的倍数和3的倍数的数字,(我写"包含除了3 
        和5倍数的数字"是因为,这个时候的it3是包含不是3的倍数的值。这是第一次运行16行得结果,只 
        是因为生成器是惰性的,所以我们只能在逻辑上先这样想。而第二次运行时,it4是包含除了5的倍数 
        的数值。下面会解释什么时候运行除以3。)
        然后运行第13行, 
        开始取filter过滤后的数字了,next去取的时候,先计算x的值,这次运行后x=7, 
        然后运行filter中的过滤条件,拿7依次去除以3和5,如果满足条件,第13行中会取到n的值了,此 
        时,可以yield这个素数了。依次类推。
        """


        
17 for n in primes():
18     if n <= 20:
19        print(n)
20    else:
21        break

嗯,如有不对还请各位大佬指正~不胜感激!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值