2012-09-28 4 views
0

0보다 큰 숫자 만 허용하도록 입력을 제어하려하지만이 텍스트 블록을 테스트 할 때 처음에 잘못된 문자 (문자열, 0 또는 음수) 오류 출력을 수신 한 다음 유효한 값을 입력하면 방금 입력 한 유효한 값 대신 입력 한 첫 번째 값을 반환합니다. 그러면 입력 불일치 또는 비논리적 값으로 인해 나머지 스크립트가 실패합니다. 나는 "return x"주위를 움직이려 고 노력했다. 그러나 은 어느 쪽이라도 똑같이한다.은 두 번째 경우에 "할당 전에 참조 된 변수 x"라고 말합니다.파이썬 3 - 숫자 입력 필터링 문제

def getPrice(): 
    try: 
     x = float(input("What is the before-tax price of the item?\n")) 
     if x <= 0: 
      print("Price cannot be less than or equal to zero.") 
      getPrice() 
     return x 
    except ValueError: 
     print("Price must be numeric.") 
     getPrice() 

def getPrice(): 
    try: 
     x = float(input("What is the before-tax price of the item?\n")) 
     if x <= 0: 
      print("Price cannot be less than or equal to zero.") 
      getPrice() 
    except ValueError: 
     print("Price must be numeric.") 
     getPrice() 
    return x 

나는이 문제를 어떻게 해결할 수 있습니까?

궁금한 점이 있다면, 이것은 학교 과제 일 뿐이며 전체 프로그램을 완전히 완료했지만 디버깅 방법을 알 수는 없습니다.

편집 :

지금은 작업 방법을 가지고

:

def getPrice(): 
    while True: 
     try: 
      x = float(input("What is the before-tax price of the item?\n")) 
     except ValueError: 
      print("Price must be numeric.") 
      continue 
     if x <= 0: 
      print("Price cannot be less than or equal to zero.") 
     else: 
      return x 
      break 

을 원래의 코드 블록을 고정 (하지만 여전히 재귀 사용) : 나는 않을거야

def getPrice(): 
     try: 
      x = float(input("What is the before-tax price of the item?\n")) 
      if x <= 0: 
       print("Price cannot be less than or equal to zero.") 
       x = getPrice() 
     except ValueError: 
      print("Price must be numeric.") 
      x = getPrice() 
     return x 
+1

getPrice() 함수의 기능은 무엇입니까? 아마도 우리는 모든 코드를 보여 주어야 할 것입니다. x는 항상 마지막으로 할당 된 값을 유지합니다. 코드에 한 번만 지정하십시오. 변수 범위를 이해하는 데 어려움을 겪고있는 것 같습니다. – korylprince

+0

죄송합니다. 잊어 버리고 질문에 함수 헤더를 추가했습니다. 오류가 발생하면 다시 시도하기 위해 다시 자체를 참조합니다 (나쁜 실행인지 아닌지 확실하지 않음). – Sparx

+0

코드의 형식이 잘못 지정된 것 같지만 요점을 얻습니다. 당신은 재귀를 사용하고 있습니다. 어떤 경우에는 괜찮습니다.하지만이 경우에는 스택 제한을 초과 한 후 사용자로부터 잘못된 입력이 프로그램을 중단시킬 수 있기 때문에 실제로는 그렇지 않습니다. – korylprince

답변

0

을 숙제이기 때문에 대답을 철자하는 것이지만, 나는 올바른 방향으로 당신을 가르 칠 것입니다. 먼저 재귀 대신 while 루프를 사용하는 것이 좋습니다.

코드 같은 것을 볼 수 있습니다

while True: 
    try: 
     x = <get input> 
     if input is good: 
      break 
     else: 
      <print error> 
    except badstuff: 
     <Print error> 
     next #redundant in this case as we'd do this anyways 

둘째, 당신이 지금 가진 변수 범위와 함께 할 모든 것을 갖추고있는 문제. 잘못된 입력이 발생하면 함수를 다시 호출하지만 출력은 수행하지 않습니다.

첫 번째 함수 호출의 x는 두 번째 함수 호출의 x와 완전히 별개임을 기억하십시오.

그래서 재귀를 사용하려는 경우 x 값을 "체인 백업"으로 전달하는 방법을 알아야합니다.

+0

x 값 "전달 체인"을 전달하는 방법을 모르겠습니다. 그러나 while 루프를 사용하면 try 및 except 블록을 유지해야합니까? – Sparx

+0

예, try except 절을 유지해야합니다.알 수없는 데이터를 파싱하는 경우 항상이를 원합니다. 그러나 함수를 호출하는 대신 예외에서 next 키워드를 사용하여 다음 반복으로 건너 뜁니다. – korylprince

+0

체인을 지나가는 것에 관해서는 getPrice를 호출 할 때 아무 것도 지정하지 않았기 때문에 출력이 사라집니다. 상위 함수에 출력을 제공하려면 변수에 변수를 지정해야합니다. 따라서이 경우 x = getPrice()를 작성합니다. 이제 x는 새로운 값으로 업데이트됩니다. 새로운 x가 나오기 전에 당신은 결코 그것을 지나치지 않았기 때문에 죽었습니다. – korylprince