2012-11-26 3 views
-2

코드는 매우 간단합니다. 그러나 프로그램의 주요 부분에서 무한히 첫 번째 예외를 제공합니다. 사용자 입력을 묻지 않고도 raw_input - 의 첫 번째 입력에서 사용해야한다고 가정합니다. 일반적인 언어의 좋은 이해와 초보자 - 어떤 아이디어? 감사왜 파이썬에서 raw_input으로 무한 루프가 발생합니까?

import re,sys 

#program to take details of people name, address and telephone number from user 
#user must specify number of people first 

class details: 
    def __init__(self,name=None,address=None,tel=None): 
     self.name=name 
     self.address=address 
     self.tel=tel 

    def changeAttribute(self,name=None,address=None,tel=None): 
     if name!=None: 
      self.name=name 
     if address!=None: 
      self.address=address 
     if tel!=None: 
      self.tel=tel 



class main(): 

    peopleList =[] 
    a=1 

    while a==1:  
     try: 

      numOfPeople = raw_input("enter number of people:") 
      if re.search('[^0-9\n]', numOfPeople): 
       raise Exception 
     except (Exception): 
      print ("illegal input ,must only be numbers - Please try again") 
     else: 
      numOfPeople=str(numOfPeople) 
      a=0 

    for i in range(0,numOfPeople): 
     x=1 
     while x==1: 
      try:  

       name=raw_input("Please enter name") 
       if re.search('[^a-zA-Z\n]',name): 
        raise Exception 
      except (Exception): 
       print("illegal name - Please use only letters") 
      else: 
       peopleList.extend(details(name)) 
       x=0 

     x=1  
     while x==1: 
      try:  

       address=raw_input("Please enter address") 
       if re.search('[^a-zA-Z\n]',address): 
        raise Exception 
      except (Exception): 
       print("illegal name - Please use only letters") 
      else: 
       peopleList[-1].changeAttribute(None,address,None) 
       x=0 

     x=1  
     while x==1: 
      try:  

       tel=raw_input("Please enter telephone number") 
       if re.search('[^0-9]',tel): 
        raise Exception 
      except (Exception): 
       print("illegal name - Please use only numbers") 
      else: 
       peopleList[-1].changeAttribute(None,address,None) 
       x=0 
+5

왜 메소드 정의가없는'class main()'을 가지고 있습니까? 그것은 대신 함수 여야 하는가? –

+3

"프로그램의 주요 부분에서 첫 번째 예외"란 무엇입니까? 실제 오류 메시지를 게시하십시오. – BrenBarn

+1

^당신은 다른 파이썬 사용자가 읽을 수 있도록 당신의 클래스에 UsingCamelCase라는 이름을 붙여야한다. 그냥 문제가되지 않습니다. 그냥 –

답변

1

우선, 나는 당신의 코드에 대해 중요한 피드백을 꽤 많이 줄거야. 제발 악의적 인 코딩을 위해 당신을 학대하기 위해 이것을하지는 않습니다. 나는 만을 가르치고 있습니다., 당신이 한 일을 더 잘 수행 할 방법을 보여 주려고합니다.

아래에 나열 할 내용을 수행하면 문제가 해결되지만 전체적으로는 try -block이 제거됩니다. 그래서 그것은 당신의 질문에 대한 직접적인 대답이 아니며, 심지어 이것에 시간을 보내고 있습니다. 실제로 대답에 대한 동의를 요구하지 않습니다. 나는 초보자를 돕기 위해 노력하고있다.

이 모두가 실수는 아니며, 자신이하는 일을하는 가장 좋은 방법은 아닙니다. 초보자의 경우, 코드는 실제로 나쁘지는 않지만 코드와 관련된 몇 가지 여기에있다 학습 항상 새로운, 그리고 :

1. "클래스 메인"

첫 번째 문제, class main()는 마지막으로 :이 누락되었습니다. 그리고 이것은 클래스가 아닌 함수가 될 것이라고 생각합니까? 기능을 정의하려면 def main():으로 변경하십시오. 클래스는 객체 생성을위한 것이며, 함수는 간단한 작업을 완료하기위한 것입니다.

2. 예외

