第16课:注释小助手——养成好习惯

🎯 本课目标

  • 理解注释的作用和重要性
  • 掌握单行注释和多行注释的写法
  • 学会编写有意义的注释
  • 了解文档字符串的使用
  • 养成编写注释的好习惯

📝 趣味引入:代码的"翻译官"

想象一下:你的代码就像一本外文书:

  • 🔤 计算机能直接"读懂"代码
  • 👥 但其他人(包括未来的你)可能看不懂
  • 💡 注释就是代码的"翻译",解释代码的意思
  • 🎯 好的注释让代码更容易理解和维护

今天,让我们学习如何成为优秀的代码"翻译官",用注释让代码更清晰!


🔧 第一部分:认识注释

1.1 注释是什么?

# 注释是写给人类看的说明文字
# Python解释器会忽略注释
# 注释以#号开头,直到行尾

print("你好,世界!")  # 这是一个简单的打印语句
# 上面的代码会显示"你好,世界!"

# 注释不会影响程序的运行
# 但能让代码更容易理解

1.2 为什么需要注释?

# 示例1:没有注释的代码(难以理解)
x = 10
y = 5
z = x + y
print(z)

# 示例2:有注释的代码(容易理解)
# 计算两个数的和
num1 = 10    # 第一个数
num2 = 5     # 第二个数
total = num1 + num2  # 计算总和
print(f"两数之和是:{total}")  # 输出结果

# 对比一下,哪个更容易理解?

📋 第二部分:注释的类型

2.1 单行注释

# 单行注释示例
# ==============================

# 1. 在代码行上方写注释
# 这是一个问候程序
name = "小明"
print(f"你好,{name}!")

# 2. 在代码行后面写注释
age = 12  # 设置年龄为12岁
height = 1.52  # 设置身高为1.52米

# 3. 多行单行注释
# 程序名称:学生信息管理
# 作者:小明
# 创建时间:2023年10月
# 功能:管理学生基本信息

# 4. 用注释暂时禁用代码(调试)
# print("这行代码暂时不执行")
print("这行代码会执行")

# 5. 用注释分隔代码块
# ==============================
# 计算部分
# ==============================
score1 = 85
score2 = 92
average = (score1 + score2) / 2

2.2 多行注释

# 多行注释示例
# ==============================

# 方法1:使用多个#号
# 这是一个多行注释的例子
# 每行都以#号开头
# 这样可以写很长的说明

# 方法2:使用三引号(推荐用于长注释)
"""
程序名称:学生成绩计算器
功能:计算学生的总分和平均分
作者:小明
版本:1.0
使用说明:
  1. 输入各科成绩
  2. 程序会自动计算
  3. 显示结果
"""

# 方法3:使用三单引号
'''
这是一个多行注释
可以写很多行
Python会忽略这些内容
'''

# 实际示例:计算圆的面积
"""
计算圆的面积
公式:面积 = π × 半径²
参数:
  radius: 圆的半径
返回值:圆的面积
"""
import math

radius = 5
area = math.pi * radius ** 2
print(f"半径为{radius}的圆的面积是:{area:.2f}")

🎯 第三部分:如何写好的注释

3.1 好的注释示例

# 好的注释示例
# ==============================

# 示例1:解释复杂逻辑
# 判断学生成绩等级
# 90分以上:优秀
# 80-89分:良好
# 70-79分:中等
# 60-69分:及格
# 60分以下:不及格
score = 85

if score >= 90:
    grade = "优秀"
elif score >= 80:
    grade = "良好"
elif score >= 70:
    grade = "中等"
elif score >= 60:
    grade = "及格"
else:
    grade = "不及格"

print(f"成绩:{score}分,等级:{grade}")

# 示例2:解释为什么要这样做
# 将字符串转换为整数,因为用户输入的是字符串
# 需要转换为整数才能进行数学计算
user_input = "25"  # 用户输入的年龄
age = int(user_input)  # 转换为整数
next_year_age = age + 1
print(f"明年你就{next_year_age}岁了")

