
01
引言
今天我们来继续使用一行代码来求解我们常见的基础算法题目,今日的任务是实现一个函数 is_prime(n) ,该函数用于接受一个整数 n作为输入,如果 n为质数,该函数返回True,否则返回False.
02
质数
质数是一个大于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 7983 89 97
03
通用解法
判断质数代码如下:
def is_prime(n):for i in range(2, n//2+1):if n % i == 0:return Falsereturn True
由于质数只能被1和它本身除。因此,我们搜索从2到n//2的每个数字,并检查n是否可以被其中任何一个因数整除即可。如果我们发现存在一个可以被n整除的数,那么我们肯定知道n不是素数,因此立即返回False。如果我们在迭代结束时没有返回False,此时我们知道n是一个素数,此时返回True。
举个栗子:
i n%i2 13 24 15 26 57 38 1end of for loop -> return True
i n%i2 13 0 -> returns False immediately
04
一行代码的解法
既然我们已经有了多行代码的解决方案,接着我们可以尝试把它修改成一行代码的解决方案。我们可观察上述代码,我们无法将上述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)]
05
扩展
有了上述判断一个整数是否为质数的功能,我们可以将其扩展,即扩展成求封闭区间[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)]]
06
总结
本文从质数的定义入手,首先实现了简单的多行代码求解输入是否为质数的问题,接着将其进行改写成一行代码实现的形式,可以加深大家对Python语法的深入了解,并给出了相关代码实现.
您学废了吗?
点击上方小卡片关注我
万水千山总关情,点个在看行不行。

