python - 结束 Python 3.x 中的循环

标签 python loops python-3.x while-loop

我正在尝试编写的程序的简要描述。它旨在根据用户输入的初始速度和初始轨迹角度来计算炮弹的轨迹。在程序退出之前,用户尝试输入有效输入三次。如果成功,它将询问用户想要计算什么(飞行时间、最大高度或最大水平范围)。然后,程序将显示计算出的答案以及达到用户选择的最大高度所需的时间。

这两个问题可以在代码中的注释中找到...

# Constant(s)
GRAV = 9.8

# Accumulator variable(s)
InvalEntry1 = 0
Success = 0

import math

# Defining functions to calculate max height (hMax), total travel time (tTime), and max range (rMax)
def hMax ():
    height = ((iVelocity**2) * math.pow(math.sin(math.radians(iTrajectory)), 2)) / (2 * GRAV)
    return height

def tTime ():
    time = (2* iVelocity * (math.sin(math.radians(iTrajectory)))) / GRAV
    return time

def rMax ():
    rangeMax = ((iVelocity**2) * math.sin(math.radians(2 * iTrajectory))) / GRAV
    return rangeMax

# Assigning user inputs for the initial velocity and initial trajectory to variables
iVelocity = float(input('Please Enter an Initial Velocity Between 20 to 800 m/s: ' ))
iTrajectory = float(input('Please Enter a Initial Trajectory Angle Between 5 to 80 Degrees: '))

print ('\n')


# FIRST PROBLEM... I am having trouble with this loop. If the user enters
# valid numbers on the third attempt, the program will shut down regardless.
# OR if they enter invalid numbers on the third attempt, it will display
# the warning message again, even though they are out of attempts when the
# program should shut down. Lastly, if valid numbers are entered on the
# second attempt, it will continue to the next input function, but will
# still display the warning message.


# Giving the user 3 attempts at providing valid inputs
while (InvalEntry1 < 3):

    # Determining if user inputs are valid
    if (iVelocity < 20) or (iVelocity > 800) or (iTrajectory < 5) or (iTrajectory > 80):
        print ('INVALID ENTRY\n')
        InvalEntry1 = InvalEntry1 + 1
        iVelocity = float(input('Please Enter an Initial Velocity Between 20 to 800 m/s: ' ))
        iTrajectory = float(input('Please Enter a Initial Trajectory Angle Between 5 to 80 Degrees: '))
        print ('\n======================================================================')
        print ('WARNING!!! You have ONE attempt left to input a correct number for')
        print ('initial velocity and initial trajectory before the program will quit.')
        print ('======================================================================\n')

    else:
        # Determining what the user wants to calculate
        print ('What would you like the program to calculate?')
        uCalculate = int(input('Enter 1 for Max Height, 2 for Time, or 3 for Max Horizontal Range: '))
        print ('\n')


        # SECOND PROBLEM... after the user successfully inputs the 
        # correct numbers and the program displays the answers using the 
        # functions, instead of ending the program, it loops back to 
        # the else statement above. I can't seem to figure out how to
        # close the loop and end the program. I tried using
        # while (Success < 1): to close the loop, but it continues to
        # loop anyways.


        # Determining which variable(s) the user wants the program to calculate

        if (uCalculate == 1):
            print ('Maximum Height = %.2f' %(hMax()))
            print ('Total Time = %.2f' %(tTime()))
            Success = Success + 1

        elif (uCalculate == 2):
            print ('Total Time = %.2f' %(tTime()))
            Success = Success + 1

        elif (uCalculate == 3):
            print ('Maximum Horizontal Range = %.2f' %(rMax()))
            print ('Total Flight Time = %.2f' %(tTime()))
            Success = Success + 1

        else:
            print ('INVALID ENTRY')

预先感谢您提供的任何帮助或建议。

最佳答案

正如前面的评论提到的,您的代码示例既太长,又无法按照编写的方式重现。因此,我将为您提供一个更通用的答案,然后您可以使用它来修改您的代码。

用更抽象、可重用的术语重述您的问题。您有一个需要用户输入的函数。您希望使用以下内容进行验证:如果输入有效,您希望程序继续。如果输入无效,您想警告用户并重复。如果尝试 x 次后输入仍然无效,则您希望程序退出。这是一种常见的场景,有多种可以使用的编程习惯或模式。这是一个简单的。

首先,将输入请求、输入验证和程序代码分离到单独的函数中。这样可以让您更轻松地组织和实现您的意图。

其次,在需要检查条件时使用循环半模式,然后在条件为假时继续循环。在其他语言中,您可以使用 do...while 循环来实现此目的,但 Python 只有 while

这是示例代码。

def get_user_input():
    in1 = input("Please enter height")
    in2 = input("Please enter weight")
    return in1, in2


def validate_user_input(x, y):
    try:
        # validation code for x
        _ = int(x)
    except:
        return False
    try:
        # validation code for y
        _ = int(y)
    except:
        return False

    # if we get here than all inputs are good
    return True


def ask_user():
    # Loop and a half pattern

    max_tries = 3


    val1, val2 = get_user_input()
    tries = 1
    while validate_user_input(val1, val2) is False:
        if tries >= max_tries:
            quit("Max tries exceeded")
        print("Invalid input. Please try again. You have {} attempts remaining".format(max_tries - tries))
        tries += 1
        val1, val2 = get_user_input()

    # if we get here, input is validated and program can continue
    print('Thank You')


if __name__ == '__main__':
    ask_user()

def get_user_input():

关于python - 结束 Python 3.x 中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592797/

相关文章:

python - 元组作为函数参数

没有参数的 Python 'raise' : what is "the last exception that was active in the current scope"?

Python pandas 创建一个函数来计算 n 列行的平均值

python - 使用 python 压缩所有子目录

python - Python 和 GAE 论坛

java - 使用 Java 循环创建仅边框的三角形

java - 如何使用循环跳转到两个数字之间距离相等的位置

python - -> 在 Python 函数定义中是什么意思?

python - 使用 pandas 高效计算时间特征

枚举的Python奇怪行为