2017-09-20 1 views
1

이번 학기에 Python을 배우고 있으며 이것이 나의 숙제입니다.Python 2에서 입력을 사용한 후의 NameError

내 코드가 잘못된 이유는 누구에게 말해 줄 수 있습니까?

질문 :
당신이하는이 평균을 인쇄해야 지적, 컴퓨터 과학 성적을 알고, 그래서 지속적으로 입력 한 "중지"할 때까지 표준 입력에 0에서 100 사이의 성적을 소요하는 프로그램을 작성하려면 표준 출력으로.

MY CODE : 나는이 코드를 실행하면

total=0 
count=0 

while True: 

    grade=input("Enter Your Grades between 0 and 100 [put 'stop' when done]:") 

    if grade<0 or grade>100: 
     print("Invalid Input") 
     continue 

    elif grade=="stop": 
     break 

    else: 
     count+=1 
     total+=grade 

print "Your Average Grade is:"+format(total/count,'.2f') 

는, 파이썬은 저에게이 메시지를주고 유지 : 당신은 어디 input 파이썬 2에서이 프로그램을 실행하고

Screenshot

+0

뿐만 아니라 : 당신이 값을 인쇄하는 두 가지 방법을 사용할 수 있습니다 마지막 줄에

마지막 인쇄 기능 호출 주변의 괄호 원본에서 그러한 실수가 있습니까? – synchronizer

+0

파이썬 2 또는 3 코드입니까? 파이썬 3에서는 괄호없이'print'를 사용할 수없고 파이썬 2에서는'input' 대신'raw_input'을 사용해야합니다. – skrx

+0

또한 문자열 (input()에서 반환 됨)을 int와 비교합니다. – synchronizer

답변

0

사용자 입력을 평가합니다. 따라서 "stop"을 입력하면 파이썬은 존재하지 않는 변수 stop을 찾고 NameError을 발생시킵니다.

더 많은 문제가 있으며 코드를 재구성해야합니다. 가장 먼저해야 할 일은 inputraw_input으로 변경하여 사용자 입력을 문자열로 반환하는 것입니다. 그런 다음 사용자가 "중지"를 입력했는지 확인하고 그렇지 않으면 입력 문자열을 int로 변환 한 다음 counttotal을 증가시켜야합니다. 총 = 0 카운트 = 0

while True: 
    grade = raw_input("Enter Your Grades between 0 and 100 [put 'stop' when done]:") 
    if grade == "stop": 
     break 
    # Skip if the string can't be converted to an int. 
    if not grade.isdigit(): 
     print("Invalid Input") 
     continue 
    # Now convert the grade to an int. 
    grade = int(grade) 

    if grade < 0 or grade > 100: 
     print("Invalid Input") 
     continue 
    else: 
     count += 1 
     total += grade 

# Convert total to a float for true division. 
print "Your Average Grade is: {:.2f}".format(float(total)/count) 
+0

설명해 주셔서 감사합니다. 파이썬 2에서도 몇 가지 작업을 배웠다. BTW, 파이썬 3을 다시 설치했습니다. –

+0

아, 좋습니다. 파이썬 3에서'input'은'raw_input'처럼 작동합니다 (문자열을 반환하고 입력을 평가하지 않습니다 (안전하지 않을 것입니다)). 그리고'/'는 "true division"(float division)을 수행하므로 변환 할 필요가 없습니다 하나의 피연산자를 부동 소수점에 쓰고'total/count'라고 쓸 수 있습니다. 또한 문자열을 int 및 float으로 변환하기 위해 일반적으로 ['try : ... except ValueError :'] (https://docs.python.org/3/tutorial/errors.html#handling-exceptions) 절을 사용합니다. 오류를 방지하십시오. – skrx

0

변경 input

grade = raw_input("Enter Your Grades between 0 and 100 [put 'stop' when done]:") 
0

당신은 파이썬 2.7을 사용하는 raw_input에, 그래서 raw_input 대신 input 사용합니다. 후자는 입력을 평가하므로 5 + 2'5 + 2' 대신 7을 반환합니다. stop을 입력하면 존재하지 않는 변수로 stop을 평가하려고 시도합니다.

다른 참고 totalcount 정도로 total/count은 (파이썬 3 플로트 결과를 제공) 파이썬 2의 정수 나눗셈을 수행하고, 양의 정수이다. 부동 소수 평균을 원하면 float(total)/count을 사용하십시오. 부동 변수 응답을 얻으려면 변수 중 하나가 부동이어야합니다.

또한 grade 문자열 것을 발견, 그래서 시험 'stop' 먼저, 다음 등급 grade = int(grade)을 테스트하기 위해 int로 변환 할 수 있습니다. 오류 처리에 대해 생각할 수도 있습니다. 사용자가 10a을 입력하면 어떻게 될까요?

0

먼저 문자열 정지를 평가할 수, raw_input로 입력을 캡처하려고 :

total = 0 

count = 0 

while True: 

    grade = raw_input("Enter Your Grades between 0 and 100 [put 'stop' when done]:") 

    if grade == "stop": 
     break 
    if grade.isdigit(): 
     grade = int(grade) 
     if grade < 0 or grade > 100: 
      print("Invalid Input") 
      continue 
     else: 
      count += 1 
      total += grade 

if count == 0: 
    print "Empty values" 
else: 
    print "Your Average Grade is: %.2f" % (float(total)/count) 

내가 올바른 실행을위한 다른 조건을 추가, 예를 if grade.isdigit():를 들어, 라인을 확인 입력 값이 숫자인지 확인을 위해 이 평가에서는 모든 수학 계산과 함께 정상적으로 작업 할 수 있습니다.

count == 0: 첫 번째 반복에서 사용자가 stop을 쓰면 오류 나누기가 0으로 나옵니다.

print "Your Average Grade is: %.2f" % (float(total)/count) 

또는 당신은 while 루프에서 들여 쓰기 (보통 4 공간)이 누락

print "Your Average Grade is: {:.2f}".format(float(total)/count) 
+0

downvote? 왜 ? 아마 많은 코드를 추가하는 것이 좋지 않을까요? – kip

+0

아마도 우리가 피연산자 중 하나를 실수로 나누기 위해 float로 바꾸는 것을 잊었던 것일까? 설명없이 downvote하는 것은 정말로 불행합니다. – skrx

+0

설명해 주셔서 감사합니다. 파이썬 3을 다시 설치했다. –