Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我在python中得到一个带有原始输入的无限循环?_Python_Loops_Infinite_Raw Input - Fatal编程技术网

为什么我在python中得到一个带有原始输入的无限循环?

为什么我在python中得到一个带有原始输入的无限循环?,python,loops,infinite,raw-input,Python,Loops,Infinite,Raw Input,下面是代码-非常简单-但它无限地给了我程序主要部分的第一个异常-甚至没有要求用户输入我认为应该在的地方-在原始输入的第一个输入处 我是一个初学者,对这门语言有很好的掌握,有什么想法吗? 谢谢 首先,我将对您的代码给出很多重要的反馈。请记住,我这样做并不是为了滥用你糟糕的编码,我这样做纯粹是为了教学目的,只是想向你展示更好的方法来做你所做的事情 执行下面列出的操作将解决您的问题,但只会因为它删除整个try-块。所以这不是对你问题的直接回答,即使我花时间在这个问题上,我也不会要求你接受答案。我只是(

下面是代码-非常简单-但它无限地给了我程序主要部分的第一个异常-甚至没有要求用户输入我认为应该在的地方-在
原始输入的第一个输入处
我是一个初学者,对这门语言有很好的掌握,有什么想法吗?
谢谢


首先,我将对您的代码给出很多重要的反馈。请记住,我这样做并不是为了滥用你糟糕的编码,我这样做纯粹是为了教学目的,只是想向你展示更好的方法来做你所做的事情

执行下面列出的操作将解决您的问题,但只会因为它删除整个
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))
您也可以使用break,或者我更喜欢的方法是创建一个返回值的函数。。。如果没有很好的理由,不要使用异常,大多数情况下,它们只是在您的路上。另外,使用诸如
i=1
等变量,而i==1:
是错误的编码,相反,使用
而True:
并通过调用
break
停止循环,或者像上面那样执行

正如我所提到的,这些只是实现这一点的几种方法,希望你能找到一种适合你的方法,但请尽量简单

3。changeAttribute

你的
changeAttribute()
方法对我来说似乎没用。您不必调用
peopleList[-1].changeAttribute(name,None,None)
而只需执行
peopleList[-1].name=name
即可获得完全相同的结果,并且不必使用无用的方法

4。人物列表[-1]

使用
peopleList[-1]
获取对象也不是一个好方法,相反,您应该在主函数
person=details()
的第一行定义一个新的person(我也会将details重命名为person,但您的调用除外)和每个for循环中,只需说
person.name=name
,然后用您得到的任何细节替换姓名。现在,在完成所有for循环之后,调用
peopleList.append(person)
。您也可以从代码的第一行删除人员定义,将用户名、地址和号码输入临时本地变量,然后在最后一行调用
peopleList.append(details(name、address、number))
,尽管建议使用第一种方法

5。CamelCaseClassNames


正如我在评论中已经提到的,您应该为类使用CamelCaseNaming(而不是
类详细信息:
do
类详细信息:
)。这在任何可能的方面都不是一个错误,甚至不是一个错误,但最好使用CamelCasing,这样其他程序员也能理解您的代码。这只是程序员的一种习惯,是全球通用的命名类的方法。

Mahi在改进程序的过程中做得很好,我想如果你听从他的建议,努力编写更简单、可读性更强的代码,你会发现,难处理的bug会更少

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

每当相应的
try
块中出现异常时,您的
Exception(Exception)
块将执行,而不仅仅是当您显式引发未命名异常时。为了避免这种情况,您应该引发并捕获一个特定的异常


我复制无限循环的唯一方法是使用,它不会提示输入(您必须提前输入)。这引发了一个EOFError异常,它被您的
异常捕获,并导致无限循环。我怀疑您做了类似的事情(或者做了引发异常的事情)。

为什么您有一个没有方法定义的
class main()
?这应该是一个函数吗?什么是“程序主要部分的第一个异常”?请发布它给出的实际错误消息。^您应该使用camelcase命名您的类,以帮助其他python用户阅读。这不是一个问题,tho,只是提到为什么在这个世界上,您使用异常进行看似简单的数据验证?我运行了您的代码,得到了TypeError。
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))