Python:while循环在其他内部

时间:2014-03-19 09:15:41

标签: python loops

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]

有人可以告诉我为什么我的其他内容循环在count = 2处停止?换句话说,我的循环中的循环似乎没有循环。如果我可以让我的循环工作,希望这应该打印[2, 3]。任何见解都表示赞赏!

1 个答案:

答案 0 :(得分:2)

假设my_list2(不是列表的一个非常好的名称)应该只包含来自my_list的素数,你需要稍微改变你的逻辑。目前,9正在添加9 % 2 != 0,因为9 % 3。然后测试了break并且循环9x已添加到列表中。

在将每个号码添加到列表中之前,您需要确保每个号码都有因素。

有很多更简洁的方法可以做到这一点,但如果你是python的新手,它们可能会让你感到困惑。这种方式非常接近您的原始尝试。请注意,我已经更改了您的变量名称!我也使用了你传递给get_prime_factors的{​​{1}}(在你的问题中,你将它传递给函数但没有使用它)。我没有使用全局my_list,而是在get_factors内调用了函数get_prime_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))]