2012-07-13 69 views
2

我試圖通過解決Project Euler網站上的問題來學習Python。我確切地知道我想要我的代碼做什麼,並且我的方法可以在紙上工作,但我無法使代碼正常工作。爲什麼我的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外殼:

>>> 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功能在程序中使用硬編碼號(例如checkprime(77))我根本沒有輸出。我確定這是關於Python工作方式的一個基本的東西,我不明白,但我不能爲我的生活制定出什麼。

有什麼建議嗎?

+0

由於不打印任何內容,因此不會輸出任何內容 - 與控制檯不同,頂層函數調用在正常運行時不會自動打印結果。 – Amber 2012-07-13 18:19:14

+0

那麼錯誤是非常明顯的:如果從未輸入循環,你正在讀取一個非初始化變量。通常這是一個非常奇怪的方式來編寫checkprime開始,只是如果你通過循環和循環中的錯誤返回true。 – Voo 2012-07-13 18:19:32

回答

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和結束Ÿ整數」。因此,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 - 只是return Trueisprime = Falsereturn False取代isprime = True

最後,int(n/i)的簡寫爲n // i - Python的//運算符進行整數除法。

+0

這是一個了不起的答案,琥珀。謝謝。 – Alby 2012-07-14 19:13:03

+0

非常歡迎。 :) – Amber 2012-07-14 20:18:12

0

就無輸出打印而言,只需使用print(checkprime(77))而不是從F5運行時,您應該獲得輸出。當從一個調用運行時,默認情況下,python不會打印任何東西(或者至少只打印最後一個命令)。

相關問題