Python 获取随机数列表中的第一个素数
我在玩Python shell,我相信这是一个非常简单的函数实现,它只返回100个随机生成的数字列表中的第一个素数(其值介于0和99之间,包括0和99)。代码如下:Python 获取随机数列表中的第一个素数,python,python-3.x,primes,Python,Python 3.x,Primes,我在玩Python shell,我相信这是一个非常简单的函数实现,它只返回100个随机生成的数字列表中的第一个素数(其值介于0和99之间,包括0和99)。代码如下: >>> def is_prime(n): if n < 2: return False elif n == 2: return True for i in range(2, n): if n % i == 0: r
>>> def is_prime(n):
if n < 2:
return False
elif n == 2:
return True
for i in range(2, n):
if n % i == 0:
return False
return True
>>> from random import randint
>>> numbers = []
>>> for i in range(0, 100):
numbers.append(randint(0, 99))
>>> def get_first_prime(values):
temp = []
for i in values:
if is_prime(i):
temp.append(i)
return temp[0]
>>> get_first_prime(numbers)
>>定义为素数(n):
如果n<2:
返回错误
elif n==2:
返回真值
对于范围(2,n)内的i:
如果n%i==0:
返回错误
返回真值
>>>从随机导入randint
>>>数字=[]
>>>对于范围(0,100)内的i:
数字。追加(randint(0,99))
>>>def get_first_素数(值):
温度=[]
对于我而言,价值观:
如果是_素数(i):
临时附加(i)
返回温度[0]
>>>获取第一个素数(数字)
我希望这个函数严格地只返回第一个素数。我的实现使用一个助手列表来缓存所有素数,然后简单地返回第一个索引处的元素。它是有效的,但我不相信它是一个好的。我相信有一种更有效的方法可以做到这一点,它不需要扫描整个列表,但我似乎还没有想到一种方法
有什么更好的选择
def get_first_prime(values):
for i in values:
if is_prime(i):
return i
这样,一旦你找到一个素数,你就不会继续搜索了。如果没有找到素数,函数将隐式返回
None
。是的,您甚至不需要生成所有随机数的列表,您可以在生成每个随机数时对其进行测试,并在找到一个随机数后立即返回
from random import randint
import math
def is_prime(n):
if n < 2:
return False
elif n == 2:
return True
for i in range(2, int(math.sqrt(n) + 1)):
if n % i == 0:
return False
return True
def get_first_prime(number):
for i in range(number + 1):
n = randint(0, 99)
if is_prime(n):
return n
get_first_prime(100)
来自随机导入randint
输入数学
def是_prime(n):
如果n<2:
返回错误
elif n==2:
返回真值
对于范围(2,int(math.sqrt(n)+1))内的i:
如果n%i==0:
返回错误
返回真值
def get_first_素数(数字):
对于范围内的i(数字+1):
n=randint(0,99)
如果是_素数(n):
返回n
获取第一个素数(100)
你说得对。您的代码不仅具有更高的时间复杂度(即使在找到第一个素数之后,也会遍历所有列表元素)和空间复杂度(临时列表以保存所有素数),而且当列表中没有素数时,还存在抛出索引器的风险
因此,您可以通过以下方式进行修复:
def get_first_prime(values):
for i in values:
if is_prime(i):
return i
注意,当输入中没有素数时,return
语句将永远不会执行,这意味着没有显式返回;在这种情况下,Python返回None
。因此,如果您选择,您可以在for
循环之外的函数末尾返回您选择的值,以指示“未找到”
def get_first_prime(values):
for i in values:
if is_prime(i):
return i
return -1
处理这个问题的Pythonic方法是引发一个异常,并让函数的调用方处理该异常
prime = next(filter(isprime, numbers))
瞧。哦,哇,我知道有一种更不复杂的方式。谢谢你,先生!只是一个小建议:当检查整除性以测试可疑素数时,不需要检查高于
sqrt(n)
的数字。通过该修改,中的for
是素数(n)
函数看起来像for i在范围(2,int(sqrt(n)):…
(您需要从math import sqrt获得可用的sqrt()
函数)。相关: