为什么我的Python函数在控制台中工作,但在代码中调用时却没有?

时间:2012-07-13 18:16:45

标签: python python-3.x

我正在努力通过解决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工作方式的基础,我不明白,但我不能为我的生活找到解决方法。

有什么建议吗?

2 个答案:

答案 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默认不打印任何内容(或者至少只打印最后一个命令)。