python筛选法求素数讲解_埃氏筛选法求素数 Python
代码如下
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相关推荐
- 【素数问题】整理几种计算素数的算法,包含:两层循环,开根号法,埃氏筛选法,欧拉筛选法
这篇文章主要介绍素数相关的算法问题,包含:两层循环判断,开根号法,埃氏筛选法,欧拉筛选法. 目录 一.什么是素数 二.素数计算几种方式 2.1.两层循环
- C++实现暴力筛、朴素素数筛、埃氏素数筛、欧拉素数筛的解法
前言:今天有身边的人在群里吐槽了一道烟台大学OJ上面的水题 然后他提出的问题是:如何开一个1000w大小的数组来存储. What?我仔细看了一眼题目,觉得问题的关键并不是数组可以开多大.而是这是一道在 ...
- 素数基本(埃氏筛法/线性筛法)
一.检查n是否为素数 最简单思路:所有可能的因数全部试一遍. int gg(int n) {for(int i=2;i<n;i++){if((n%i)==0)return 0;//有因数就不是素 ...
- 素数计算之埃氏筛法、欧拉筛法
埃氏筛法 int main() {const int maxNumber=200;int isPrime[maxNumber];int i;int x;for (i=0;i<maxNumber; ...
- c语言辗转相除法求最大公约数_趣味探究:妙法求“最大公因数”,比书上难一点,你敢挑战吗?(适合56年级)...
[题记] 宝石虽落在泥土里,仍是宝石,砂粒虽被吹到天空中,还是砂粒.--莎士比亚不是有水的地方就有青蛙,但是青蛙叫的地方必定有水.--歌德 [配合教材]本探究配合"因数与倍数".通 ...
- 每个python对象都具有布尔值_百度T7架构师透析Python对象你需要知道这些
1. Python对象 Python使用对象模型来存储数据.构造任何类型的值都是一个对象. 所有的Python对象都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对 ...
- python全栈开发实践入门_讲书3分钟丨《Python全栈开发实践入门》 -讲书人 谢瑛俊...
只需3分钟就能快速了解一本书! 由作(译)者发声讲书,直指新书的特点与主旨. 只需利用碎片化时间,省时省力选到适合自己的好书 音频链接 音频内容 大家好,我是<Python全栈开发实践入门> ...
- python实现异步的几种方式_终于搞明白了,异步Python比同步Python究竟快在哪里?...
大家好,你是否听人们说过,异步 Python 代码比"普通(或同步)Python 代码更快? 果真是那样吗? 同步和异步是什么意思? Web 应用程序通常要处理许多请求,这些请求在短时间内来 ...
- 用vs写python和c++需要哪些工具包_从运行效率与开发效率比较Python和C++
之前有人一直在说python怎么怎么好用,也有人说C++太难了,下面我做了一些笔记: 1.运行效率:C++ >> Python Python代码和C++最终都会变成CPU指令来跑,但一般情 ...
最新文章
- 代码详解|tensorflow实现 聊天AI--PigPig养成记(1)
- BaiduSitemap
- Google的成果回报型广告
- 请求失败或服务未及时响应 有关详细信息_「干货」从零开始的微服务搭建之路...
- js中every用法_js数组中的方法 some, every, filter, find,map, reduce讲解及使用场景
- php表格单元格怎么实现排序,javascript实现对表格元素进行排序操作
- Android4开发入门经典 之 第七部分:数据存储
- Oracle view 小结片段
- 工作中学习,学习中成长
- VS2017控制台打印问题
- 线段树入门 (zz)
- HDU 2824 The Euler function 欧拉函数
- 豆丁网文库下载器,版本:201…
- if you already have a 64-bit JDK installed,define a JAVA_HOME variable in
- 如何理解STM32单片机引脚的复用功能?
- 【笔记】Android手机root的概念
- 微信小程序开发-微信支付功能【WxMaService 获取openid,WxPayService建微信订单,接收微信支付异步通知回调方法,附有完整前后端代码】
- USDCNY即期均值顺势信号——基于Python的均值回归进阶策略
- Java字符拼成图片
- 微信公众号消息通知(原生)
热门文章
- Win XP必须禁止的服务
- (csc)Visual C# 2010 编译器选项.
- 13 | 线性排序:如何根据年龄给100万用户数据排序?
- jenkins是什么_使用 Jenkins 自动发布服务到 Kubernetes
- html按钮不可选中,如何使HTML文本不可选择
- QueryWrapper查询
- spring mvc全局异常处理,注解实现
- android 数组增加,java-添加视图数组会使android应用崩溃
- hive 如何将数组转成字符串_教你如何将Power Logic的原理图转成Orcad的原理图
- 行云管家堡垒机 导入腾讯云主机