2

我正在尝试通过解决 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 工作方式的基本原理,但我终其一生都无法弄清楚是什么。

有什么建议么?

4

2 回答 2

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

If n = 1, thenrange(2, int(sqrt(1)+1))range(2,2)空的...所以isprime永远不会被设置,因为循环体永远不会运行。

请记住,参数range()半开区间 -是“从 x 开始并在 y之前range(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 = Truereturn Trueisprime = Falsereturn False

int(n/i)最后, is的简写n // i- Python 的//运算符进行整数除法。

于 2012-07-13T18:22:18.710 回答
0

在无输出打印方面,只需print(checkprime(77))在从 F5 运行时使用,您应该会得到输出。从调用运行时,python 默认不打印任何内容(或者至少只打印最后一个命令)。

于 2012-07-13T18:21:54.953 回答