# 示例3:标记待办事项
# TODO: 添加异常处理
# TODO: 优化计算速度
# FIXME: 这里的逻辑需要检查
# NOTE: 重要提示

3.2 不好的注释示例

# 不好的注释示例
# ==============================

# 示例1:注释太明显(多余)
x = 5  # 把5赋值给x
print(x)  # 打印x

# 更好的写法:
score = 5  # 设置分数
print(score)  # 显示分数

# 示例2:注释过时(与实际代码不符)
# 计算两个数的差
result = 10 + 5  # 注释说是计算差,但代码是计算和

# 正确的写法:
# 计算两个数的和
result = 10 + 5

# 示例3:注释没有提供有用信息
# 做了一些计算
a = 10
b = 20
c = a + b

# 更好的写法:
# 计算商品总价
price = 10  # 单价
quantity = 20  # 数量
total = price * quantity  # 总价

3.3 注释练习:找出问题

# 注释练习:找出注释中的问题
print("🔍 注释找错练习")
print("=" * 40)

# 有问题的代码示例
examples = [
    '''
    # 计算
    x = 5
    y = 3
    z = x + y
    ''',
    
    '''
    # 打印一些东西
    # 这是一行代码
    print("Hello")
    ''',
    
    '''
    # 计算两个数的和(这是昨天的代码)
    result = 10 - 5
    ''',
    
    '''
    # a是年龄,b是身高
    age = 12
    height = 1.5
    # 计算BMI
    weight = 40
    bmi = weight / (height * height)
    '''
]

print("找出以下代码中注释的问题:")
for i, code in enumerate(examples, 1):
    print(f"\n{i}. 代码:")
    print(code)
    input("按回车查看分析...")
    
    if i == 1:
        print("  问题:注释太简单,没有说明计算的是什么")
        print("  建议:改为 '# 计算两个数的和'")
    elif i == 2:
        print("  问题:注释没有提供有用信息")
        print("  建议:说明打印的目的")
    elif i == 3:
        print("  问题:注释与代码不符")
        print("  建议:更新注释或修正代码")
    elif i == 4:
        print("  问题:变量名与注释不符")
        print("  建议:注释中的a、b应该用变量名")

📖 第四部分:文档字符串

4.1 什么是文档字符串?

# 文档字符串示例
# ==============================

def calculate_bmi(weight, height):
    """
    计算身体质量指数(BMI)
    
    参数:
        weight: 体重(公斤)
        height: 身高(米)
    
    返回值:
        BMI值(浮点数)
    
    公式:
        BMI = 体重 / (身高²)
    """
    bmi = weight / (height ** 2)
    return bmi

# 使用函数
my_weight = 45
my_height = 1.55
my_bmi = calculate_bmi(my_weight, my_height)
print(f"你的BMI是:{my_bmi:.1f}")

# 查看文档字符串
print("\n📖 函数文档:")
print(calculate_bmi.__doc__)

4.2 文档字符串的实际应用

# 学生信息管理函数
def add_student(name, age, grade):
    """
    添加一个学生到系统
    
    参数:
        name: 学生姓名(字符串)
        age: 学生年龄(整数)
        grade: 学生年级(字符串)
    
    返回值:
        学生信息字典
    
    示例:
        >>> student = add_student("小明", 12, "五年级")
        >>> print(student["name"])
        小明
    """
    student = {
        "name": name,
        "age": age,
        "grade": grade
    }
    return student

def calculate_average(scores):
    """
    计算平均分
    
    参数:
        scores: 成绩列表(列表)
    
    返回值:
        平均分(浮点数)
    
    异常:
        如果列表为空,返回0.0
    """
    if not scores:  # 如果列表为空
        return 0.0
    
    total = sum(scores)
    average = total / len(scores)
    return average

# 使用示例
print("🎒 学生信息管理示例")
print("=" * 40)

# 添加学生
student1 = add_student("张小红", 11, "四年级")
print(f"添加学生:{student1}")

# 计算平均分
scores = [85, 92, 78, 90, 88]
avg = calculate_average(scores)
print(f"平均分:{avg:.1f}")

# 显示函数文档
print("\n📋 函数说明:")
print("1. add_student 函数:")
print(add_student.__doc__[:200] + "...")  # 显示前200个字符

🎮 第五部分:注释游戏

游戏1:注释填空

# 注释填空游戏
print("🎯 注释填空游戏")
print("=" * 40)
print("请为下面的代码添加合适的注释")

# 题目1:计算矩形面积
code1 = '''
# TODO: 添加函数说明
def calculate_area(length, width):
    # TODO: 添加参数说明
    # TODO: 添加返回值说明
    area = length * width
    return area
'''

print("\n1. 矩形面积计算函数:")
print(code1)

input("\n按回车查看参考答案...")

answer1 = '''
"""
计算矩形的面积

参数:
    length: 矩形的长度
    width: 矩形的宽度

返回值:
    矩形的面积
"""
def calculate_area(length, width):
    # 计算面积:长 × 宽
    area = length * width
    return area
'''

print("参考答案:")
print(answer1)

# 题目2:判断闰年
print("\n" + "=" * 40)
code2 = '''
# TODO: 添加函数说明
def is_leap_year(year):
    # TODO: 添加闰年判断逻辑的注释
    if year % 400 == 0:
        return True
    elif year % 100 == 0:
        return False
    elif year % 4 == 0:
        return True
    else:
        return False
'''

print("\n2. 闰年判断函数:")
print(code2)

input("\n按回车查看参考答案...")

answer2 = '''
"""
判断是否是闰年

规则:
    1. 能被400整除的是闰年
    2. 能被100整除但不是400整除的不是闰年
    3. 能被4整除但不是100整除的是闰年
    4. 其他不是闰年

参数:
    year: 年份

返回值:
    如果是闰年返回True,否则返回False
"""
def is_leap_year(year):
    # 能被400整除的是闰年
    if year % 400 == 0:
        return True
    # 能被100整除但不是400整除的不是闰年
    elif year % 100 == 0:
        return False
    # 能被4整除但不是100整除的是闰年
    elif year % 4 == 0:
        return True
    # 其他情况不是闰年
    else:
        return False
'''

print("参考答案:")
print(answer2)

游戏2:代码理解挑战

# 代码理解挑战
print("🔍 代码理解挑战")
print("=" * 40)
print("阅读代码,回答问题")

# 有注释的代码
code_with_comments = '''
# 学生成绩管理系统
# 版本:1.0
# 作者:编程小助手

def calculate_grade(score):
    """
    根据分数判断等级
    
    等级标准:
        A: 90-100分
        B: 80-89分
        C: 70-79分
        D: 60-69分
        F: 0-59分
    
    参数:
        score: 分数(0-100)
    
    返回值:
        等级(字符串)
    """
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    elif score >= 60:
        return "D"
    else:
        return "F"

def analyze_scores(scores):
    """
    分析成绩列表
    
    参数:
        scores: 成绩列表
    
    返回值:
        分析结果字典
    """
    if not scores:  # 如果列表为空
        return {"error": "没有成绩数据"}
    
    # 计算统计信息
    highest = max(scores)  # 最高分
    lowest = min(scores)   # 最低分
    average = sum(scores) / len(scores)  # 平均分
    
    # 统计各等级人数
    grade_counts = {"A": 0, "B": 0, "C": 0, "D": 0, "F": 0}
    for score in scores:
        grade = calculate_grade(score)
        grade_counts[grade] += 1
    
    return {
        "最高分": highest,
        "最低分": lowest,
        "平均分": average,
        "等级分布": grade_counts
    }
'''

print("有注释的代码:")
print(code_with_comments)

# 没有注释的代码
code_without_comments = '''
def cg(s):
    if s >= 90:
        return "A"
    elif s >= 80:
        return "B"
    elif s >= 70:
        return "C"
    elif s >= 60:
        return "D"
    else:
        return "F"

def as(sl):
    if not sl:
        return {"e": "没有数据"}
    
    h = max(sl)
    l = min(sl)
    a = sum(sl) / len(sl)
    
    gc = {"A": 0, "B": 0, "C": 0, "D": 0, "F": 0}
    for s in sl:
        g = cg(s)
        gc[g] += 1
    
    return {
        "h": h,
        "l": l,
        "a": a,
        "gc": gc
    }
'''

print("\n" + "=" * 40)
print("没有注释的代码:")
print(code_without_comments)

# 问题
print("\n" + "=" * 40)
print("❓ 问题:")
print("1. 哪个代码更容易理解?")
print("2. 第二个代码中'cg'函数的作用是什么?")
print("3. 第二个代码中'as'函数返回的字典包含哪些信息?")

input("\n按回车查看答案...")

print("\n✅ 答案:")
print("1. 第一个有注释的代码更容易理解")
print("2. 'cg'函数是根据分数判断等级")
print("3. 包含:最高分(h)、最低分(l)、平均分(a)、等级分布(gc)")
print("\n💡 结论:好的注释让代码更容易理解!")

📁 第六部分:实际项目应用

项目1:带注释的名片生成器

"""
名片生成器 - 第10课项目优化版
功能:生成个性化的电子名片
作者:编程小学员
版本:2.0
添加了完整的注释
"""

import datetime
import random

def get_personal_info():
    """
    收集用户的个人信息
    
    返回值:
        包含用户信息的字典
    """
    print("\n📝 请填写个人信息:")
    print("-" * 30)
    
    # 创建信息字典
    info = {}
    
    # 获取姓名
    info['name'] = input("姓名:")
    # 获取昵称
    info['nickname'] = input("昵称(小名):")
    
    # 获取年龄(带验证)
    while True:
        try:
            age = int(input("年龄:"))
            if 1 <= age <= 20:  # 年龄范围验证
                info['age'] = age
                break
            else:
                print("⚠️ 请输入1-20之间的年龄")
        except ValueError:  # 处理非数字输入
            print("❌ 请输入数字!")
    
    # 获取学校信息
    info['school'] = input("学校:")
    info['class'] = input("班级:")
    
    # 获取联系方式(可选)
    info['phone'] = input("电话(可选):")
    info['email'] = input("邮箱(可选):")
    
    # 获取个人描述
    info['hobby'] = input("爱好:")
    info['favorite_subject'] = input("最喜欢的科目:")
    info['dream'] = input("你的梦想:")
    
    return info

def generate_card_id():
    """
    生成唯一的卡片ID
    
    ID格式:CARD-月日-随机数
    例如:CARD-1015-123
    
    返回值:
        卡片ID(字符串)
    """
    # 获取当前日期
    now = datetime.datetime.now()
    # 格式化为月日
    date_str = now.strftime("%m%d")
    # 生成3位随机数
    random_num = random.randint(100, 999)
    
    # 组合成ID
    card_id = f"CARD-{date_str}-{random_num}"
    return card_id

def create_simple_card(info):
    """
    创建简洁风格的名片
    
    参数:
        info: 用户信息字典
    
    返回值:
        名片字典
    """
    # 生成卡片ID
    card_id = generate_card_id()
    # 获取当前时间
    create_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
    
    # 打印名片
    print("\n" + "=" * 50)
    print("         📇 个人名片 - 简洁版")
    print("=" * 50)
    
    # 显示基本信息
    print(f"名片ID:{card_id}")
    print(f"制作时间:{create_time}")
    print()  # 空行
    
    # 显示个人信息
    print(f"👤 姓名:{info['name']}")
    if info['nickname']:  # 如果有昵称才显示
        print(f"🏷️  昵称:{info['nickname']}")
    print(f"🎂 年龄:{info['age']}岁")
    print(f"🏫 学校:{info['school']}")
    print(f"📚 班级:{info['class']}")
    
    # 显示联系方式(如果有)
    if info['phone']:
        print(f"📱 电话:{info['phone']}")
    if info['email']:
        print(f"📧 邮箱:{info['email']}")
    
    # 显示个人描述
    print(f"🎯 爱好:{info['hobby']}")
    print(f"📖 最喜欢科目:{info['favorite_subject']}")
    print(f"✨ 梦想:{info['dream']}")
    
    print("=" * 50)
    
    # 返回名片数据
    return {
        'id': card_id,
        'info': info,
        'time': create_time
    }

