python 为什么当try块中的语句为False时不显示错误?

aoyhnmkz  于 2023-02-18  发布在  Python
关注(0)|答案(3)|浏览(182)

我有一个简单的程序可以将数字分数转换为字母分数,但是条件score_int >=0 and score_int <= 100不起作用。它让我输入值< 0> 100,并且不显示错误消息“请输入有效的数字”。

while True :
    score_str = input('Enter your numerical score:')
    try:
        score_int = int(score_str)
        score_int >= 0 and score_int <= 100 # this condition isn't working for some reason**
    except:
        print('Enter a valid number')
        continue

    if score_int >= 90 and score_int <= 100 :
        print('A')
        continue
    elif score_int >= 80 and score_int < 90 :
        print('B')
        continue
    elif score_int >= 70 and score_int < 80 :
        print('C')
        continue
    elif score_int >= 60 and score_int <= 70 :
        print('D')
        continue
    elif score_int <= 60 :
        print('F')
        continue

应为值〈0和〉100时显示错误消息的代码

mm9b1k5b

mm9b1k5b1#

若要在表达式不是True时引发异常,可以使用assert关键字:

assert score_int >= 0 and score_int <= 100

如果带有assert的表达式为False,则它将使AssertionException自乘。
此外,您应该避免使用裸except子句。请参见What is wrong with using a bare 'except'?相反,请指定您希望try块中的代码引发的异常。在这种情况下,您的代码可以引发ValueError(如果score_str是无效整数,则引发AssertionError,如果上面的assert失败。
您的代码为:

while True:
  score_str = input('Enter your numerical score:')
  try:
      score_int = int(score_str)
      assert score_int >= 0 and score_int <= 100
  except (ValueError, AssertionError):
      print('Enter a valid number')
      continue

  if score_int >= 90 and score_int <= 100 :
      print('A')
  elif score_int >= 80 and score_int < 90 :
      print('B')
  elif score_int >= 70 and score_int < 80 :
      print('C')
  elif score_int >= 60 and score_int <= 70 :
      print('D')
  elif score_int <= 60 :
      print('F')

我还删除了条件中不必要的continue,因为它们是elif条件,并且在if..elif块之后的循环中没有任何内容

mfuanj7w

mfuanj7w2#

当你运行这个表达式score_int >= 0 and score_int <= 100时,你并没有对它的值做任何事情。Try块只在异常被引发时才失败,而不是在真或假的情况下。这就是if语句的作用。
必须在if语句的条件中使用表达式。
所以我的方法是把你写的条件反过来,如果用户给出一个小于0或者大于100的数字,我们要求他们输入一个0到100之间的数字。
我还删除了所有的continue语句,因为它们不是必需的,但是如果您愿意,也可以保留它们。

while True:
    score_str = input('Enter your numerical score:')
    try:
        score_int = int(score_str)
    except ValueError:
        print('Enter a valid number')

    if score_int <= 0 or score_int >= 100:
        print("Enter number between 0 and 100")
    elif score_int >= 90 and score_int <= 100:
        print('A')
    elif score_int >= 80 and score_int < 90:
        print('B')
    elif score_int >= 70 and score_int < 80:
        print('C')
    elif score_int >= 60 and score_int <= 70:
        print('D')
    elif score_int <= 60:
        print('F')
fdbelqdn

fdbelqdn3#

考虑if/elif条件都不通过的情况。剩下的是什么?分数福尔斯预期值的情况。因此,只需添加一个else来捕获这些情况。此外,由于循环将继续,因此不需要所有continue语句。以下是一种方法:

while True :
    score_str = input('Enter your numerical score:')
    try:
        score_int = int(score_str)
    except ValueError:
        print('Enter a valid number')
        continue
    if 90  <= score_int <= 100:
        print('A')
    elif 80 <=  score_int < 90:
        print('B')
    elif 70 <=  score_int < 80:
        print('C')
    elif 60 <= score_int <= 70:
        print('D')
    elif 0 <= score_int <= 60:
        print('F')
    else:
        print('Enter a valid number')

这还允许您将最少的代码量放在try块中,这对较大的项目调试很有帮助,并允许您捕获预期的特定错误。
要获得一种简洁的分数到等级Map方法,请查看bisect模块中的第一个示例。

相关问题