为任何不是列表的输入退出程序
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 语句用于退出 for 和 while 循环。尝试在 input 语句之后使用 while 循环来评估输入。使用可能的 set 作为条件。您不需要中断 if 语句,因为如果不满足条件,它将被绕过。
有时您可能会看到 if 语句后跟 break 语句。然而,break 语句并没有从 if 语句中断。它打破了之前的 for 或 while loop。
我的目标是创建一个小程序,将角度从辐射角转换为度数,反之亦然。如果用户以错误的格式输入要转换的信息,我需要程序关闭且 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 语句用于退出 for 和 while 循环。尝试在 input 语句之后使用 while 循环来评估输入。使用可能的 set 作为条件。您不需要中断 if 语句,因为如果不满足条件,它将被绕过。
有时您可能会看到 if 语句后跟 break 语句。然而,break 语句并没有从 if 语句中断。它打破了之前的 for 或 while loop。