Python丨课程笔记Part2:方法论进阶部分

Part 2 方法论进阶部分

1. AI辅助编程方法论

不讨论

自己琢磨

用来学习很不错

但要注意如何更好与AI协作

需要一些沉淀

2. 课件4:程序调试基础

2.1. 错误的分类

  1. 语法错误(Syntax Error)
  2. 运行时错误(Runtime Error)
    语法正确,执行过程中遇到无法处理的情况,程序崩溃并抛出异常。
    异常 (Exception):程序运行过程中发生的错误情况
    常见类型:
    • NameError:变量未定义
    • TypeError:类型不兼容
    • ValueError:值不合法
    • ZeroDivisionError:除以零
    • IndexError:索引超出范围
    • KeyError:字典键不存在
  3. 逻辑错误(Logical Error)
    程序语法正确且能运行,但结果不符合预期。
    需要通过调试和测试来发现和修正。
python 复制代码
"""
示例:演示 Python 中错误的分类

包含演示:
- 语法错误(Syntax Error):代码不符合语法规则,无法解析。
- 运行时错误(Runtime Error):执行时发生的异常,如 NameError, TypeError 等。
- 逻辑错误(Logical Error):代码运行但结果错误。

运行:
    python error_types_demo.py

注意:语法错误示例被注释掉,避免运行时崩溃。

作者:自动生成示例(中文注释)
"""


def syntax_error_demo():
    print('--- 语法错误示例 ---')
    print('语法错误:代码不符合 Python 语法规则,导致解析失败。')
    print('示例(注释掉以避免错误):')
    print('# print("Hello World"  # 缺少右括号')
    print('# 或 if True print("yes")  # 缺少冒号')
    print('这些会导致 SyntaxError,无法运行。')
    print()


def runtime_error_demo():
    print('--- 运行时错误示例 ---')

    # NameError: 变量未定义
    try:
        print(undefined_var)
    except NameError as e:
        print(f'NameError: {e}')

    # TypeError: 类型不兼容
    try:
        result = "hello" + 5
    except TypeError as e:
        print(f'TypeError: {e}')

    # ValueError: 值不合法
    try:
        num = int("abc")
    except ValueError as e:
        print(f'ValueError: {e}')

    # ZeroDivisionError: 除以零
    try:
        result = 10 / 0
    except ZeroDivisionError as e:
        print(f'ZeroDivisionError: {e}')

    # IndexError: 索引超出范围
    try:
        lst = [1, 2, 3]
        print(lst[5])
    except IndexError as e:
        print(f'IndexError: {e}')

    # KeyError: 字典键不存在
    try:
        d = {"a": 1}
        print(d["b"])
    except KeyError as e:
        print(f'KeyError: {e}')

    print()


def logical_error_demo():
    print('--- 逻辑错误示例 ---')
    print('逻辑错误:代码语法正确,能运行,但结果不符合预期。')
    # 示例:计算平均值时忘记转换为 float
    scores = [85, 90, 78, 92, 88]
    total = sum(scores)
    count = len(scores)
    average = total / count  # 这是正确的,但假设逻辑错误:average = total // count
    print(f'分数:{scores}')
    print(f'总分:{total},数量:{count}')
    print(f'平均分(正确):{average}')

    # 模拟逻辑错误:使用整除,导致精度丢失
    wrong_average = total // count
    print(f'平均分(逻辑错误,整除):{wrong_average}  # 丢失小数部分')
    print('逻辑错误需要通过测试和调试发现。')
    print()


def main():
    syntax_error_demo()
    runtime_error_demo()
    logical_error_demo()


if __name__ == '__main__':
    main()

2.2. 调试方法与异常处理机制

简单调试方法:

  • 打印调试法:使用print()输出变量值和程序状态。

异常处理结构:
try-except结构用于捕获和处理异常,防止程序崩溃。

增强程序的健壮性和用户体验。

结构:

  • try块:包含可能引发异常的代码。
  • except块:处理特定异常类型的代码。
    可以有多个except块来处理不同类型的异常。
    实践中建议先处理特殊异常,再处理通用异常。
  • else块(可选):当try块没有引发异常时执行的代码。
  • finally块(可选):无论是否引发异常,都会执行的代码。通常用于资源清理。
python 复制代码
"""
示例:演示 Python 中异常处理机制

包含演示:
- try-except:捕获异常
- try-except-else:无异常时执行else
- try-except-finally:无论如何执行finally
- 多个except块:处理不同异常
- 通用异常处理

运行:
    python exception_handling_demo.py

作者:自动生成示例(中文注释)
"""


def basic_try_except():
    print('--- 基本 try-except 示例 ---')
    try:
        num = int(input('请输入一个整数:'))
        result = 10 / num
        print(f'10 除以 {num} = {result}')
    except ValueError:
        print('输入不是有效整数!')
    except ZeroDivisionError:
        print('不能除以零!')
    print()


def try_except_else():
    print('--- try-except-else 示例 ---')
    try:
        x = int(input('请输入一个数字:'))
        y = 100 / x
    except (ValueError, ZeroDivisionError) as e:
        print(f'错误:{e}')
    else:
        print(f'计算成功:100 / {x} = {y}')
    print()


