为任何不是列表的输入退出程序

Exiting program for any input that is not a list

我的目标是创建一个小程序,将角度从辐射角转换为度数,反之亦然。如果用户以错误的格式输入要转换的信息,我需要程序关闭且 python 没有错误消息。

在将变量“角度”分配给输入的两个值之后。角度变量变为列表类型。 在没有错误消息的情况下退出程序,我这样写: 'if angle is not list():break'.

问题是当我这样做时,它会退出作为输入输入的任何类型命令的程序。

这是我的代码:

import numpy as np

while 1:

    angle=input("Please enter the angle you want to convert,\n\n"\
    "If you wish to convert degrees in radiant or vise-versa,\n"\
    "follow this format: 'angle/D or R'").split('/')


    if angle is not list():break


    angle[0]=float(angle[0])
    radiant= (angle[0]*(np.pi))/180
    degre=((angle[0]*180)/np.pi)

    if (angle[0]>=0 or angle[0]<=360) and angle[1] is 'D' :
        print(radiant,'radiants')
    elif angle[1] is 'R':
        print(degre,'degrés')
    else:break

你想要什么:

if not isinstance(angle, list): break

您所做的:if angle is not list():break 将始终评估为 True,因为任何对象都不会与列表 list() 具有相同的标识;因为 is 是对身份的检查。

连这个:

>>> list() is not list()
True

您可以使用isinstance(angle, list)来检查它是否是一个列表。但它不会帮助你实现你真正想做的事情。

以下代码将帮助您。

question = """Please enter the angle you want to convert.
If you wish to convert degree in radiant or vice-versa.
Follow this format: 'angle/D or R'
"""

while 1:
    angle=input(question).split('/')

    if not isinstance(angle, list): break # This will never happen
    # It will never happen because string.split() always returns a list

    # Instead you should use something like this:
    if len(angle) != 2 or angle[1] not in ['D', 'R']:
        break

    try:
        angle[0]=float(angle[0])
    except ValueError:
        break

    if (angle[0]>=0 or angle[0]<=360) and angle[1] is 'D':
        # You could also improve this by taking modulo 360 of the angle.
        print((angle[0]*np.pi)/180, 'radiants')
    else:
        # Just an else is enough because we already checked that angle[1] is either D or R
        print((angle[0]*180)/np.pi, 'degrees')

break 语句用于退出 forwhile 循环。尝试在 input 语句之后使用 while 循环来评估输入。使用可能的 set 作为条件。您不需要中断 if 语句,因为如果不满足条件,它将被绕过。
有时您可能会看到 if 语句后跟 break 语句。然而,break 语句并没有从 if 语句中断。它打破了之前的 forwhile loop