Part 2 方法论进阶部分
1. AI辅助编程方法论
不讨论
自己琢磨
用来学习很不错
但要注意如何更好与AI协作
需要一些沉淀
2. 课件4:程序调试基础
2.1. 错误的分类
- 语法错误(Syntax Error)
- 运行时错误(Runtime Error)
语法正确,执行过程中遇到无法处理的情况,程序崩溃并抛出异常。
异常 (Exception):程序运行过程中发生的错误情况
常见类型:- NameError:变量未定义
- TypeError:类型不兼容
- ValueError:值不合法
- ZeroDivisionError:除以零
- IndexError:索引超出范围
- KeyError:字典键不存在
- 逻辑错误(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(单步跳出)
继续执行当前函数剩余代码,直到返回上层调用。
- Step Over(单步跳过)
- 变量监视(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()