为什么我在python中使用raw_input获得无限循环?

时间:2012-11-26 19:19:44

标签: python loops infinite 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

2 个答案:

答案 0 :(得分:1)

首先,我将对您的代码提供大量关键反馈。请记住,我不是这样做是为了滥用你的错误编码,我这样做完全基于教学目的,只是试图告诉你更好的方法来做你做过的事情

执行下面列出的内容将解决您的问题,但只会导致它删除整个try - 阻止。所以这不是你问题的直接答案,即使我花时间在这上面,我实际上并没有要求接受答案。我只是(无聊)试图帮助一个初学者。

并非所有这些都是错误,它们不是做你正在做的事情的最好方法。对于一个初学者来说,你的代码实际上并没有那么糟糕,但总有新的东西需要学习,而且这里有一些与你的代码相关的东西:

<强> 1。 “班主”

第一个问题,class main()你最后错过:,我想这是一个函数,而不是一个类?将其更改为def main():以定义功能。类用于创建对象,函数用于完成简单任务。

<强> 2。例外

有十亿种方法可以从用户那里获取输入并检查它是否是有效输入。不幸的是,你的方式不是其中之一。这是执行for循环的一种方法:

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]

使用peopleList[-1]获取对象也不是一个好方法,而是应该在主函数person = details()的第一行定义一个新人(我也会将详细信息重命名为Person,但是你的调用)和每个for循环内部,只需说出person.name = name并用你得到的任何细节替换名称。完成所有for循环后,调用peopleList.append(person)。您还可以将代码的第一行中的人员定义留下,将用户的姓名,地址和编号放入临时局部变量,然后在最后一行调用peopleList.append(details(name, address, number)),尽管第一种方法是可推荐的。

<强> 5。 CamelCaseClassNames

正如我在评论中已经提到的,你应该为你的类使用CamelCaseNaming(而不是class details:class Details:)。这不是任何可能的错误,它甚至不是一个错误,但最好使用CamelCasing,以便其他程序员也能理解你的代码。这只是程序员的习惯,是全球用来命名类的方法。

答案 1 :(得分:0)

Mahi做了很好的工作,你应该改进你的程序,我想你会发现如果你遵循他的建议并编写更简单,更易读的代码,你会得到更少的棘手错误。

但我想回答你的具体问题:

每次在相应的except (Exception)块中发生异常时,try块都会执行,而不是在您明确提出未命名的异常时。为了避免这种情况,你应该提出并捕获一个特定的例外。

我能够重现无限循环的唯一方法是使用Ideone.com online interpreter,它不会提示输入(你必须提前输入输入)。这引发了一个EOFError异常,它被你的except捕获,并导致无限循环。我怀疑你做了类似的事情(或者做了一些引发异常的事情)。