VPS爱客--vps优惠_服务器优惠_vps评测

今天学到 序列生成式 生成器 filter 太尼玛抽象了吧

计算素数的一个方法是埃氏筛法,它的算法理解起来非常简单:

首先,列出从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, …

不断筛下去,就可以得到所有的素数。

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. #奇数生成器
  4. def _add_iter():
  5.     n = 1
  6.     while n < 100:
  7.         n = n+2
  8.         yield(n)
  9. #filter筛选函数
  10. def _not_divisible(n):
  11.     return lambda x: x % n > 0
  12. #最终生成器
  13. def primes():
  14.     yield(2)
  15.     it = _add_iter() #初始化序列
  16.     while True:
  17.         n = next(it) #返回序列的第一个数
  18.         yield(n)
  19.         it = filter(_not_divisible(n),it) #重构序列
  20. #打印1000以内的素数   
  21. for x in primes():
  22.     if x < 1000:
  23.         print(x)
  24.     else:
  25.         break

复制代码
上海网友:哪里抽象了。。。。。。

未经允许不得转载:VPS爱客 » 今天学到 序列生成式 生成器 filter 太尼玛抽象了吧
分享到: 更多 (0)