가 사용자로부터 입력을 얻을 수 억 가지 방법이 있습니다 그것은 유효한 입력 있는지 검사합니다. 불행히도, 당신의 방법은 그것들 중 하나가 아닙니다.

for i in range(numOfPeople): 

    # Get user's name 
    name = raw_input("Please enter name: ") 

    # While name has incorrect characters 
    while re.search('[^a-zA-Z\n]',name): 

     # Print out an error 
     print("illegal name - Please use only letters") 

     # Ask for the name again (if it's incorrect, while loop starts again) 
     name = raw_input("Please enter name: ") 

    # .extend is used for appending lists to other lists 
    # details is a class, not a list, so use .append instead 
    peopleList.append(details(name)) 

당신은 또한 휴식을 사용할 수 있습니다, 또는 내가 선호하려는 방법은이 아니라면 ... 값을 반환하는 함수를 만드는 예외를 사용하지 마십시오입니다 : 여기에 루프를위한 한 가지 방법이다 정말로 좋은 이유는, 대부분의 시간에 그들은 당신의 길에 있습니다. 또한 i = 1while i == 1:과 같은 변수를 사용하는 것은 코딩이 잘못되어 while True:을 수행하고 break을 호출하여 루프를 중지하거나 위와 같이 수행하십시오.

그리고 내가 말했듯이, 이것들을 구현하는 몇 가지 방법 일 뿐이며, 당신에게 맞는 것을 찾을 수있을 것입니다. 그러나 가능한 한 간단하게하십시오.

3. changeAttribute

귀하의 changeAttribute() 방법은 나에게 쓸모없는 것 같다. peopleList[-1].changeAttribute(name, None, None)을 호출하는 대신 peopleList[-1].name = name을 사용하여 동일한 결과를 얻고 쓸모없는 메서드를 사용하지 않을 수 있습니다.

4.peopleList [-1]

대신 당신이 person = details() (나는 너무 사람에 세부 사항의 이름을 바꿀 것입니다 메인 함수의 첫 번째 줄에 새로운 사람을 정의해야합니다, 개체 중 하나 좋은 방법이 아니다 얻을 peopleList[-1]를 사용하지만, 당신의 호출) 그리고 모든 for 루프 안에서, 그냥 person.name = name이라고 말하고 당신이 얻고있는 세부 사항으로 이름을 대체하십시오. 이제 모든 for 루프가 완료된 후 peopleList.append(person)으로 전화하십시오. 코드의 첫 번째 행에있는 사람 정의를 그대로두고 임시 로컬 변수에 사용자 이름, 주소 및 번호를 가져온 다음 마지막 줄에 peopleList.append(details(name, address, number))을 호출 할 수도 있지만 첫 번째 방법이 권장됩니다.

5. CamelCaseClassNames 이미 댓글에서 언급 한 바와 같이

, 당신은 (대신 class details:class Details:을) 수업에 대한 CamelCaseNaming를 사용해야합니다. 이 오류는 가능한 오류가 아니며 실수가 아니지만 CamelCasing을 사용하면 다른 프로그래머도 코드를 이해할 수 있습니다. 그것은 프로그래머들 사이에서 습관 일 뿐이며, 세계적으로 클래스에 이름을 붙이는 데 사용됩니다.

0

Mahi는 프로그램 개선 방법을 잘 수행했으며, 조언을 따르고 더 간단하고 읽기 쉬운 코드를 작성하면 해결하기 어려운 버그가 줄어든다는 것을 알게 될 것입니다.

하지만 특정 질문에 대한 답을 원 :

당신이 명시 적으로 이름이 예외를 발생시킬뿐만 아니라 해당 try 블록 내에서 예외가있을 때마다 실행됩니다 except (Exception) 블록. 이를 방지하려면 특정 예외를 발생시켜야합니다.

무한 루프를 재생할 수있는 유일한 방법은 입력을 요구하지 않는 Ideone.com online interpreter을 사용하는 것입니다 (입력을 미리 입력해야 함). 이로 인해 except에 걸려 EOFError 예외가 발생하고 무한 루프가 발생합니다. 나는 당신이 비슷한 것을했다고 의심한다. 그렇지 않으면 예외를 제기 한 뭔가를했다.

관련 문제