Loops 在Python中查找列表中素数的和

Loops 在Python中查找列表中素数的和,loops,python-3.x,math,Loops,Python 3.x,Math,我试着把这个问题作为练习,但我被卡住了。我会尽可能精确地回答 我想用列表作为输入来求素数的和 假设给我的函数的输入是一个类似=[17,51,29,39]的列表,那么它应该返回46作为17+29=46的答案 以下是我可以编写的代码: def sumprimes(l): sum=0 for value in l: for i in range(1,float((value)/2)): if value%i==0:

我试着把这个问题作为练习,但我被卡住了。我会尽可能精确地回答

我想用列表作为输入来求素数的和

假设给我的函数的输入是一个类似=[17,51,29,39]的列表,那么它应该返回46作为17+29=46的答案

以下是我可以编写的代码:

def sumprimes(l):
    sum=0
    for value in l:
        for i in range(1,float((value)/2)):
            if value%i==0:
                      sum+=value     
    print(sum) 
注意:在传递列表时,程序应该工作。我还没有写这部分


提前感谢

您的代码的问题是您使用的是带浮点值的
范围
。 这里真正需要的是整数除法。在Python 3中,这是
/
操作符:

def sum_primes(l):
    total = 0
    for value in l:
        for i in range(2, value // 2):
            if value%i == 0:
                break
        else:
            total += value     
    return total

此外,您还需要检查值是否可以被除1和自身之外的每个数字整除。所有数字都可以被1整除。因此,从2开始计算范围。此外,不是素数的是可除的数,因此在for循环中添加一个else子句,该子句仅在for循环完成且未中断时执行,即,您选中的任何数都不能除值,因此值为素数

代码的问题在于,您使用的是带浮点值的
range
。 这里真正需要的是整数除法。在Python 3中,这是
/
操作符:

def sum_primes(l):
    total = 0
    for value in l:
        for i in range(2, value // 2):
            if value%i == 0:
                break
        else:
            total += value     
    return total

此外,您还需要检查值是否可以被除1和自身之外的每个数字整除。所有数字都可以被1整除。因此,从2开始计算范围。此外,不是素数的是可除的数,因此在for循环中添加一个else子句,该子句仅在for循环完成且未中断时执行,即,您选中的任何数都不能除值,因此值为素数

您最好创建一个函数来测试数字是否是@wim所说的素数

def is_prime(n):
    if n < 2:
        return False
    elif n <= 3:
        return True
    elif n % 2 == 0:
        return False

    # round up the sqrt of n
    length = int(n**.5) + 1  # n**.5 is equal to sqrt(n)
    for i in range(3, length, 2):
        if n % i == 0:
            return False

    return True

您最好创建一个函数来测试数字是否是@wim所说的素数

def is_prime(n):
    if n < 2:
        return False
    elif n <= 3:
        return True
    elif n % 2 == 0:
        return False

    # round up the sqrt of n
    length = int(n**.5) + 1  # n**.5 is equal to sqrt(n)
    for i in range(3, length, 2):
        if n % i == 0:
            return False

    return True

这是您的查询的解决方案

def sumprimes(l):
primeNum = []
for item in l:
    is_prime = True
    if(item >= 2):
        maxInt = int(item ** 0.5) + 1
        for i in range(2, maxInt):
            if(item % i == 0):
                is_prime = False
                break
        if(is_prime):
            primeNum.append(item)
return(sum(primeNum))

print(function([-3,1,6]))

这是您的查询的解决方案

def sumprimes(l):
primeNum = []
for item in l:
    is_prime = True
    if(item >= 2):
        maxInt = int(item ** 0.5) + 1
        for i in range(2, maxInt):
            if(item % i == 0):
                is_prime = False
                break
        if(is_prime):
            primeNum.append(item)
return(sum(primeNum))

print(function([-3,1,6]))

为什么不先创建一个单独的函数来判断一个数字是否为素数。为什么不先创建一个单独的函数来判断一个数字是否为素数。这样可以提高效率<代码>类iPrime:;定义初始值(自):;self.prime_set=set([2]);def是_prime(自,n);如果在self.prime_集合中为n:返回true;#2总是在集合中,所以这里的偶数都是非素数;如果不是n%2:返回false;长度=int(n**.5)+1#n**.5等于sqrt(n);对于范围(3,长度,2)内的i:;如果n%i==0:;返回False;自素数集加(n);返回True这是一个简单的集合添加,用于存储以前找到的素数。这就省去了重新生成它们的麻烦。另一种方法是生成所有的素数,直到值。这允许进行两个进一步的优化:1)如果该值不在集合中,但集合中的值大于该值,则该值不是素数。2) 对于大于最大素数的值,您只需对已知素数进行测试,而不是对所有达到该值的奇数进行测试。这对于单个调用来说效率较低,但对于提问者提出的对is_prime()的多次调用来说效率要高得多。您可以使其更有效<代码>类iPrime:;定义初始值(自):;self.prime_set=set([2]);def是_prime(自,n);如果在self.prime_集合中为n:返回true;#2总是在集合中,所以这里的偶数都是非素数;如果不是n%2:返回false;长度=int(n**.5)+1#n**.5等于sqrt(n);对于范围(3,长度,2)内的i:;如果n%i==0:;返回False;自素数集加(n);返回True这是一个简单的集合添加,用于存储以前找到的素数。这就省去了重新生成它们的麻烦。另一种方法是生成所有的素数,直到值。这允许进行两个进一步的优化:1)如果该值不在集合中,但集合中的值大于该值,则该值不是素数。2) 对于大于最大素数的值,您只需对已知素数进行测试,而不是对所有达到该值的奇数进行测试。这对于单个调用来说效率较低,但是对于提问者提出的对is_prime()的多次调用来说效率要高得多。对于给定的列表分区,通过使用筛选函数和应用sum()函数添加新列表中的所有元素,基于prime(n)对列表进行分区。对于给定的列表分区,基于prime(n)对列表进行分区通过使用filter函数和apply sum()函数将所有元素添加到新列表中。