python 找质数的个数_盘一盘 Python 系列特别篇 All 和 Any
本文含 3758 字,9图表截屏建议阅读 10 分钟
本文是 Python 系列的特别篇的第十四篇
特别篇 1 - PyEcharts TreeMap
特别篇 2 - 面向对象编程
特别篇 3 - 两大利「器」
特别篇 4 - 装饰器
特别篇 5 - Sklearn 0.22
特别篇 6 - Jupyter Notebook
特别篇 7 - 格式化字符串
特别篇 8 - 正则表达式
特别篇 9 - 正则表达式实战
特别篇 10 - 错误类型
特别篇 11 - 异常处理
特别篇 12 - Collection
特别篇 13 - Matplotlib Animation
特别篇 14 - All 和 Any
今天星期五,不烧脑了,写一个简单的例子以飨大家。例子虽然简单,但还是有些东西可以学习的。
故事背景:判断一个正整数是不是质数。
逻辑很简单,对于一个数 n,只有从 2 到 n 做个循环,来检查 n 是不是被每个数能整除,如果是,那么 n 不是质数;如果不是,n 是质数。简单明了,代码如下。
def is_prime(n): for i in range(2, n): if n % i == 0: return False return True
检验结果没问题。
print( is_prime(6) )print( is_prime(7) )
False
如果你就此满足,就太不 Pythonic 了。你看这上面 for + if + 两个 return 不觉得丑吗?反正我觉得丑。因此我准备用 Python 里面的 all() 函数来实现,先看看 all() 函数怎么用,用 help(all) 来查看。
help(all)
Help
从上可知,all() 函数的参数是一个可迭代对象(iterable),像列表、元组、字典等等都是可迭代对象。不清楚的同学请参考【两大利器】此贴。
当所有元素都为 True 时,返回 True;只要有一个元素为 False,返回 False。
来我们验证几组,结果没问题。
all([1, 2, 3]all([1, 2, 0])all([1, 2, 'all'])all([[], 2, 'all'])
True
这时候需要了解一个知识点,看完就弄懂上面的结果了。
知识点非布尔型变量也有相对性的布尔值,设该变量为 X
当 X 是元素型变量(整型、浮点型)
当 X 为 0, 0.0,
bool(X) =
False
当 X 非零,
bool(X) =
True
当 X 是容器型变量(字符串、列表、元组、字典、集合)
当 X 为空,
bool(X) =
False
当 X 不为空,
bool(X) =
True
代码验证:
print( type(0), bool(0), bool(3) )print( type(10.31), bool(0.00), bool(10.31) )print( type(''), bool( '' ), bool( 'python' ) )print( type(()), bool( () ), bool( (10,) ) )print( type([]), bool( [] ), bool( [1,2] ) )print( type({}), bool( {} ), bool( {'a':1, 'b':2} ) )print( type(set()), bool( set() ), bool( {1,2} ) )
class 'int'> False True
好,我们现在开始用 all() 函数来实现找质数,那么最自然的就是先创建一个空列表,然后检查 n 是否能被每个元素 i 整除,是的话 n 不是质数,因此列表附加 False 值,反之列表附加 True 值。
def is_prime(n): divisible = [] for i in range(2, n): if n % i == 0: divisible.append(False) else: divisible.append(True) return all(divisible)
结果虽然没问题,但更丑了,这怎么越改还越差了呢?
print( is_prime(11) )print( is_prime(12) )
True
来做点改进,直接在列表上附件表达式 n%i != 0,和上面的代码等价。
def is_prime(n): divisible = [] for i in range(2, n): divisible.append(n % i != 0) return all(divisible)
结果没问题,但代码还是丑陋冗长。
print( is_prime(13) )print( is_prime(14) )
True
Hello,这可是生成列表啊,那用列表解析式(list comprehension)啊!不清楚的同学请参考【盘一盘 Python 下篇】此贴第 5 章。
def is_prime(n): divisible = \ [n % i != 0 for i in range(2, n)] return all(divisible)
检验结果没问题,而且代码漂亮了。但是如果 n 很大又刚好不是质数,那么按照判断逻辑,我们只要找到某个 i 使其可以整除 n 就已经可以判断 n 不是质数了,但是写成列表解析式我们还要把整个列表运行完!
print( is_prime(15) )print( is_prime(16) )
False
一个一个判断,只要到达某点就停,你想到了什么?对,生成器(generator)!
生成器是按需求调用 (call-by-need) 的,你需要调用一个值,我就 yield 一个值,然后用 next() 更新内部状态,等待你下次调用。这套流程也称作惰性求值 (lazy evaluation),目的是最小化计算机要做的工作。在大规模数据时,一次性处理往往抵消而且不方便,而惰性求值解决了这个问题,它把计算的具体步骤延迟到了要实际用该数据的时候。
改下代码,只用把列表解析式的方括号 [] 改成生成器的小括号 (),就完事了。
def is_prime(n): divisible = \ (n % i != 0 for i in range(2, n)) return all(divisible)
检验结果当然没问题。
print( is_prime(17) )print( is_prime(18) )
True
那我们来看看两者的运行效率吧,为了方便比较,定义了两个函数:
is_prime_list_comprehension
is_prime_generator
def is_prime_list_comprehension(n): return all([n % i != 0 for i in range(2, n)])
def is_prime_generator(n): return all((n % i != 0 for i in range(2, n)))
例子 1:我找了个比较大的质数 131071,用 %timeit 魔法指令来显示运行时间。
哈哈哈哈,傻眼了吧,生成器运行的时间 (13.6ms) 比列表解析式运行的时间 (13.1ms) 长。
再想想,当一个数的质数,两个函数都要从头运行到尾哦,13.6ms 和 13.1ms 可以看做一样的。
例子 2:在找一个比较大的非质数,试试 8191*8191 = 67092481,它肯定不是质数,而且也没那么快找出来,因为 8191 是质数,你品一下。
8191*8191
67092481
再看两者运行对比结果,引起极度舒适。
总结
你光讲了 all 函数,那 any 函数呢?类比一下嘛!
all( [x1, x2, ..., xn] ) 是所有 xi 都为 True 返回 True(all 的含义),反之返回 False。
any( [x1, x2, ..., xn] ) 是只要有一个 xi 为 True 就返回 True(any 的含义),反之返回 False。
因此,只要你见到下图左边的代码样子,你就可以用 all() + 生成器。
只要你见到下图左边的代码样子,你就可以用 any() + 生成器。
其实找质数也可以用 any() 函数来实现,代码如下:
def is_prime_use_any(n): return not any((n % i == 0 for i in range(2, n)))
注意 any() 函数前面加了一个 not,而且表达式从 n%i != 0 改成 n%i = 0。意思就是说如果 n 可以被任何(any 的含义)i 整除,返回为 True,前面加个 not 就返回为 False,那么就不是质数。
我的天啊,绕不绕口?这代码反不反人性?再回顾一下优雅 all() 函数实现的代码吧。
def is_prime_use_all(n): return all((n % i != 0 for i in range(2, n)))
说如果 n 不能被所有(all 的含义)i 整除,返回为 True,那么就是质数。
Yes, coding style is a progress!
Stay Tuned!
我的新书《快乐机器学习》
在新加坡终于有买了
扫码进 Lazada 购买
新加坡全岛包邮
我的新课《Python 基础》
扫码购买
零套路无前戏直接干货
上过的都说好
python 找质数的个数_盘一盘 Python 系列特别篇 All 和 Any相关推荐
- python 找质数的个数_用Python打造一款文件搜索工具,所有功能自己定义!
一.前言 大家好,又到了Python办公自动化系列. 在日常的办公中,我们经常会从一堆不同格式的文件(夹)中搜索特定的文件,可能你是凭着记忆去找或是借助软件,但你有想过如何用Python实现吗?本文将 ...
- python分箱统计个数_【数据处理】python变量分箱常见手法:分类型、数值型、卡方、自定义...
""" 分箱逻辑: 1.类别型特征: 1)类别数在5个以下,可以直接根据类别来分箱 (binning_cate) 2)类别数在5个以上,建议做降基处理,再根据降基后的类别 ...
- python找工作心得体会_分享给入门Python小白的学习心得
原标题:分享给入门Python小白的学习心得 Python诞生于1989年,第一个公开版本于1991年问世.作为一门历史悠久的语言,Python具有代码简短.可读性强等先天优势.Python是一个很全 ...
- python找出素数_[Python 1] 如何使用Python找质数?
学习生物信息需要熟练掌握一门甚至多门编程语言,比如Python.R.C++,这取决于你的需求. 但语言只是工具,最关键的是如何合理使用工具去解决生物学问题,这需要你去多写.多查.多看来锻炼.不然给你把 ...
- 如何用三元组表表示下列稀疏矩阵_盘一盘 Python 系列特别篇21之:SciPy 稀疏矩阵...
引言 和稠密矩阵相比,稀疏矩阵的最大好处就是节省大量的内存空间来储存零.稀疏矩阵本质上还是矩阵,只不过多数位置是空的,那么存储所有的 0 非常浪费.稀疏矩阵的存储机制有很多种 (列出常用的五种): C ...
- python运行代码不成功_命令行执行python模块时提示包找不到的问题
庄稼人不是专职python开发的道友,虽然与python相识已多年,可惜相识不相知,只是偶尔借助pydev写一些简单的小工具. 多年来,一直困惑于这样一个问题:同样的工程,同样的代码,使用pydev可 ...
- python科学计算教程视频_【P14】Python科学计算与图形渲染库视频课程视频教程 it教程...
Python视频教程名称: Python科学计算与图形渲染库视频课程视频教程 Python视频教程 [IT视频教程网-www.itspjc.com] it教程 6 T6 ^9 L+ E4 C, }0 ...
- python 鱼c工作室作业_#鱼C工作室Python作业#图解python百度云
最好的python视频教程谁有 我这里有python全套高清教学视频,非常适合新手小白,真实分享,望采纳点赞. python 网盘 python视频教程从入门到精通 有提取码:提取码:8ste 求一个 ...
- python扩展库导入方式_使用pip安装Python扩展库的方法
本文节选自作者的<Python编程基础及应用>视频教程.Python编程基础及应用_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com 使用pip进行安装 ...
最新文章
- Cinder 的 I/O QoS
- BP神经网络基本原理
- 【信息抽取】介绍一种端到端的关系抽取方法
- Android使用webview控件加载本地html,通过Js与后台Java实现数据的传递
- python解zuobiaoxi方程_滑坡稳定性分析程序初探---Python版!
- java定义计算机类并模拟其操作
- 什么是堆栈的构造方法?向上生长堆栈,向下生长堆栈
- python代码块使用缩进来表示_Python代码需要缩进吗
- getQueryString方法使用
- iPhone 史上最大优惠;摩拜「裁员门」反转;百度网盘缩减空间 | 极客头条
- JAVA浮点数浮点数转换成人民币读法
- 2021计算机视觉-包揽所有前沿论文源码 -上半年
- 2022年使用的最佳Javascript库
- c语言只中原子变量含义,c语言中的原子操作 - osc_bkg5rgl1的个人空间 - OSCHINA - 中文开源技术交流社区...
- 7-22 LC老玩游戏 (30 分)
- 苹果固件验证关闭服务器时间,苹果ios系统终于可以降级了,或关闭固件验证
- 域渗透-横向移动(PTT)
- 运动控制屏蔽回原点屏蔽z_index是什么_安卓智能手表它不香吗,为什么要花 3199 买 Apple Watch?...
- 数据分析-----NumPy中的ndarray数组
- Vi编辑器的常用命令3(其他操作)