我正在努力通过解决Project Euler网站上的问题来学习Python。我确切地知道我想要我的代码做什么,我的方法在纸上工作,但我不能使代码工作。
GitHub链接:https://github.com/albyr/euler-python/blob/master/euler3.py
我创建了两个函数,一个用于计算目标数的因子,另一个用于检查给定数字是否为素数。
# Function that finds all the factors of a given number
def findfactors(n):
# for i in range(1,int(sqrt(n)+1)):
for i in range(1,n+1):
if n/i == int(n/i):
factors.append(i)
# Function that checks if a number is prime
def checkprime(n):
# Trial division
for i in range(2,int(sqrt(n)+1)):
if n/i == int(n/i):
# Number gives a remainder upon division and therefore is not prime
isprime = False
break
else:
isprime = True
if isprime == True:
return True
elif isprime == False:
return False
我确信代码看起来很糟糕的专家。但是如果我使用Python shell它会起作用:
>>> checkprime(9)
False
>>> checkprime(79)
True
>>> checkprime(factors[3])
True
但是当我用F5运行程序时,我得到了:
Traceback (most recent call last):
File "/home/alby/euler-python/euler3.py", line 45, in <module>
checkprime(factors[i])
File "/home/alby/euler-python/euler3.py", line 32, in checkprime
if isprime == True:
UnboundLocalError: local variable 'isprime' referenced before assignment
如果我使用硬编码的数字(例如checkprime(77)
)从程序中调用checkprime函数,我根本就没有输出。我确信这是Python工作方式的基础,我不明白,但我不能为我的生活找到解决方法。
有什么建议吗?
答案 0 :(得分:5)
在你的Github代码中,我们可以看到你正试图调用checkprime(1)
(在你上一次循环的第一次迭代中)。
# Check each factor to see if it is prime or compound
for i in range(0,len(factors)):
print (factors[i])
# Why can't I call checkprime here, like this? It works in the console.
checkprime(factors[i])
但看看你的代码:
def checkprime(n):
# Trial division
for i in range(2,int(sqrt(n)+1)):
if n/i == int(n/i):
# Number gives a remainder upon division and therefore is not prime
isprime = False
break
else:
isprime = True
如果n = 1
,则range(2, int(sqrt(1)+1))
为range(2,2)
为空...所以isprime
永远不会被设置,因为循环体永远不会运行。
请记住,range()
的参数是半开区间 - range(x,y)
是“从x开始并在之前结束的整数Y”。因此range(2,3) = [2]
和range(2,2) = []
。
此处的另一个问题是findfactors()
正在返回1
作为第一个因素 - 这可能不是您想要的:
def findfactors(n):
# for i in range(1,int(sqrt(n)+1)):
for i in range(1,n+1):
对于素数分解检查,您可能希望从2
开始,而不是1
(因为所有内容都可以被1整除)。
此外,此代码是多余的:
if isprime == True:
return True
elif isprime == False:
return False
你真的可以把它写成......
return isprime
或者您可以更好地迈出一步,从不首先使用isprime
- 只需将isprime = True
替换为return True
,将isprime = False
替换为return False
。< / p>
最后,int(n/i)
的简写是n // i
- Python的//
运算符执行整数除法。
答案 1 :(得分:0)
就无输出打印而言,只需使用print(checkprime(77))
代替从F5运行时,您应该获得输出。从调用运行时,python默认不打印任何内容(或者至少只打印最后一个命令)。