为什么我的主发电机坏了?

2024-04-18 03:47:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我做的发电机。我应该能产生20000个素数。它应该生成作为参数提供给它的素数。但是,它最多只能执行11次并停止D:。有人能解释一下这里出了什么问题吗?你知道吗

def find_primes(limit):
    prime_holder = [2, 3, 5 ,7]
    divided_pass = 0
    for i in range(11, 20000):
        for j in range(0, len(prime_holder)):
            if i%prime_holder[j] != 0:
                divided_pass += 1
        if divided_pass == len(prime_holder):
            prime_holder.append(i)
            divided_pass = 0
        if len(prime_holder)-1 == limit:
            break
    return prime_holder

my_primes = find_primes(50)
for x in my_primes:
    print x;
raw_input()

Tags: inforlenifmyrangepassfind
2条回答

您应该在每个循环中清除除以\u pass的值:

def find_primes(limit):
    prime_holder = [2, 3, 5 ,7]
    divided_pass = 0
    for i in range(11, 20000):
        for j in range(0, len(prime_holder)):
            if i % prime_holder[j] != 0:
                divided_pass += 1
        if divided_pass == len(prime_holder):
            prime_holder.append(i)
        divided_pass = 0
        if len(prime_holder)-1 == limit:
            break
    return prime_holderdivided_pass

对于每个新的i,需要将divided_pass设置回0。你知道吗

def find_primes(limit):
    prime_holder = [2, 3, 5 ,7]
    for i in range(11, 20000):
        divided_pass = 0
        for j in range(0, len(prime_holder)):
            if i%prime_holder[j] != 0:
                divided_pass += 1
        if divided_pass == len(prime_holder):
            prime_holder.append(i)
        if len(prime_holder)-1 == limit:
            break
    return prime_holder

>>> print find_primes(50)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233]

p.S-列表在Python中是可编辑的,因此不需要执行for j in range(len(...)),只需执行for j in prime_holder: if i % j != 0。在给定的范围内寻找素数有更好的实现(你应该看看那些)。你知道吗

也可以使用for-else构造,如果没有遇到break,则执行else部分。现在你的代码被简化为。你知道吗

def find_primes(limit):
    prime_holder = [2, 3, 5 ,7]
    for i in range(11, 20000):
        for j in prime_holder:
            if i%j == 0:
                break
        else:
            prime_holder.append(i)
        if len(prime_holder)-1 == limit:
            break
    return prime_holder

相关问题 更多 >