2012-07-13 4 views
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 

나는 코드가 끔찍한 것처럼 보입니다. 그러나 내가 파이썬 쉘 사용하는 경우 작동합니다

>>> 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)) 출력이 전혀 없습니다. 나는 이것이 내가 이해하지 못하는 파이썬이 작동하는 방식에 대해 기본적인 것이지만, 나는 내 삶을 위해 무엇을 해결할 수 없는지 확신한다.

제안 사항?

+0

아무 것도 인쇄하지 않기 때문에 결과물이 나오지 않습니다. 콘솔과 달리 최상위 함수 호출은 정상적으로 실행되면 결과를 자동으로 인쇄하지 않습니다. – Amber

+0

글쎄, 오류가 아주 분명합니다 : 루프가 입력되지 않으면 초기화되지 않은 변수를 읽는 것입니다. 일반적으로 체크 프라임을 작성하는 것은 매우 이상한 방법입니다. 루프를 통과하면 true를 반환하고 루프에서는 false를 반환합니다. – Voo

답변

5

Github 코드에서 (마지막 루프를 통해 첫 번째 반복에서)을 호출하려고합니다.

# 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)) 그렇게 isprime 설정 결코 극복 비어 range(2,2)은 ...입니다.

range()에 대한 인수가 반 개방 간격 있음을 알아 두셔야합니다 - range(x,y)는 "정수 X에서 시작 이전 Y 종료"입니다. 따라서 range(2,3) = [2]range(2,2) = [].

여기에 또 다른 문제는 첫 번째 요인으로 1을 반환 findfactors() 것입니다 - 이것은 당신이 원하는 아마되지 않습니다 :

소인수 분해 검사에
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 Falsereturn Trueisprime = False으로 isprime = True를 교체합니다.

마지막으로 int(n/i)의 축약어는 n // i입니다. 파이썬의 // 연산자는 정수 나누기를 수행합니다.

+0

놀라운 대답입니다, 앰버. 고맙습니다. – Alby

+0

당신을 가장 환영합니다. :) – Amber

0

출력 인쇄가 없다는 측면에서 F5에서 실행할 때 print(checkprime(77))을 사용하면 결과물을 얻을 수 있습니다. 호출로 실행할 때, python은 아무것도 인쇄하지 않거나 적어도 마지막 명령 만 인쇄합니다.

관련 문제