Python: else 中的 while 循环
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_factors
的 x
(在你的问题中,你传给了函数但没有使用它)。我没有使用全局的 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
,如果它遍历的所有内容都是 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))]