2013-05-14 6 views
0

나는이 코드를 사용하여 반복적으로 노고를 봤으며 doctest를 전달하는 방법을 알 수 없습니다. 출력은 항상 정답보다 1000 작습니다. 이 코드를 변경하여 원하는 결과를 얻을 수있는 간단한 방법이 있습니까 ?? 내 코드는 다음과 같습니다 파일의파일의 모든 숫자의 합

def sum_numbers_in_file(filename): 
    """ 
    Return the sum of the numbers in the given file (which only contains 
    integers separated by whitespace). 
    >>> sum_numbers_in_file("numb.txt") 
    19138 
    """ 
    f = open(filename) 
    m = f.readline() 
    n = sum([sum([int(x) for x in line.split()]) for line in f]) 
    f.close() 
    return n 

값은 다음과 같습니다

1000 
15000 
2000 
1138 

답변

3

범인은 : 당신이 f.readline()을 수행 할 때

m = f.readline() 

, 그것은 1000을 잃고, 어떤 목록 이해에서 고려되지 않고있다. 따라서 오류.

이 작동합니다 :

def sum_numbers_in_file(filename): 
    """ 
    Return the sum of the numbers in the given file (which only contains 
    integers separated by whitespace). 
    >>> sum_numbers_in_file("numb.txt") 
    19138 
    """ 
    f = open(filename, 'r+') 
    m = f.readlines() 
    n = sum([sum([int(x) for x in line.split()]) for line in m]) 
    f.close() 
    return n 
+0

에 해당 .readline()'? – cHao

+0

음 .. 이제 나는 그것을'readlines()'로 바 꾸었습니다. 원래 코드와 광산의 차이점을 확인하십시오. – karthikr

+0

즉, "단지 readline 호출을 제거하는"방법은 더 간단하고 명확합니다. 또한 대괄호는'sum'을 호출 할 때 불필요하며'with' 블록을 사용하여 파일을 관리하는 것이 더 좋습니다. –

1

당신은 첫 번째 줄을 당겨 m에 보관합니다. 그런 다음 절대 사용하지 마십시오.

+0

이것은 주석이어야합니다. 당신의 대답에 약간의 노력을 기울이십시오. – Droogans

+0

안녕하세요 @Droogans - 이것은 OP의 코드에서 문제의 정확한 요약입니다. –

1

당신은 하나 generator expressionfor -loops을 사용할 수

def sum_numbers_in_file(filename): 
    """ 
    Return the sum of the numbers in the given file (which only contains 
    integers separated by whitespace). 
    >>> sum_numbers_in_file("numb.txt") 
    19138 
    """ 
    with open(filename) as f: 
     return sum(int(x) 
        for line in f 
        for x in line.split()) 

위의 발전기 표현은 왜 당신이 바로`m = f를 제거 할 수

result = [] 
    for line in f: 
     for x in line.split(): 
      result.append(int(x)) 
    return sum(result) 
+0

기술적으로 이것이 여러 줄로 된 이해력입니까? – Droogans

+0

이것은 Python 스타일의 일반적인 노란색 플래그입니다. 걱정할 수도 있고 그렇지 않을 수도 있습니다. http : //google-styleguide.googlecode.com/svn/trunk/pyguide.html? showone = List_Comprehensions # List_Comprehensions – Droogans

+1

@Droogans : 감사합니다. 그걸 지적 해 주려고. 나는 위에서 쓴 것이 그렇게 복잡하다고 생각하지 않는다. 그렇지? 사실 피터 노빅 (Peter Norvig) Google 연구 책임자와 같은 훌륭한 Python 프로그래머는 [문제를 해결하기 위해 긴 멀티 라인 생성기 표현식] (http://www.youtube.com/watch?v=T2H1A65nFyE)을 사용합니다. Google 스타일 가이드가이 사용법에 반대한다고 생각하는 것이 어렵습니다. – unutbu