CS50P week3 学习笔记

本文介绍了在Python中如何使用try-except处理可能出现的ValueError异常,以及如何逐步优化代码结构,包括使用else和while循环来提高用户体验,以及如何灵活控制错误提示和函数设计。
摘要由CSDN通过智能技术生成

Week 3 Exceptions

Exceptions

异常是在允许程序是出现的错误,更多详细请参考文档 Errors and Exceptions.

Try

在 Python 中,tryexcept 可以帮助我们在发生错误是进行检查,例子如下:

try:
    x = int(input("What's x? "))
    print(f"x is {x}")
except ValueError:
    print("x is not an integer")

image-20240227151748803

这段代码在输入非整数时就会出现自定义的提示信息,而不是 Python 默认的报错信息

但是对于上述代码来说,这并不是最佳的解决办法。在 try 代码中,应该尽可能少得放置可能认为会失败的代码。所以可以这样修改:

try:
    x = int(input("What's x? "))
except ValueError:
    print("x is not an integer")
    
print(f"x is {x}")

image-20240227152916122

这样写为什么会出现上述报错?

分析:在第2行代码中,等式右边的函数是接受一个输入,并将这个输入转化成整数后,再进行赋值;但是当输入的是一个非整数时,int() 在这里就会报错,导致并没有将输入的值赋值给 x,所以在程序最后会显示 x 未定义的报错

else

在捕获异常的语句中,还可以使用 else,代码修改如下:

try:
    x = int(input("What's x? "))
except ValueError:
    print("x is not an integer")
else:
    print(f"x is {x}")

分析:

  1. 执行 try 语句中的代码
  2. 如果发生错误,则执行第4行代码
  3. 如果没有发生错误,则执行第6行代码

考虑上述代码在执行时,如果没有得到整数的输入也会直接结束程序,对用户并不友好,故修改代码如下:

while True:
    try:
        x = int(input("What's x? "))
    except ValueError:
        print("x is not an integer")
    else:
        break
        
print(f"x is {x}")

image-20240227161148351

Creating a Function to Get an Integer

单独创建一个获取整数的函数:

def main():
    x = get_int()
    print(f"x is {x}")


def get_int():
    while True:
        try:
            x = int(input("What's x? "))
        except ValueError:
            print("x is not an integer")
        else:
            break
    return x


if __name__ == '__main__':
    main()

可以将上述代码更加简化:

def main():
    x = get_int()
    print(f"x is {x}")


def get_int():
    while True:
        try:
            x = int(input("What's x? "))
        except ValueError:
            print("x is not an integer")
        else:
            return x
    

if __name__ == '__main__':
    main()

这里 return 的作用包括返回值和打断循环,而 break 的作用仅是跳出循环

还可以进一步简化:

def main():
    x = get_int()
    print(f"x is {x}")


def get_int():
    while True:
        try:
            x = int(input("What's x? "))
            return x
        	# return int(input("What's x? "))
        except ValueError:
            print("x is not an integer")
    

if __name__ == '__main__':
    main()

pass

Python 官方参考文档 pass

假设这里用户输入有误,但不想每一次都提醒用户错误信息,那么可以这样做:

def main():
    x = get_int()
    print(f"x is {x}")


def get_int():
    while True:
        try:
            x = int(input("What's x? "))
            return x
        except ValueError:
            pass


if __name__ == '__main__':
    main()

这里仅捕捉异常,但不对异常做任何处理,可以使用 pass

最后一项改进,这里给用户的提示语是在 get_int 函数中,而不是在主程序中。现在想修改,以便可以在主程序中自由编辑提示语:

def main():
    x = get_int("What's x? c")
    print(f"x is {x}")


def get_int(prompt):
    while True:
        try:
            x = int(input(prompt))
            return x
        except ValueError:
            pass


if __name__ == '__main__':
    main()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值