繁体   English   中英

Python中嵌套while循环的两个条件?

[英]Two conditions for nested while loop in Python?

我是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:")

在满足外循环之后,我希望它分析内循环。 如果半径值<= 0,我希望它返回错误消息。 但是,当我运行它时,即使输入值(特别是半径的值<= 0),它也继续进行下一步。 在两个条件都满足之前,我不希望它继续进行下一步。 我怎样才能做到这一点?

非常感谢你! 我很感激!

您对正整数的测试存在缺陷:

int(c_1_r<=0)

这会将<=运算符的布尔结果转换为整数。 您根本不会将c_1_r转换为整数,因此您正在将字符串与0进行比较。 这将始终为false,因为在Python 2中,数字在字符串之前排序:

>>> 'Foobar' <= 0
False
>>> '-10000' <= 0
False

不必对每个变量重复测试,而要使用单独的函数来处理任何这些数字的输入。 在满足所有条件之前,请不要再提供其他号码。 使用无限while循环带你离开(或者用break 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM