代码如下

def _odd_iter(): # 构建奇数序列 从3开始

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) # 埃氏筛选法,产生筛选后新的序列

list_yc = list()

for n in primes():

if n == 17:

list_yc.append(n)

break

list_yc.append(n)

print(list_yc)

输出如下

[2, 3, 5, 7, 11, 13, 17]

代码分析

我不明白代码对别人来说是怎样的难度,我仅说说我自己第一次看到这个代码产生的疑问

it = filter(_not_divisible(n), it) 这一行代码中,调用方法 _not_divisible 方法 时,内部的lambda: x: x % n > 0中 x 的值是多少

it 是一个 Iterator, 每次next时才会返回一个值(for语句里面是每一次循环都调用一次next), 那序列中的 9 是怎样被 3 筛选掉的呢?

第一个问题:

这个地方是一个闭包调用,_not_divisible 返回了一个函数,而那个函数作用于 Iterator 中的每一个元素, 即 x 的值是 Iterator 中的每一个值

第二个问题:

首先追踪 _not_divisible 方法执行的每一步

改写 _not_divisible 如下

def _not_divisible(n):

def lam(x):

if n == 3:

print('_not_divisible, n == 3', x)

elif n == 5:

print('_not_divisible, n == 5', x)

return x % n > 0

return lam

输出如下

_not_divisible, n == 3 5

_not_divisible, n == 3 7

_not_divisible, n == 5 7

_not_divisible, n == 3 9

_not_divisible, n == 3 11

_not_divisible, n == 5 11

_not_divisible, n == 3 13

_not_divisible, n == 5 13

_not_divisible, n == 3 15

_not_divisible, n == 3 17

_not_divisible, n == 5 17

埃氏筛选法 可以明显的看到用3,5筛选序列时是交替进行的。

可以肯定的是,用3筛选的时候没有一次性筛选所有的数字(事实上也不可能,因为_odd_iter是无限序列)

在用数字5筛选的之前,又使用了3筛选。那就是意味着用 3 筛选的方法被挂起了,每当有新数字,该方法会被唤醒且调用。以此类推,每一个数字对应的筛选函数都保存起来了(因为它要作用于序列中的每一个数字)

嗯。。。以上想法仅仅是个人折腾代码,调试出来的猜测,尚未向python大神确认。

思绪来的快去的也快,偶尔在这里停留

python筛选法求素数讲解_埃氏筛选法求素数 Python相关推荐

  1. 【素数问题】整理几种计算素数的算法,包含:两层循环,开根号法,埃氏筛选法,欧拉筛选法

    这篇文章主要介绍素数相关的算法问题,包含:两层循环判断,开根号法,埃氏筛选法,欧拉筛选法. 目录 一.什么是素数 二.素数计算几种方式 2.1.两层循环

  2. C++实现暴力筛、朴素素数筛、埃氏素数筛、欧拉素数筛的解法

    前言:今天有身边的人在群里吐槽了一道烟台大学OJ上面的水题 然后他提出的问题是:如何开一个1000w大小的数组来存储. What?我仔细看了一眼题目,觉得问题的关键并不是数组可以开多大.而是这是一道在 ...

  3. 素数基本(埃氏筛法/线性筛法)

    一.检查n是否为素数 最简单思路:所有可能的因数全部试一遍. int gg(int n) {for(int i=2;i<n;i++){if((n%i)==0)return 0;//有因数就不是素 ...

  4. 素数计算之埃氏筛法、欧拉筛法

    埃氏筛法 int main() {const int maxNumber=200;int isPrime[maxNumber];int i;int x;for (i=0;i<maxNumber; ...

  5. c语言辗转相除法求最大公约数_趣味探究:妙法求“最大公因数”,比书上难一点,你敢挑战吗?(适合56年级)...

    [题记] 宝石虽落在泥土里,仍是宝石,砂粒虽被吹到天空中,还是砂粒.--莎士比亚不是有水的地方就有青蛙,但是青蛙叫的地方必定有水.--歌德 [配合教材]本探究配合"因数与倍数".通 ...

  6. 每个python对象都具有布尔值_百度T7架构师透析Python对象你需要知道这些

    1. Python对象 Python使用对象模型来存储数据.构造任何类型的值都是一个对象. 所有的Python对象都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对 ...

  7. python全栈开发实践入门_讲书3分钟丨《Python全栈开发实践入门》 -讲书人 谢瑛俊...

    只需3分钟就能快速了解一本书! 由作(译)者发声讲书,直指新书的特点与主旨. 只需利用碎片化时间,省时省力选到适合自己的好书 音频链接 音频内容 大家好,我是<Python全栈开发实践入门> ...

  8. python实现异步的几种方式_终于搞明白了,异步Python比同步Python究竟快在哪里?...

    大家好,你是否听人们说过,异步 Python 代码比"普通(或同步)Python 代码更快? 果真是那样吗? 同步和异步是什么意思? Web 应用程序通常要处理许多请求,这些请求在短时间内来 ...

  9. 用vs写python和c++需要哪些工具包_从运行效率与开发效率比较Python和C++

    之前有人一直在说python怎么怎么好用,也有人说C++太难了,下面我做了一些笔记: 1.运行效率:C++ >> Python Python代码和C++最终都会变成CPU指令来跑,但一般情 ...

最新文章

  1. 代码详解|tensorflow实现 聊天AI--PigPig养成记(1)
  2. BaiduSitemap
  3. Google的成果回报型广告
  4. 请求失败或服务未及时响应 有关详细信息_「干货」从零开始的微服务搭建之路...
  5. js中every用法_js数组中的方法 some, every, filter, find,map, reduce讲解及使用场景
  6. php表格单元格怎么实现排序,javascript实现对表格元素进行排序操作
  7. Android4开发入门经典 之 第七部分:数据存储
  8. Oracle view 小结片段
  9. 工作中学习,学习中成长
  10. VS2017控制台打印问题
  11. 线段树入门 (zz)
  12. HDU 2824 The Euler function 欧拉函数
  13. 豆丁网文库下载器,版本:201…
  14. if you already have a 64-bit JDK installed,define a JAVA_HOME variable in
  15. 如何理解STM32单片机引脚的复用功能?
  16. 【笔记】Android手机root的概念
  17. 微信小程序开发-微信支付功能【WxMaService 获取openid,WxPayService建微信订单,接收微信支付异步通知回调方法,附有完整前后端代码】
  18. USDCNY即期均值顺势信号——基于Python的均值回归进阶策略
  19. Java字符拼成图片
  20. 微信公众号消息通知(原生)

热门文章

  1. Win XP必须禁止的服务
  2. (csc)Visual C# 2010 编译器选项.
  3. 13 | 线性排序:如何根据年龄给100万用户数据排序?
  4. jenkins是什么_使用 Jenkins 自动发布服务到 Kubernetes
  5. html按钮不可选中,如何使HTML文本不可选择
  6. QueryWrapper查询
  7. spring mvc全局异常处理,注解实现
  8. android 数组增加,java-添加视图数组会使android应用崩溃
  9. hive 如何将数组转成字符串_教你如何将Power Logic的原理图转成Orcad的原理图
  10. 行云管家堡垒机 导入腾讯云主机