Python: else 中的 while 循环

2 投票
1 回答
5237 浏览
提问于 2025-04-17 22:56
def is_prime(x):     
    count = 1
    my_list = []
    while count > 0 and count < x:
        if x % count == 0:
            my_list.append(x/count)
        count += 1
    return my_list
my_list = is_prime(18)

def prime(x):

    my_list2 = []
    for number in my_list:
        if number <= 2: 
            my_list2.append(number)
        else:
            count = 2
            while count < number:
                if number % count == 0:
                    break
                else: 
                    my_list2.append(number)
                count += 1
    return my_list2
print prime(18)

我刚开始学习Python,有个很简单的问题。

这个代码输出的是:[9, 3, 2]

有人能告诉我为什么我在else里面的循环在count等于2的时候就停止了吗?换句话说,我的循环里面的循环好像没有继续运行。如果我能让这个循环正常工作,希望它能输出[2, 3]。谢谢大家的帮助!

1 个回答

3

假设 my_list2(这个名字不太好)应该只包含 my_list 中的质数,你需要稍微调整一下你的逻辑。目前,9 被加入了列表,因为 9 % 2 != 0。然后测试 9 % 3 时,循环就停止了,但 9 已经被加入到列表里了。

你需要确保每个数字在加入列表之前没有任何因数。

其实有很多更简洁的方法来做到这一点,但如果你是新手,可能会觉得有点困惑。这种方法和你最初的尝试很接近。注意我已经改了你的变量名!我还利用了你传给 get_prime_factorsx(在你的问题中,你传给了函数但没有使用它)。我没有使用全局的 my_list,而是在 get_prime_factors 中调用了 get_factors 函数。你也可以传入一个列表——我在注释中展示了这样做需要的更改。

def get_factors(x):
    count = 1
    my_list = []
    while count > 0 and count < x:
        if x % count == 0:
            my_list.append(x/count)
        count += 1
    return my_list

# Passing in the number                   # Passing in a list instead
def get_prime_factors(x):                 # get_prime_factors(factors):
    prime_factors = []
    for number in get_factors(x):         #     for number in factors:
        if number <= 2:
            prime_factors.append(number)
        else:
            count = 2
            prime = True
            while count < number:
                if number % count == 0:
                    prime = False
                count += 1
            if prime:
                prime_factors.append(number)

    return prime_factors

print get_prime_factors(18)

输出:

[3, 2]

为了让你了解一些更高级的做法,get_prime_factors 可以简化成这样:

def get_prime_factors(x):
    prime_factors = []
    for n in get_factors(x):
        if n <= 2 or all(n % count != 0 for count in xrange(2, n)):
            prime_factors.append(n)
    return prime_factors

all 是一个内置函数,在这里会非常有用。它会返回 true,如果它遍历的所有内容都是 truexrange(在 Python 3 中是 range)允许你在不手动指定计数器的情况下遍历一系列值。你还可以进一步简化:

def get_prime_factors(x):
    return [n for n in get_factors(x) if n <= 2 or all(n % c != 0 for c in xrange(2, n))]

撰写回答