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]
。任何见解都表示赞赏!
答案 0 :(得分:2)
假设my_list2
(不是列表的一个非常好的名称)应该只包含来自my_list
的素数,你需要稍微改变你的逻辑。目前,9
正在添加9 % 2 != 0
,因为9 % 3
。然后测试了break
并且循环9
但x
已添加到列表中。
在将每个号码添加到列表中之前,您需要确保每个号码都有无因素。
有很多更简洁的方法可以做到这一点,但如果你是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
,则返回true
。 xrange
(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))]