Python小白爬坑笔记之有关质数的问题详解(超详细注释,小白也能看的懂)

本篇文章主要介绍了如何用Python解决一系列质数问题,解释超详细,偏口语化,简单易懂,注释详细,可能部分解释不准确,但程序均跑过一般没有问题。望采纳。

 对质数于,大家听起来熟悉但如果要求准确说出概念,可能会出现语无伦次的情况,那么先来普及下什么是质数。

质数(又称素数),是指在大于1的自然数中,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为质数(素数)。比1大但不是质数的数称为合数,1和0既非素数也非合数。

那么如何用python判断一个数是否为质数有什么方法呢?

1.判断某一个数是否为质数


import math #调用math模块
 
def isPrime(n): #定义一个判断一个数是否为质数的函数,n为形参
  if n <= 1: 
  return False#至此函数定义结束
  for i in range(2, int(math.sqrt(n)) + 1): #编程思想,遍历2~(num开方后取整+1)(+1不包括)
  if n % i == 0: 
    return False
  return True

此程序较简单,形参和实参均用n表示 。再来详细说明一下以下代码:

 for i in range(2, int(math.sqrt(n)) + 1)

range()表示有序整数序列,包括开始数字,不包括结束数字。int()代表对括号内的数据进行取整操作。math.sqrt()是math函数中开平方的操作。

举例 若输入17,即n=17,那么最终遍历结果为:2,3,4。

接下来用17除以这些值余数均不为零,所以17是质数。有关数学证明,感兴趣的话可以百度,在这里就不多赘述了。

2.求2-N之间不包括N的所有质数并输出

from math import sqrt #调用math函数中的sqrt方法
N = 99
listname=[ p for p in  range(2, N) if 0 not in [ p% d for d in range(2, int(sqrt(p))+1)] ] 
print(listname)

输出结果:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

这里解释一下第三行程序:

这里用到了一个列表推导式语句:

listname = [expression for variable in 对象(if condition)]

 listname:新生成的列表名字

        expression:表达式

        variable:变量名

        (if condition):用于从对象中选择符合要求的列表。

在这里2-99内的所有整数都用形参p表示,for语句遍历了每一个p,在遍历每一个p时进行了下一步操作,也就是之前提到过的指数检验方法,满足检验就会被输出到新的列表中。

 3.求某一区间内质数的个数

mylist=[]
for x in xrange(2002,8008):
 n = 0
 for y in xrange(1,x+1):
 if x % y == 0:
  n = n + 1
 if n == 2 :#既然只能被1或者自己整出,那说明只有2次余数为0的时候才说明这个数是质数
 print x
 mylist.append(x)
print mylist

xrange返回的是一个生成器,不会一下子开辟出所有的内存空间。要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。

 

4.如何优雅地判断一组数据是否全为质数

首先,第一步还是先写一个判断函数即: 

def is_prime(num):

...... 

然后:

if __name__ == '__main__':

当运行“if __name__=='__main__':”语句时,如果当前模块时被直接执行,__name__的值就是__main__,条件判断的结果为True,“if __name__=='__main__':”下面的代码块就会被执行。换句话说当哪个模块被直接执行时,该模块“__name__”的值就是“__main__”。

接下来需要用到异常值处理中的 try...except语句,语法格式为:

try:
    block
Except [typeerror ]:
    deal

 block为我们的程序执行过程中可能会抛出异常的语句,typeerror为错误类型,如果省略就不指定类型,即捕获全部异常,deal为具体的处理语句。

try:
    my_list =[]#首先创建一个空的列表。
    for i in range(4):#这里表示只处理4个数据,可根据实际情况进行修改。
      s = int(input())
      my_list.append(s)#将每一个输入的数据添加到my_list列表中(四个)
    print('my_list当前数据:',my_list)
    for i in my_list:
      assert is_prime(i) == True,'ERROR'#arrest后跟的是表达式
  except AssertionError:#except后跟的是错误类型
  

 中间block部分我们首先创建一个空列表,接下来第一个for循环用来遍历我们列表中的数据,可更改,这里用4。变量s对应我们从键盘上输入的数,一共要输四个,每输一个,回车一次。appen()函数表示依次增添到列表中。

第二个for循环用来遍历我们所输入的每一个数,注意第二个for和第一个for不是嵌套关系。这里用到一个assert语句,简要说明一下:assert在程序调试的时候被称为断言,它的语法结构为:

assert expression[,describe]

  expression为一个表达式,如果为真就不采取操作,反之抛出AssertionError异常。

在这里遍历到第一个不为True,for循环结束,执行deal语句即:

 print('列表中存在非质数')

如果 全遍历完均为True,则输出:

print('列表中全为质数')#判断值为真的的处理语句

完整程序如下(注释均为手打,可能会有不严谨或错误,欢迎批评指点) 

def is_prime(num):#num只是个形参,真正带入函数进行运算的实参是后面input()输入的数
    from math import sqrt#调用math模块中的开方
    for i in range(2, int(sqrt(num) + 1)):#编程思想,遍历2~(num开方后取整+1)(+1不包括)
        if num % i == 0:
            return False
    else:
        return True
if __name__ == '__main__':
  try:
    my_list =[]#首先创建一个空的列表。
    for i in range(4):#这里表示只处理4个数据,可根据实际情况进行修改。
      s = int(input())
      my_list.append(s)#将每一个输入的数据添加到my_list列表中(四个)
    print('my_list当前数据:',my_list)
    for i in my_list:
      assert is_prime(i) == True,'ERROR'#arrest后跟的是表达式
  except AssertionError:#except后跟的是错误类型
    print('列表中存在非质数')#判断为错误后的处理语句
  else:
    print('列表中全为质数')#判断值为真的的处理语句

求采纳!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laborious_XDU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值