我是Python的新手,我即将开始的实验室要求我编写一个代码,用于对平面上的对象(圆圈)进行碰撞测试。对于两个圆圈,我提示用户输入x和y坐标的值,以及两者的半径。目前我设置它,以便如果用户忽略为三个输入中的任何一个输入值,它将使用while循环返回错误消息。这很好。
但是,我也想设置它以使半径不能小于或等于零。我使用了嵌套的while循环。这是我的代码:
while c_1_x=="" or c_1_y=="" or c_1_r=="":
print "Error: please enter a value for each field. If the value is 0, type 0."
c_1_x=raw_input("Enter the x coordinate of CIRCLE ONE center:")
c_1_y=raw_input("Enter the y coordinate of CIRCLE ONE center:")
c_1_r=raw_input("Enter the radius of CIRCLE ONE:")
while int(c_1_r<=0):
print "Error: radius of circle must be greater than zero."
c_1_r=raw_input("Enter the radius of CIRCLE ONE:")
在满足外部循环后,我希望它分析内部循环。如果radius的值是&lt; = 0,我希望它返回一条错误消息。但是,当我运行它时,它甚至在输入值之后继续下一步(特别是半径值<= 0)。我不希望它继续下一步,直到满足BOTH标准。我怎么能这样做?
非常感谢!我很感激!
答案 0 :(得分:2)
您对正整数的测试存在缺陷:
int(c_1_r<=0)
这会将<=
运算符的布尔结果转换为整数。您永远不会将c_1_r
转换为整数,因此您要将字符串与0
进行比较。这将始终为假,因为在Python 2中,数字在字符串之前排序:
>>> 'Foobar' <= 0
False
>>> '-10000' <= 0
False
不是对每个变量重复测试,而是使用单独的函数来处理任何这些数字的输入。在满足所有条件之前,不要求另一个号码。当输入满足您的条件时,使用您突破的无限while
循环(使用break
或使用函数中的return
):
def ask_for_positive_number(prompt):
while True:
try:
number = int(raw_input(prompt))
except ValueError:
print('Please enter a valid positive integer')
continue
if number <= 0:
print('Please enter a valid positive integer')
continue
return number
c_1_x = ask_for_positive_number("Enter the x coordinate of CIRCLE ONE center:")
c_1_y = ask_for_positive_number("Enter the y coordinate of CIRCLE ONE center:")
c_1_r = ask_for_positive_number("Enter the radius of CIRCLE ONE:")
由于函数只会在输入正整数时返回,因此无需测试是否所有3个变量都分配了值。
演示功能:
>>> ask_for_positive_number('Y0!: ')
Y0!: -1
Please enter a valid positive integer
Y0!: foobar
Please enter a valid positive integer
Y0!: 42
42