Py学习  »  Python

30天入门Python(基础篇)——第12天:错误、调试和测试

码上编程学习社 • 8 月前 • 382 次点击  

资料已经打包好了,需要的关注公众号发送“111”领取

“代码跑着跑着突然报错,盯着屏幕半小时找不到原因?”

“传给函数一个字符串,结果因为类型不对崩溃了?”

——新手写代码最怕“意外”,而错误处理、调试和测试就是应对意外的“三大法宝”。

今天学会这四招,不仅能让代码“报错不崩溃”,还能快速定位问题,写出更靠谱的程序。

一、错误处理:让代码“优雅认错”不崩溃

代码运行中难免出错(比如输入非数字、文件找不到),直接崩溃体验太差。用try-except语句就能捕获错误,让程序要么处理错误,要么给出友好提示,而不是直接罢工。

def calculate_average(scores):    try:        # 可能出错的代码块        total = sum(scores)        average = total / len(scores)        return round(average, 2)    except ZeroDivisionError:        # 处理“除数为0”错误(比如scores是空列表)        print("错误:成绩列表不能为空!")        return 0    except TypeError:        # 处理“类型错误”(比如scores里混了字符串)        print("错误:成绩必须是数字!")        return 0    finally:        # 无论是否出错,都会执行(比如关闭文件、清理数据)        print("成绩计算流程结束")# 测试1:正常情况print("正常情况平均分:", calculate_average([859278]))  # 输出85.0# 测试2:空列表(触发ZeroDivisionError)calculate_average([])# 测试3:混有字符串(触发TypeError)calculate_average([85"92"78])


核心逻辑:try包裹“风险代码”,except针对性捕获错误,finally做收尾工作。新手不用记全错误类型,遇到报错时,把错误名称抄进except即可。

二、调试:快速定位错误的“放大镜”

代码报错不可怕,找不到错在哪才可怕。调试就是“一步步跟踪代码执行过程”,像侦探查案一样揪出问题。新手不用学复杂工具,掌握三种方法足够应对80%的场景。

# 方法1:print打印关键值(最基础,新手首选)def find_top_score(scores):    top = 0    for s in scores:        # 打印当前循环的数值和top值,跟踪变化        print(f"当前分数:{s},当前最高分:{top}")        if s > top:            top = s    return top# 测试:找出最高分,若结果不对,看打印记录就能定位find_top_score([8592789588])# 方法2:assert断言(验证假设,不成立则报错)def calculate_score(score):    # 断言成绩在0-100之间,否则触发AssertionError    assert 0 <= score <= 100"成绩必须在0-100之间"    return score * 0.8# 测试:传入无效成绩,直接提示错误# calculate_score(105)  # 报错:AssertionError: 成绩必须在0-100之间# 方法3:pdb调试(命令行单步执行,进阶用法)import pdbdef add_score(a, b):


    
    pdb.set_trace()  # 程序运行到这里会暂停    return a + badd_score(8592)  # 运行后进入调试模式,输入n下一步,p a查看a的值


新手建议:先把print用熟,简单直观;写核心逻辑时加assert做验证,提前暴露问题;复杂场景再用pdb单步调试。

三、单元测试:给函数“做体检”,确保功能靠谱

写好一个函数后,怎么确保它在各种情况下都能正常工作?单元测试就是“自动化测试工具”,提前写好测试用例,一键验证函数是否符合预期,比手动测试省10倍时间。

import unittest  # 导入单元测试模块# 要测试的函数def grade_level(score):    if score >= 90:        return "优秀"    elif score >= 80:        return "良好"    elif score >= 60:        return "合格"    else:        return "不合格"# 编写测试类,继承unittest.TestCaseclass TestGradeLevel(unittest.TestCase):    # 测试用例:以test开头的方法    def test_excellent(self):        # 断言函数返回值是否等于预期        self.assertEqual(grade_level(95), "优秀")    def test_good(self):        self.assertEqual(grade_level(85), "良好")    def test_borderline(self):        # 测试边界值,最容易出问题的地方        self.assertEqual(grade_level(60), "合格")        self.assertEqual(grade_level(59), "不合格")# 运行测试if __name__ == "__main__":    unittest.main()


运行后会显示测试结果,若所有用例通过则全绿,失败会提示具体是哪个用例、实际返回值与预期不符,精准定位问题。

四、文档测试:边写文档边测试,一举两得

写函数注释时,顺便把测试用例写进去,用doctest模块就能自动执行注释里的代码,既保证了文档的准确性,又完成了简单测试,非常适合工具函数。

def multiply(a, b):    """    计算两个数的乘积    测试用例:    >>> multiply(3, 5)    15    >>> multiply(0, 100)    0    >>> multiply(-2, 4)    -8    """    return a * b# 执行文档测试if __name__ == "__main__":    import doctest    doctest.testmod()  # 运行后无输出则测试通过,有错误会提示


优势:文档和测试绑定,后续修改函数时,若忘了更新文档,测试会失败,避免“文档与代码不符”的坑。

今天的四个知识点,构成了“代码质量保障体系”:错误处理让程序更健壮,调试帮你快速排错,单元测试全面验证功能,文档测试兼顾文档与测试。新手不用追求“一次性写完美”,可以按“先加try-except防崩溃→用print调试→写简单单元测试”的步骤逐步提升,写代码会越来越有底气。

【今日任务】对之前写的“calculate_bmi(weight, height)”函数做优化:① 用try-except捕获“身高为0”“体重是字符串”的错误;② 写3个单元测试用例(正常值、边界值、异常值);③ 给函数加文档测试。

最后

以上就是今天给你分享的内容,觉得有用的话欢迎点赞收藏哦!

如果你也对Python这门编程感兴趣的话,欢迎加入我们。(小白也可以参加)

  Python零基础实战特训营 
三更老师亲自上课示范,2天:理论+实操教学+直播教学演示+课后辅导

获取方式:

1.关注下方公众号↓↓↓↓

2.点赞+再看

3.在后台发送:“python” 即可领取资料福利/开通上课权限

资料已经打包好了,需要的关注公众号发送“111”领取

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/190509