def save_card_to_file(card, style="简洁风格"):
    """
    将名片保存到文本文件
    
    参数:
        card: 名片字典
        style: 名片风格
    
    返回值:
        成功返回True,失败返回False
    """
    # 检查是否有名片数据
    if not card:
        print("❌ 没有可保存的名片")
        return False
    
    # 获取信息
    info = card['info']
    # 生成文件名:姓名_风格_名片.txt
    filename = f"{info['name']}_{style}_名片.txt"
    
    try:
        # 打开文件进行写入
        with open(filename, 'w', encoding='utf-8') as f:
            # 写入文件头
            f.write("=" * 50 + "\n")
            f.write("          个人名片文件\n")
            f.write("=" * 50 + "\n\n")
            
            # 写入基本信息
            f.write(f"名片ID:{card.get('id', '未知')}\n")
            f.write(f"制作时间:{card.get('time', '未知')}\n")
            f.write(f"名片风格:{style}\n\n")
            
            # 写入个人信息
            f.write("【基本信息】\n")
            f.write(f"姓名:{info['name']}\n")
            if info.get('nickname'):
                f.write(f"昵称:{info['nickname']}\n")
            f.write(f"年龄:{info['age']}岁\n")
            f.write(f"学校:{info['school']}\n")
            f.write(f"班级:{info['class']}\n\n")
            
            # 写入联系方式
            f.write("【联系信息】\n")
            if info.get('phone'):
                f.write(f"电话:{info['phone']}\n")
            if info.get('email'):
                f.write(f"邮箱:{info['email']}\n\n")
            
            # 写入个人描述
            f.write("【个人描述】\n")
            f.write(f"爱好:{info['hobby']}\n")
            f.write(f"最喜欢科目:{info['favorite_subject']}\n")
            f.write(f"梦想:{info['dream']}\n")
            
            # 文件尾
            f.write("\n" + "=" * 50 + "\n")
        
        # 成功提示
        print(f"✅ 名片已保存到:{filename}")
        return True
        
    except Exception as e:  # 捕获所有异常
        # 失败提示
        print(f"❌ 保存失败:{e}")
        return False

def main():
    """
    主函数 - 程序入口点
    
    控制程序的主要流程:
    1. 显示欢迎信息
    2. 收集用户信息
    3. 生成名片
    4. 询问是否保存
    5. 退出程序
    """
    # 程序标题
    print("🎫" * 15)
    print("    智能名片生成系统 v2.0")
    print("🎫" * 15)
    
    print("\n欢迎使用智能名片生成系统!")
    
    # 收集个人信息
    info = get_personal_info()
    
    # 主循环
    while True:
        # 显示菜单
        print("\n" + "=" * 30)
        print("请选择名片风格:")
        print("1. 🎨 简洁风格")
        print("2. ✨ 花式风格")
        print("3. 🎒 学生风格")
        print("4. 🔄 重新填写信息")
        print("5. 🚪 退出系统")
        print("=" * 30)
        
        # 获取用户选择
        choice = input("\n你的选择(1-5):")
        
        # 处理选择
        if choice == "1":
            # 创建简洁风格名片
            card = create_simple_card(info)
            
            # 询问是否保存
            save = input("\n是否保存到文件?(是/否):")
            if save.lower() in ['是', 'yes', 'y']:
                save_card_to_file(card, "简洁风格")
        
        elif choice == "2":
            # TODO: 实现花式风格
            print("\n✨ 花式风格功能开发中...")
        
        elif choice == "3":
            # TODO: 实现学生风格
            print("\n🎒 学生风格功能开发中...")
        
        elif choice == "4":
            # 重新填写信息
            print("\n重新填写信息:")
            info = get_personal_info()
        
        elif choice == "5":
            # 退出程序
            print("\n🎉 感谢使用名片生成系统!")
            print("再见!👋")
            break
        
        else:
            # 无效选择
            print("❌ 请选择1-5的数字!")
        
        # 暂停,让用户看到结果
        input("\n按回车键继续...")

