【发布时间】:2015-05-04 21:49:36
【问题描述】:
我编写了一个初学者程序,旨在查找和打印任意数的质因数:
def is_prime(n):
if n == 3:
return True
elif n == 4:
return False
else:
n = int(n**0.5)+1
for i in range(2,n):
if n % i == 0:
return False
return True
def prime_factors(n):
for i in range(2,n):
if n % i == 0:
x = i
primes.append(x)
y = n / x
return y
break
primes = []
def main(y):
while not is_prime(y):
y = prime_factors(y)
primes.append(y)
print(primes)
以下是程序运行的示例,让我感到困惑:
main(625)
[5, 5, 5, 5]
...
main(160)
[160]
...
main(6)
[6]
...
main(1007)
TypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'float'
有些输入有效,有些则无效。我不知道为什么。我也不知道如何解决这个错误。请帮忙。谢谢。
【问题讨论】:
-
你的代码让我很困惑。为什么
prime_factors不检查每个因素is_prime?为什么你有一个primes的固定列表?我不明白为什么你会期望这会起作用。 -
但是特别是......如果
n%i从不等于零,那么它返回分配给y的None。is_prime(None)尝试获取平方根但失败,因为None**0.5 == ?例如prime_factors(5)将返回 None -
break在return之后立即做什么? -
@Joel 照亮了我的愚蠢。不知道
return休息。 但是,这是我的第一个程序。所以我并不觉得太糟糕。 -
只是为了说明问题所在:在
n=int(n**0.5)+1语句中,您更改了n的值。但是两行之后你检查是否n%i==0。您希望它是旧的n。所以至少你需要使用m=int(n**5)+1,但更好的是给它一个更具描述性的名称。现在的角色很便宜。