前言
进阶部分连载继续~
如果还没看过我的入门连载部分,先看:
https://ask.hellobi.com/blog/wangdawei/10288
当然,小编的免费入门课程已经有咯,看过连载的朋友可以看看视频再快速梳理一遍~
视频传送门:https://edu.hellobi.com/course/234
前文传送门:
Python进阶系列连载(1)——那些容易被忽略的问题(上)
Python进阶系列连载(2)——那些容易被忽略的问题(中)
Python进阶系列连载(3)——那些容易被忽略的问题(下)
Python进阶系列连载(4)——迭代器
Python进阶系列连载(5)——生成器(上)
Python进阶系列连载(6)——生成器(中)
Python进阶系列连载(7)——生成器(下)
Python进阶系列连载(8)——闭包(上)
Python进阶系列连载(9)——Python内置高阶函数map(上)
Python进阶系列连载(10)——Python内置高阶函数map(下)
Python进阶系列连载(11)——Python内置高阶函数reduce(上)
Python进阶系列连载(12)——Python内置高阶函数reduce(下)
Python进阶系列连载(13)——Python内置高阶函数filter(上)
filter
接着上节课我们继续
我们上节课说到通过filter过滤出素数
那我们来详细讲讲几种求素数的方法吧~
那我们先要了解一下什么是素数:
素数(Prime),又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。
方法一:按照定义暴力求解
按照定义,从2到n-1判断有没有能整除n的数。如果有,则不是素数,否则,是素数。
时间复杂度:O(n)
代码如下:
方法二:还是按照定义暴力简化求解
从2到sqrt(n)判断有没有能整除n的数。如果有,则不是素数,否则,是素数。
关于这个理论证明,我在此不详述,有兴趣大家可以搜索了解一下~
时间复杂度:O(sqrt(n))
代码如下:
方法三:素数筛法
即从2开始,先假定给所有数都是素数标签,但因为2的倍数肯定不是素数,则这些2的倍数全都修改为非素数标签。
再向右扫描,如果扫描到素数,则重复之前的过程,剔除之后的部分合数(准确的说是关于当前素数的倍数)
如果扫描到合数则跳过(表示前面已经更新过这个数不是素数)。
然后都扫描一遍即可把1~n的素数求解出来。这个算法的复杂度略高于O(n)。
素数筛代码如下:
方法四:Miller-Rabin算法
这个算法理论要求较高,大家有兴趣可以搜索学习一下~
接下来我们说说filter怎么实现500以内的素数筛选~
其实很简单了:
先生成一个1~500的数组
方法一:
看一下方法一求得的1~500中素数的个数:
方法二:
方法三:
好啦,今天我们讲了使用filter筛选出素数的三种方法~
今天作业:
1.敲一遍代码,感受一下filter的黑魔法
自己不敲代码永远学不会写代码
下课
人生苦短,我选Python
未完待续,连载中......
欢迎评论指出文中错误和提问~~~
下一篇链接:Python进阶系列连载(15)——Python内置高阶函数sorted(上)