def try_except_finally():
    print('--- try-except-finally 示例 ---')
    try:
        file = open('example.txt', 'r')
        content = file.read()
        print('文件内容:', content)
    except FileNotFoundError:
        print('文件不存在!')
    finally:
        print('finally 块:无论如何都会执行(通常用于清理资源)')
        # 注意:这里没有 file.close() 因为文件没打开,但演示结构
    print()


def multiple_exceptions():
    print('--- 多个 except 块示例 ---')
    try:
        lst = [1, 2, 3]
        index = int(input('请输入索引(0-2):'))
        value = lst[index]
        result = 10 / value
        print(f'lst[{index}] = {value}, 10 / {value} = {result}')
    except IndexError:
        print('索引超出范围!')
    except ZeroDivisionError:
        print('列表中不能有零值!')
    except ValueError:
        print('输入不是整数!')
    except Exception as e:  # 通用异常,最后处理
        print(f'其他错误:{e}')
    print()


def main():
    print('异常处理演示:')
    basic_try_except()
    try_except_else()
    try_except_finally()
    multiple_exceptions()


if __name__ == '__main__':
    main()

2.3. 专业调试器

  • 断点(Breakpoint)
  • 单步执行(Stepping)
    • Step Over(单步跳过)
      执行当前行代码后,停在下一行代码。
    • Step Into(单步进入)
      进入当前行代码调用的函数内部,逐行调试。
    • Step Out(单步跳出)
      继续执行当前函数剩余代码,直到返回上层调用。
  • 变量监视(Variable Watch)
    实时查看变量值的变化。

2.4. 防御性编程

Defensive Programming(防御性编程)是一种编程方法论,旨在提高代码的健壮性和可靠性。

原则:

永远不要假设输入是正确的。

实战技巧示例:

使用while True结合try-except结构,持续提示用户输入,直到输入合法为止。

python 复制代码
"""
示例:演示防御性编程

包含演示:
- 防御性编程:永远不要假设输入正确,使用循环和异常处理确保输入合法。
- while True + try-except:持续提示用户输入,直到输入有效。

运行:
    python defensive_programming_demo.py

注意:运行时会提示输入,输入无效时会重新提示。

作者:自动生成示例(中文注释)
"""


def get_positive_integer():
    """获取正整数的防御性函数"""
    while True:
        try:
            num = int(input('请输入一个正整数:'))
            if num <= 0:
                raise ValueError('必须是正整数')
            return num
        except ValueError as e:
            print(f'输入无效:{e}。请重新输入。')


def get_float_in_range(min_val, max_val):
    """获取指定范围内的浮点数的防御性函数"""
    while True:
        try:
            num = float(input(f'请输入一个介于 {min_val} 和 {max_val} 之间的浮点数:'))
            if not (min_val <= num <= max_val):
                raise ValueError(f'数值必须在 {min_val} 到 {max_val} 之间')
            return num
        except ValueError as e:
            print(f'输入无效:{e}。请重新输入。')


def get_list_of_integers():
    """获取整数列表的防御性函数"""
    while True:
        try:
            input_str = input('请输入用逗号分隔的整数列表(如 1,2,3):')
            # 分割并转换为整数
            nums = [int(x.strip()) for x in input_str.split(',')]
            return nums
        except ValueError:
            print('输入包含非整数。请重新输入。')


def main():
    print('--- 防御性编程示例 ---')
    print('这些函数会持续提示,直到输入合法。')

    # 示例1:获取正整数
    pos_int = get_positive_integer()
    print(f'获取的正整数:{pos_int}')

    # 示例2:获取范围内的浮点数
    float_val = get_float_in_range(0.0, 100.0)
    print(f'获取的浮点数:{float_val}')

    # 示例3:获取整数列表
    int_list = get_list_of_integers()
    print(f'获取的整数列表:{int_list}')

    print('所有输入都已验证并获取成功!')


if __name__ == '__main__':
    main()
相关推荐
知远同学2 小时前
使用virtualenv 和 anaconda 创建管理虚拟环境的区别
python
微爱帮监所写信寄信2 小时前
微爱帮监狱寄信写信小程序:深入理解JavaScript中的Symbol特性
开发语言·javascript·网络协议·小程序·监狱寄信·微爱帮
ss2732 小时前
线程池工作机制:从任务提交到执行的完整决策流程
java·开发语言
syt_10132 小时前
js基础之-如何理解js中一切皆对象的说法
开发语言·javascript·原型模式
山沐与山2 小时前
【设计模式】Python状态模式:从入门到实战
python·设计模式·状态模式
yaoxin5211232 小时前
276. Java Stream API - 使用 flatMap 和 mapMulti 清理数据并转换类型
java·开发语言·windows
Swizard2 小时前
别让你的密钥在互联网上“裸奔”!用 python-dotenv 优雅管理你的敏感配置
python
无心水2 小时前
【Stable Diffusion 3.5 FP8】8、生产级保障:Stable Diffusion 3.5 FP8 伦理安全与问题排查
人工智能·python·安全·docker·stable diffusion·ai镜像开发·镜像实战开发
摇滚侠2 小时前
Java 零基础全套视频教程,异常,处理异常,自定义异常,笔记 124-129
java·笔记