# 程序入口
if __name__ == "__main__":
    """
    这是程序的入口点
    当直接运行这个文件时,会从这里开始执行
    """
    main()

项目2:带注释的计算器

"""
简单计算器程序
功能:进行基本的数学运算
支持:加、减、乘、除、取余、幂运算
作者:编程学习者
版本:1.0
"""

def add(a, b):
    """
    加法运算
    
    参数:
        a: 第一个数
        b: 第二个数
    
    返回值:
        两数之和
    """
    return a + b

def subtract(a, b):
    """减法运算"""
    return a - b

def multiply(a, b):
    """乘法运算"""
    return a * b

def divide(a, b):
    """
    除法运算
    
    参数:
        a: 被除数
        b: 除数
    
    返回值:
        商(浮点数)
    
    异常:
        如果除数为0,返回错误信息
    """
    if b == 0:
        return "错误:除数不能为0!"
    return a / b

def modulo(a, b):
    """取余运算"""
    if b == 0:
        return "错误:除数不能为0!"
    return a % b

def power(a, b):
    """幂运算(a的b次方)"""
    return a ** b

def get_number_input(prompt):
    """
    获取用户输入的数字
    
    参数:
        prompt: 提示信息
    
    返回值:
        用户输入的数字(浮点数)
    
    说明:
        会一直提示用户,直到输入有效的数字
    """
    while True:
        try:
            # 获取用户输入
            user_input = input(prompt)
            # 尝试转换为浮点数
            number = float(user_input)
            return number
        except ValueError:
            # 如果转换失败,提示重新输入
            print("❌ 请输入有效的数字!")

def show_menu():
    """
    显示计算器菜单
    
    返回值:
        用户选择的操作编号
    """
    print("\n" + "=" * 40)
    print("🧮 简单计算器")
    print("=" * 40)
    print("请选择运算:")
    print("1. 加法 (+)")
    print("2. 减法 (-)")
    print("3. 乘法 (×)")
    print("4. 除法 (÷)")
    print("5. 取余 (%)")
    print("6. 幂运算 (^)")
    print("7. 退出")
    print("=" * 40)
    
    # 获取用户选择
    choice = input("请选择 (1-7): ")
    return choice

def main():
    """
    计算器主程序
    
    流程:
    1. 显示菜单
    2. 获取用户选择
    3. 获取操作数
    4. 执行计算
    5. 显示结果
    6. 重复直到退出
    """
    print("欢迎使用简单计算器!")
    
    while True:
        # 显示菜单
        choice = show_menu()
        
        # 处理退出
        if choice == "7":
            print("\n感谢使用计算器,再见!👋")
            break
        
        # 检查选择是否有效
        if choice not in ["1", "2", "3", "4", "5", "6"]:
            print("❌ 请选择1-7的数字!")
            continue
        
        # 获取操作数
        print("\n请输入操作数:")
        num1 = get_number_input("第一个数: ")
        num2 = get_number_input("第二个数: ")
        
        # 根据选择执行相应的运算
        if choice == "1":  # 加法
            result = add(num1, num2)
            symbol = "+"
        elif choice == "2":  # 减法
            result = subtract(num1, num2)
            symbol = "-"
        elif choice == "3":  # 乘法
            result = multiply(num1, num2)
            symbol = "×"
        elif choice == "4":  # 除法
            result = divide(num1, num2)
            symbol = "÷"
        elif choice == "5":  # 取余
            result = modulo(num1, num2)
            symbol = "%"
        elif choice == "6":  # 幂运算
            result = power(num1, num2)
            symbol = "^"
        
        # 显示结果
        print(f"\n📊 计算结果:")
        print(f"  {num1} {symbol} {num2} = {result}")
        
        # 暂停,让用户看到结果
        input("\n按回车键继续...")

