Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取随机数列表中的第一个素数_Python_Python 3.x_Primes - Fatal编程技术网

Python 获取随机数列表中的第一个素数

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

我在玩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:
            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()
函数)。相关: