为什么我在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))