Python一行代码求解质数

1.引言

今天我们来继续使用一行代码来求解我们常见的基础算法题目,今日的任务是实现一个函数 is_prime(n) ,该函数用于接受一个整数 n 作为输入,如果 n为质数,该函数返回True,否则返回False.

2. 质数

质数的官方定义为:质数是一个大于1的整数,其因子只有1和它本身。换句话说,质数必须是2或更大的整数,并且不能被除1和它本身之外的任何其他数字整除。

下面是1到100之间的素数列表:

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

我们的目标是使用一行代码来实现一个的函数是is_prime(n), 它接受输入参数n,如果n是质数,则返回True,否则返回False

3. 通用解法

在介绍一行代码的解决方案之前,我们先来介绍该问题的多行代码解法。
判断质数代码如下:

def is_prime(n):
    for i in range(2, n//2+1):
        if n % i == 0:
            return False
    return True

解释如下:

由于质数只能被1和它本身除。因此,我们搜索从2到n//2的每个数字,并检查n是否可以被其中任何一个因数整除即可。如果我们发现存在一个可以被n整除的数,那么我们肯定知道n不是素数,因此立即返回False。如果我们在迭代结束时没有返回False,此时我们知道n是一个素数,此时返回True。

举个栗子:

上述解释代码一大堆,不如直接来看个例子吧…

我们来看 n=17的情形:

i    n%i
2    1 
3    2
4    1
5    2
6    5
7    3
8    1end of for loop -> return True

接着,我们来看 n=21的情形:

i    n%i
2    1
3    0 -> returns False immediately

4. 一行代码的解法

既然我们已经有了多行代码的解决方案,接着我们可以尝试把它修改成一行代码的解决方案。我们可观察上述代码,我们无法将上述for循环转换为一行代码的列表生成式,因此我们需要将其进行转换,代码如下:

def is_prime(n):
    remainders = []
    for i in range(2, n//2+1):
        remainders.append(n%2)
    return 0 not in remainders

在上述函数中,我们生成从2到n//2的所有数字,并将其余数存储在余数列表中。如果n是质数,那么列表中不应该有0。
经过上述转换,我们可以很方便地将其修改成一行代码的形式,如下:

def is_prime(n):return 0 not in [n%i for i in range(2,n//2+1)]

5. 扩展

有了上述判断一个整数是否为质数的功能,我们可以将其扩展,即扩展成求封闭区间[a,b]之间的所有质数,
多行代码实现如下:

def gen_prime(a, b):
    output = []
    for n in range(a, b+1):
        if is_prime(n):
            output.append(n)
    return output

修改成一行代码的形式,代码如下:

def gen_prime(a, b): return [n for n in range(a,b+1) if 0 not in [n%i for i in range(2, n//2+1)]]

6. 总结

本文从质数的定义入手,首先实现了简单的多行代码求解输入是否为质数的问题,接着将其进行改写成一行代码实现的形式,可以加深大家对Python语法的深入了解,并给出了相关代码实现.

您学废了吗?

在这里插入图片描述
关注公众号《AI算法之道》,获取更多AI算法资讯。

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赵卓不凡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值