2017-05-03 7 views
0

수레 , 얻을 수내가이 같은 형식 TXT 파일에서 최소 및 최대 값 (수레)를 찾기 위해 노력하고있어 문자열 txt 파일에서 최소 및 최대를 찾기 위해 노력하고

TypeError: 'float' object is not iterable 

여기 내 코드는 문제를 알아낼 수 없습니다. 당신이 다음 하나를 읽을 때

def main(): 
    #open gradebook 
    gradebook_file = open ('gradebook.txt', 'r') 

    #define name 
    name = gradebook_file.readline() 

    while name != '': 
     grade = float (gradebook_file.readline()) 

     name = name.rstrip ('\n') 

     print ('Name:', name) 
     print ('Grade:', grade) 

     name = gradebook_file.readline() 

    #append numbers in gradebook 
    data = [] 
    for lines in gradebook_file: 
     data.append (grade) 

    #define min and max values 
    _min = min (grade) 
    _max = max (grade) 

    #print contents 
    print ('The minimum average grade was a(n) ' + str (_min) + '.') 
    print ('The maximum average grade was a(n) ' + str (_max) + '.') 

    #close the gradebook 
    gradebook_file.close() 

#call main 
main() 
+1

'grade'는 float이므로 float에 대해'min'과'max'가 무엇을 기대하는지 모르겠지만 오류가 말하는 것처럼 float은 반복 가능하지 않습니다. 제쳐두고,'for' 루프,'grapebook_file에있는 라인들 '은 이미 파일 핸들러를 다 써 버렸기 때문에 작동하지 않습니다. 파일의 처음으로 되돌아 가거나 더 좋은 방법은'with' 블록을 사용하여 파일을 반복 할 때마다 파일을 열어야합니다. –

답변

0

당신은 오히려 min/max와 함께 사용하기위한 순서에 저장하는 것보다, 각 grade를 폐기하고 있습니다. 따라서 마지막으로 본 등급의 최소값과 최대 값을 계산하려고합니다. 이는 무의미합니다 (단일 값이 아닌 값 컬렉션의 최소값과 최대 값을 계산합니다). 가는 동안 성적을 유지하거나 최소 및 최대 (메모리 사용량은 적지 만 잘못 될 수있는 맞춤 코드가 더 많이 필요함)를 유지해야합니다.

당신은, 모든 성적을 저장 이런 식으로 뭔가를 시도하려는 경우

from future_builtins import map, zip # Required on Python 2 for lazy map/zip 

def main(): 
    #open gradebook using with statement, so it's closed automatically/predictable 
    with open('gradebook.txt') as gradebook_file: 
     data = [] 

     # Pair your lines up automatically with zip 
     # and convert grades to floats automatically with map 
     for name, grade in zip(gradebook_file, map(float, gradebook_file)): 
      name = name.rstrip('\n') 

      print('Name:', name) 
      print('Grade:', grade) 
      data.append(grade) # Store for later 

    #define min and max values 
    _min = min(data) 
    _max = max(data) 

    #print contents 
    print('The minimum average grade was a(n) {}.'.format(_min)) 
    print('The maximum average grade was a(n) {}.'.format(_max)) 

#call main 
if __name__ == '__main__': 
    main() 

모든 성적을 저장하는 data을 사용하는 대신 단지 얻기 위해 그들 중 두 사람은 대체하는 것입니다 :

data = [] 

:

_min, _max = float('inf'), float('-inf') # Initial values; will be replaced immediately 

는 replacin하여 최소 및 최대 값을 계속 실행 g :

data.append(grade) # Store for later 

과 :

_min = min(_min, grade) # Or faster but more verbose: if grade < _min: _min = grade 
_max = max(_max, grade) # Or faster but more verbose: if grade > _max: _max = grade 

및 제거 :

_min = min(data) 
_max = max(data) 

더 이상 만들거나 data을 채울 수 있기 때문이다. 이러한 접근 방식은 모든 성적을 저장하고 두 번 스캔하는 것보다 실제로 한 번만 스캔해야하고 전혀 저장하지 않아도되는 엄청나게 많은 인풋을 필요로한다는 것을 의미합니다. 성능 측면에서 볼 때, 입력 내용이 너무 커서 메모리가 부족한 경우가 아니라면 (문제 추적 프로그램에서는 불가능할 수 있습니다.) 문제가되지는 않습니다.