在随机数列表中获得第一个素数

时间:2016-04-26 05:40:09

标签: 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:
            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)

我希望此函数严格返回第一个素数。我的实现使用一个帮助器列表来缓存所有素数,然后简单地在第一个索引处返回该元素。它有效,但我不相信它是一个好的。我确信有一种更有效的方法,不需要扫描整个列表,但我似乎还没想到。

有哪些更好的选择?

4 个答案:

答案 0 :(得分:3)

def get_first_prime(values):
    for i in values:
        if is_prime(i):
            return i

这样,一旦找到素数,就不会继续搜索。如果没有找到素数,该函数会隐式返回None

答案 1 :(得分:1)

是的,您甚至不需要生成所有随机数的列表,您可以在生成它们时对每个随机数进行测试,并在找到后立即返回。

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)

答案 2 :(得分:0)

你是对的。您的代码不仅具有更多的时间复杂度(即使在找到第一个素数后运行所有列表元素)和空间复杂度(临时列表以保存所有素数),但是当没有时,也存在抛出IndexError的风险列表中的素数。

所以你可以用以下方式修补它:

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处理这个问题的方法是引发异常并让函数的调用者处理异常。

答案 3 :(得分:0)

prime = next(filter(isprime, numbers))

请参阅find first element in a sequence that matches a predicate