# 程序入口
if __name__ == "__main__":
    main()

项目3:注释检查工具

"""
注释检查工具
功能:检查Python文件中的注释情况
帮助:养成写注释的好习惯
"""

import os

def check_file_comments(filename):
    """
    检查Python文件的注释情况
    
    参数:
        filename: 要检查的文件名
    
    返回值:
        检查结果字典
    """
    # 初始化统计
    stats = {
        'total_lines': 0,      # 总行数
        'code_lines': 0,       # 代码行数
        'comment_lines': 0,    # 注释行数
        'empty_lines': 0,      # 空行数
        'has_docstring': False, # 是否有文档字符串
        'comment_ratio': 0.0,  # 注释比例
        'suggestions': []      # 改进建议
    }
    
    try:
        # 打开文件
        with open(filename, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        
        # 统计行数
        stats['total_lines'] = len(lines)
        
        in_multiline_comment = False
        
        for i, line in enumerate(lines, 1):
            # 去除两端的空白字符
            stripped_line = line.strip()
            
            # 跳过空行
            if not stripped_line:
                stats['empty_lines'] += 1
                continue
            
            # 检查是否是注释
            if stripped_line.startswith('#'):
                stats['comment_lines'] += 1
            elif stripped_line.startswith('"""') or stripped_line.startswith("'''"):
                if in_multiline_comment:
                    in_multiline_comment = False
                else:
                    in_multiline_comment = True
                    stats['has_docstring'] = True
            else:
                # 如果不是注释也不是空行,就是代码行
                if not in_multiline_comment:
                    stats['code_lines'] += 1
        
        # 计算注释比例
        if stats['code_lines'] > 0:
            stats['comment_ratio'] = stats['comment_lines'] / stats['code_lines']
        
        # 生成建议
        if stats['comment_ratio'] < 0.1:  # 注释比例低于10%
            stats['suggestions'].append("💡 注释太少,建议增加注释")
        if not stats['has_docstring']:
            stats['suggestions'].append("💡 建议添加文档字符串")
        if stats['comment_lines'] == 0:
            stats['suggestions'].append("⚠️ 没有找到任何注释!")
        
        return stats
        
    except FileNotFoundError:
        print(f"❌ 文件不存在:{filename}")
        return None
    except Exception as e:
        print(f"❌ 读取文件出错:{e}")
        return None

def analyze_my_code():
    """
    分析自己的代码文件
    """
    print("🔍 注释检查工具")
    print("=" * 50)
    
    # 获取当前目录下的Python文件
    python_files = []
    for file in os.listdir('.'):
        if file.endswith('.py'):
            python_files.append(file)
    
    if not python_files:
        print("没有找到Python文件")
        return
    
    print("找到以下Python文件:")
    for i, file in enumerate(python_files, 1):
        print(f"{i}. {file}")
    
    # 让用户选择文件
    try:
        choice = int(input(f"\n选择要检查的文件 (1-{len(python_files)}): "))
        if 1 <= choice <= len(python_files):
            filename = python_files[choice-1]
            
            print(f"\n正在检查文件:{filename}")
            print("-" * 50)
            
            # 检查文件
            result = check_file_comments(filename)
            
            if result:
                # 显示结果
                print("📊 检查结果:")
                print(f"  总行数:{result['total_lines']}")
                print(f"  代码行:{result['code_lines']}")
                print(f"  注释行:{result['comment_lines']}")
                print(f"  空行数:{result['empty_lines']}")
                print(f"  注释比例:{result['comment_ratio']:.1%}")
                
                if result['has_docstring']:
                    print("  文档字符串:✅ 有")
                else:
                    print("  文档字符串:❌ 无")
                
                # 显示建议
                if result['suggestions']:
                    print("\n💡 改进建议:")
                    for suggestion in result['suggestions']:
                        print(f"  {suggestion}")
                else:
                    print("\n✅ 注释情况良好!")
        else:
            print("❌ 选择无效!")
            
    except ValueError:
        print("❌ 请输入数字!")

# 运行检查工具
if __name__ == "__main__":
    analyze_my_code()

📅 下节课预告

第17课:交互式故事书——制作分支故事

下节课你将学习:

  1. 使用条件语句创建分支故事
  2. 根据用户选择展示不同情节
  3. 制作有趣的互动故事
  4. 管理复杂的故事线
  5. 添加故事选项和结局

预习思考

  1. 如何让程序根据用户选择做出不同反应?
  2. 如何设计有趣的故事情节?
  3. 如何管理多个故事分支?

💬 给家长的话

亲爱的家长

今天孩子学习了编程中非常重要的好习惯——写注释。注释是代码的"说明书",能让代码更容易理解和维护。

孩子今天学会了

  1. ✅ 单行注释和多行注释的写法
  2. ✅ 如何编写有意义的注释
  3. ✅ 文档字符串的使用
  4. ✅ 识别好的注释和不好的注释
  5. ✅ 养成写注释的好习惯

注释的重要性

| 注释类型 | 用途 | 重要性 | 习惯培养 |

|---------|------|--------|---------|

| 单行注释 | 解释一行代码 | 理解具体实现 | 细节关注 |

| 多行注释 | 解释代码块 | 理解整体逻辑 | 整体思维 |

| 文档字符串 | 说明函数用途 | 接口文档 | 规范意识 |

| TODO注释 | 标记待办事项 | 任务管理 | 规划能力 |

您可以这样做

习惯培养

  1. 代码审查:和孩子一起阅读带注释的代码
  2. 注释练习:让孩子为已有的代码添加注释
  3. 文档阅读:一起阅读Python官方文档
  4. 习惯打卡:鼓励孩子为每个程序都写注释

思维训练

  1. 讨论:为什么要写注释?写给谁看?
  2. 思考:什么样的注释是有帮助的?
  3. 比较:有注释和没注释的代码区别
  4. 实践:检查自己以前代码的注释情况

温馨提示

  • 写注释是好习惯,越早养成越好
  • 注释要简洁明了,不要过度注释
  • 鼓励孩子既写代码也写注释
  • 注释应该解释"为什么",而不是"是什么"

🏆 今日成就

完成了今天的学习,你:

📝 理解了注释的重要性

💡 学会了写有意义的注释

📖 掌握了文档字符串

🔍 能识别注释好坏

养成了注释习惯

挑战任务

  1. 为之前写的所有程序添加注释
  2. 创建一个带完整注释的新程序
  3. 检查并改进现有代码的注释
  4. 制作代码注释规范手册

🌟 编程心法

代码是写给计算机的指令
注释是写给人类的说明
好的注释
是给未来自己的信
是给合作者的地图
是给使用者的指南
从今天起
让每行重要代码都有注释
让每个函数都有文档
让习惯成为自然
让代码因注释而清晰

记住:优秀的程序员不仅会写能运行的代码,还会写让人能看懂的代码。注释就是你看懂代码的桥梁!


第16课结束。你现在已经养成了写注释的好习惯!

实践任务:

1. 为所有旧程序添加注释

2. 创建带完整注释的新项目

3. 检查改进代码注释

4. 制定个人注释规范

下节课,让我们创作交互式故事,让程序更有趣!

第17课见!📖