第6章 函数及其应用
6.3 变量的作用域

📚 本节学习目标
·理解变量作用域的概念及其重要性
·掌握局部变量的定义、作用范围和使用方法
·掌握全局变量的定义、作用范围和使用方法
·理解局部变量与全局变量的区别与联系
·能够正确处理变量命名冲突问题
·掌握global关键字的使用方法

🎯 课程导入:为什么需要学习变量作用域?
在之前的章节中,我们已经学习了如何定义变量、如何使用各种数据类型、如何编写分支和循环程序,以及如何定义和调用函数。但是,当我们开始编写更复杂的程序时,一个重要的问题就会出现:在程序的某个位置定义的变量,在程序的其他位置能否使用?
让我们先看一个简单的例子:
# 思考:这段代码能正常运行吗?def calculate_area(): radius = 5 # 在函数内部定义变量 area = 3.14 * radius ** 2 print(f"圆的面积是:{area}")calculate_area()print(radius) # 在函数外部访问函数内部定义的变量
运行这段代码会发生什么?让我们一起来探索变量作用域的奥秘!

6.3.1 局部变量
一、什么是局部变量
局部变量(Local Variable) 是在函数内部定义的变量。它是函数的”私有财产”,只有该函数才能访问和使用。
📖 核心特征
特征 | 说明 |
定义位置 | 函数内部(函数体的缩进块内) |
作用范围 | 仅限于该函数的函数体 |
生命周期 | 函数被调用时创建,函数执行结束时销毁 |
访问权限 | 只能在函数内部访问,函数外部不可见 |
💡 知识点详解
在Python中,当我们调用一个函数时,系统会为该函数创建一个独立的命名空间(Namespace)。这个命名空间就像一个独立的”房间”,函数内部定义的变量就存放在这个”房间”里。当函数执行完毕后,这个”房间”会被拆除,里面的变量也会随之消失。
类比理解:想象CK学校有很多教室,每个教室就像一个函数。每个教室里的桌椅(局部变量)只属于这个教室,其他教室的学生不能随意使用。当放学后(函数执行完毕),教室关闭,里面的物品也就无法被访问了。
为什么需要局部变量?
局部变量的设计有以下几个重要目的:
1.数据隔离:不同函数可以使用相同名字的变量而不会相互干扰
2.内存管理:函数执行完毕后,局部变量占用的内存会自动释放
3.代码模块化:每个函数维护自己的数据,降低代码耦合度

二、局部变量的基本使用
📝 示例1:局部变量的基本定义与使用
# 定义一个函数,计算CK学校学生成绩的平均值def calculate_average(): # 以下三个变量都是局部变量 score1 = 85 # 局部变量:第一门课程成绩 score2 = 92 # 局部变量:第二门课程成绩 score3 = 78 # 局部变量:第三门课程成绩 # average也是局部变量 average = (score1 + score2 + score3) / 3 print(f"CK学校学生三门课程的平均成绩是:{average:.2f}分")# 调用函数calculate_average()# 尝试在函数外部访问局部变量# print(score1) # 这行代码会报错!NameError: name 'score1' is not defined
代码解析: - 变量score1、score2、score3和average都是在函数calculate_average()内部定义的 - 它们都是局部变量,作用范围仅限于该函数内部 - 在函数外部尝试访问这些变量会导致NameError错误

📝 示例2:局部变量的生命周期
def show_local_variable(): local_msg = "我是CK学校的学生" # 局部变量被创建 print("函数内部:", local_msg) # 函数执行完毕,局部变量local_msg被销毁# 第一次调用函数print("=== 第一次调用 ===")show_local_variable()# 第二次调用函数print("\n=== 第二次调用 ===")show_local_variable()# 在函数外部无法访问局部变量# print(local_msg) # NameError: name 'local_msg' is not defined
运行结果:
=== 第一次调用 ===函数内部: 我是CK学校的学生=== 第二次调用 ===函数内部: 我是CK学校的学生
知识点说明: - 每次调用函数时,局部变量都会被重新创建 - 函数执行完毕后,局部变量会被自动销毁 - 两次调用之间,局部变量的值不会保留(每次都是全新的)

三、不同函数中的同名局部变量
📝 示例3:不同函数可以定义同名局部变量
# 函数1:计算CK学校男生人数def count_boys(): count = 150 # 局部变量count print(f"CK学校男生人数:{count}人")# 函数2:计算CK学校女生人数def count_girls(): count = 180 # 另一个局部变量count(与上面的count互不影响) print(f"CK学校女生人数:{count}人")# 函数3:计算CK学校总人数def count_total(): count = 150 + 180 # 又一个局部变量count print(f"CK学校总人数:{count}人")# 调用三个函数count_boys()count_girls()count_total()
运行结果:
CK学校男生人数:150人CK学校女生人数:180人CK学校总人数:330人
重要结论: - 不同函数中的同名局部变量是相互独立的 - 它们存储在不同的内存空间中,互不干扰 - 这就像CK学校的不同班级可以有同名的学生,但他们是不同的人

四、函数参数也是局部变量
📝 示例4:函数参数的作用域
def greet_student(name, grade): # name和grade是函数参数,它们也是局部变量 message = f"欢迎{name}同学,你是{grade}年级的学生!" # message也是局部变量 print(message) print(f"在函数内部,name的值是:{name}") print(f"在函数内部,grade的值是:{grade}")# 调用函数greet_student("张三", "大一")# 尝试在函数外部访问参数# print(name) # NameError: name 'name' is not defined# print(grade) # NameError: name 'grade' is not defined# print(message) # NameError: name 'message' is not defined
知识点说明: - 函数的形式参数(形参)也是局部变量 - 它们的作用范围同样仅限于函数内部 - 函数调用时,实参的值会被传递给形参,但实参本身不受影响

五、局部变量与前面章节知识点的串联
🔗 串联回顾:第2章数据类型与变量
在第2章中,我们学习了Python的基本数据类型和变量的定义。现在我们知道,当时在主程序中定义的变量,其实都是全局变量。而在函数内部定义的变量,则是局部变量。
# 回顾第2章:变量的定义x = 10 # 这是一个全局变量def demo(): x = 20 # 这是一个局部变量,与全局变量x同名但不同 print(f"函数内部的x = {x}")demo()print(f"函数外部的x = {x}")
运行结果:
函数内部的x = 20函数外部的x = 10

🔗 串联回顾:第3章分支程序设计
在第3章中,我们学习了分支语句。在函数内部,我们同样可以使用分支语句,分支语句中定义的变量也是局部变量。
def check_score(score): # 在分支语句中定义的变量也是局部变量 if score >= 90: level = "优秀" elif score >= 80: level = "良好" elif score >= 60: level = "及格" else: level = "不及格" print(f"CK学校学生成绩{score}分,等级为:{level}") # level是局部变量,作用范围是整个函数check_score(85)# print(level) # NameError: name 'level' is not defined

🔗 串联回顾:第4章循环程序设计
在第4章中,我们学习了循环语句。在函数内部使用循环时,循环变量也是局部变量。
def print_stars(n): # 循环变量i是局部变量 for i in range(n): print("★", end="") print() print(f"循环结束后,i的值是:{i}") # 可以在函数内访问 # i的作用范围是整个函数print_stars(5)# print(i) # NameError: name 'i' is not defined
运行结果:
★★★★★循环结束后,i的值是:4

🔗 串联回顾:第5章组合数据类型
在第5章中,我们学习了列表、元组、字典和集合。在函数内部定义的组合数据类型变量也是局部变量。
def process_grades(): # 在函数内部定义列表(局部变量) grades = [85, 92, 78, 90, 88] # 计算平均分 average = sum(grades) / len(grades) # 找出最高分和最低分 max_grade = max(grades) min_grade = min(grades) print(f"CK学校班级成绩列表:{grades}") print(f"平均分:{average:.2f}") print(f"最高分:{max_grade}") print(f"最低分:{min_grade}")process_grades()# print(grades) # NameError: name 'grades' is not defined

六、局部变量的实际应用案例
📝 综合案例:CK学校学生信息处理系统
def process_student_info(): """ 处理CK学校学生信息的函数 演示局部变量的综合使用 """ # 局部变量:学生姓名列表 names = ["李明", "王芳", "张伟", "刘洋", "陈静"] # 局部变量:学生成绩字典 scores = { "李明": 85, "王芳": 92, "张伟": 78, "刘洋": 90, "陈静": 88 } # 局部变量:统计信息 total_students = len(names) total_score = 0 excellent_count = 0 # 使用循环处理数据 for name in names: # name是局部变量 score = scores[name] # score是局部变量 total_score += score if score >= 90: excellent_count += 1 # 计算统计数据 average_score = total_score / total_students # 输出结果 print("=" * 40) print("CK学校学生成绩统计报告") print("=" * 40) print(f"学生总人数:{total_students}人") print(f"平均成绩:{average_score:.2f}分") print(f"优秀人数(≥90分):{excellent_count}人") print("=" * 40)# 调用函数process_student_info()# 所有局部变量在函数外部都无法访问# print(names) # NameError# print(scores) # NameError# print(total_students) # NameError
运行结果:
========================================CK学校学生成绩统计报告========================================学生总人数:5人平均成绩:86.60分优秀人数(≥90分):2人========================================

6.3.2 全局变量
一、什么是全局变量
全局变量(Global Variable) 是在函数外部定义的变量。它是整个程序的”公共财产”,程序中的任何位置都可以访问和使用。
📖 核心特征
特征 | 说明 |
定义位置 | 函数外部(通常在程序开头) |
作用范围 | 整个程序,包括所有函数内部 |
生命周期 | 从程序开始运行到程序结束 |
访问权限 | 程序的任何位置都可以访问 |
💡 知识点详解
全局变量定义在程序的顶层,不属于任何函数。它们存储在程序的全局命名空间中,就像CK学校的公共区域(如操场、图书馆),所有学生(函数)都可以使用。
类比理解:如果把局部变量比作教室里的桌椅,那么全局变量就像是CK学校操场上的篮球架。任何班级的学生(任何函数)都可以去操场使用篮球架。
全局变量的使用场景
1.配置信息:如学校名称、系统版本等常量
2.共享数据:多个函数需要访问的同一数据
3.状态标记:记录程序运行状态

二、全局变量的基本使用
📝 示例1:全局变量的定义与访问
# 在函数外部定义全局变量school_name = "CK学校" # 全局变量student_count = 5000 # 全局变量school_location = "重庆" # 全局变量def show_school_info(): """显示学校信息的函数""" # 在函数内部可以直接访问全局变量 print("=" * 40) print("学校基本信息") print("=" * 40) print(f"学校名称:{school_name}") print(f"学生人数:{student_count}人") print(f"学校位置:{school_location}") print("=" * 40)def show_welcome(): """显示欢迎信息的函数""" # 另一个函数也可以访问相同的全局变量 print(f"欢迎来到{school_location}的{school_name}!") print(f"我们学校共有{student_count}名学生。")# 调用函数show_school_info()print()show_welcome()# 在主程序中也可以访问全局变量print(f"\n在主程序中访问:{school_name}位于{school_location}")
运行结果:
========================================学校基本信息========================================学校名称:CK学校学生人数:5000人学校位置:重庆========================================欢迎来到重庆的CK学校!我们学校共有5000名学生。在主程序中访问:CK学校位于重庆

三、全局变量与局部变量的同名问题
当全局变量和局部变量同名时,Python会按照特定的规则处理。
📝 示例2:同名变量的处理规则
# 定义全局变量count = 100 # 全局变量def show_count(): """演示同名变量""" count = 50 # 这是局部变量,与全局变量同名 print(f"函数内部的count = {count}") # 访问的是局部变量def show_global_count(): """演示访问全局变量""" print(f"函数内部访问全局变量count = {count}") # 访问的是全局变量# 调用函数show_count()show_global_count()# 在主程序中访问print(f"主程序中的count = {count}") # 访问的是全局变量
运行结果:
函数内部的count = 50函数内部访问全局变量count = 100主程序中的count = 100
重要规则: - 当函数内部有与全局变量同名的局部变量时,函数内部优先使用局部变量 - 这就是Python的LEGB规则(Local → Enclosing → Global → Built-in) - 函数会按照”局部 → 嵌套 → 全局 → 内置”的顺序查找变量

四、使用global关键字修改全局变量
默认情况下,如果在函数内部对变量赋值,Python会创建一个新的局部变量。如果我们想要在函数内部修改全局变量的值,需要使用global关键字。
📝 示例3:不使用global关键字的问题
# 全局变量total_score = 0def add_score(score): """尝试修改全局变量(错误方式)""" # 这行代码会创建一个新的局部变量total_score,而不是修改全局变量 total_score = score # 这是局部变量! print(f"函数内部 total_score = {total_score}")add_score(85)print(f"函数外部 total_score = {total_score}") # 全局变量没有被修改
运行结果:
函数内部 total_score = 85函数外部 total_score = 0

📝 示例4:使用global关键字正确修改全局变量
# 全局变量total_score = 0student_count = 0def add_score(score): """正确修改全局变量""" global total_score, student_count # 声明要使用全局变量 total_score += score # 修改全局变量 student_count += 1 # 修改全局变量 print(f"添加成绩:{score}分")def show_average(): """显示平均分""" if student_count > 0: average = total_score / student_count print(f"当前总人数:{student_count}人") print(f"当前总成绩:{total_score}分") print(f"当前平均分:{average:.2f}分") else: print("暂无学生成绩数据")# 添加多个学生成绩add_score(85)add_score(92)add_score(78)add_score(90)print()show_average()
运行结果:
添加成绩:85分添加成绩:92分添加成绩:78分添加成绩:90分当前总人数:4人当前总成绩:345分当前平均分:86.25分

五、全局变量的使用场景与注意事项
✅ 适合使用全局变量的场景
1.配置信息:如程序运行参数、系统设置
2.共享状态:多个函数需要共享的数据
3.常量定义:如数学常数、程序版本号等
⚠️ 使用全局变量的注意事项
1.尽量少用全局变量:过多使用全局变量会使程序难以维护和调试
2.命名要清晰:全局变量命名要有意义,最好使用大写字母或特定前缀
3.修改要谨慎:在函数内修改全局变量时要特别小心,最好添加注释

📝 示例5:全局变量的最佳实践
# ===== 全局变量定义区 =====# 使用大写字母命名常量类型的全局变量SCHOOL_NAME = "CK学校"SCHOOL_LOCATION = "重庆"MAX_STUDENTS = 10000# 使用下划线前缀或特定命名标识可变全局变量g_total_enrolled = 0 # g_前缀表示globalg_student_list = [] # 全局学生列表def enroll_student(name, score): """学生入学注册函数""" global g_total_enrolled, g_student_list if g_total_enrolled >= MAX_STUDENTS: print(f"抱歉,{SCHOOL_NAME}招生名额已满!") return False # 添加学生信息 g_student_list.append({"name": name, "score": score}) g_total_enrolled += 1 print(f"恭喜{name}同学成功注册{SCHOOL_NAME}!") print(f"当前已注册人数:{g_total_enrolled}/{MAX_STUDENTS}") return Truedef show_enrollment_status(): """显示注册状态""" print("=" * 50) print(f"{SCHOOL_NAME}({SCHOOL_LOCATION})招生情况") print("=" * 50) print(f"最大招生人数:{MAX_STUDENTS}人") print(f"已注册人数:{g_total_enrolled}人") print(f"剩余名额:{MAX_STUDENTS - g_total_enrolled}人") if g_student_list: print("\n已注册学生名单:") for i, student in enumerate(g_student_list, 1): print(f" {i}. {student['name']} - 入学成绩:{student['score']}分") print("=" * 50)# 测试代码enroll_student("张三", 85)enroll_student("李四", 92)enroll_student("王五", 78)print()show_enrollment_status()
运行结果:
恭喜张三同学成功注册CK学校!当前已注册人数:1/10000恭喜李四同学成功注册CK学校!当前已注册人数:2/10000恭喜王五同学成功注册CK学校!当前已注册人数:3/10000==================================================CK学校(重庆)招生情况==================================================最大招生人数:10000人已注册人数:3人剩余名额:9997人已注册学生名单:1. 张三 - 入学成绩:85分2. 李四 - 入学成绩:92分3. 王五 - 入学成绩:78分==================================================

六、全局变量与前面章节知识点的串联
🔗 串联回顾:第2章数据类型
在第2章中,我们在主程序中定义的变量其实就是全局变量。现在我们理解了,这些变量之所以能在程序的任何地方使用,是因为它们是全局变量。
# 回顾第2章的知识# 在主程序中定义的变量是全局变量course_name = "Python基础及应用" # 全局变量credits = 3 # 全局变量def show_course_info(): """显示课程信息""" # 可以直接访问全局变量 print(f"课程名称:{course_name}") print(f"学分:{credits}学分")show_course_info()

🔗 串联回顾:第3章分支程序设计
全局变量可以与分支语句结合使用,实现程序状态的共享。
# 全局变量:用户登录状态is_logged_in = Falseuser_role = "guest" # guest, student, teacher, admindef login(username, password): """用户登录函数""" global is_logged_in, user_role # 模拟登录验证 if username == "admin" and password == "123456": is_logged_in = True user_role = "admin" print(f"欢迎管理员登录CK学校系统!") elif username == "teacher" and password == "123456": is_logged_in = True user_role = "teacher" print(f"欢迎教师登录CK学校系统!") elif username == "student" and password == "123456": is_logged_in = True user_role = "student" print(f"欢迎学生登录CK学校系统!") else: print("用户名或密码错误!")def check_permission(): """检查用户权限""" if not is_logged_in: print("请先登录!") return if user_role == "admin": print("您拥有管理员权限,可以进行所有操作。") elif user_role == "teacher": print("您拥有教师权限,可以管理学生成绩。") elif user_role == "student": print("您拥有学生权限,可以查看自己的成绩。")# 测试登录和权限检查login("admin", "123456")check_permission()print()login("student", "123456")check_permission()

🔗 串联回顾:第4章循环程序设计
全局变量可以与循环结合,实现数据的累积处理。
# 全局变量:统计数据total_sum = 0count = 0numbers = []def add_number(num): """添加数字并更新统计""" global total_sum, count, numbers numbers.append(num) total_sum += num count += 1def show_statistics(): """显示统计信息""" if count == 0: print("暂无数据") return average = total_sum / count maximum = max(numbers) minimum = min(numbers) print("=" * 40) print("CK学校数据分析统计") print("=" * 40) print(f"数据列表:{numbers}") print(f"数据个数:{count}") print(f"数据总和:{total_sum}") print(f"平均值:{average:.2f}") print(f"最大值:{maximum}") print(f"最小值:{minimum}") print("=" * 40)# 使用循环添加数据for i in range(1, 6): add_number(i * 10)show_statistics()

🔗 串联回顾:第5章组合数据类型
全局变量可以是列表、字典等组合数据类型,实现数据的共享和持久化。
# 全局变量:学生信息数据库student_database = { "students": [], "total_count": 0}def add_student(student_id, name, grade, scores): """添加学生信息""" global student_database student = { "id": student_id, "name": name, "grade": grade, "scores": scores, "average": sum(scores) / len(scores) if scores else 0 } student_database["students"].append(student) student_database["total_count"] += 1 print(f"成功添加学生:{name}(学号:{student_id})")def find_student(student_id): """查找学生信息""" for student in student_database["students"]: if student["id"] == student_id: return student return Nonedef show_all_students(): """显示所有学生信息""" print("=" * 60) print(f"CK学校学生信息库(共{student_database['total_count']}人)") print("=" * 60) for student in student_database["students"]: print(f"学号:{student['id']}") print(f"姓名:{student['name']}") print(f"年级:{student['grade']}") print(f"成绩:{student['scores']}") print(f"平均分:{student['average']:.2f}") print("-" * 40)# 添加学生add_student("2023001", "张三", "大一", [85, 92, 78])add_student("2023002", "李四", "大一", [90, 88, 95])add_student("2023003", "王五", "大一", [75, 82, 88])print()show_all_students()# 查找学生print("\n查找学号为2023002的学生:")student = find_student("2023002")if student: print(f"找到学生:{student['name']},平均分:{student['average']:.2f}")

局部变量与全局变量的对比总结
📊 对比表格
特性 | 局部变量 | 全局变量 |
定义位置 | 函数内部 | 函数外部(模块级别) |
作用范围 | 仅在定义它的函数内部 | 整个程序(模块) |
生命周期 | 函数调用时创建,函数结束时销毁 | 程序开始时创建,程序结束时销毁 |
访问方式 | 直接访问 | 函数内直接访问(读取),修改需用global |
命名冲突 | 不同函数可同名,互不影响 | 整个程序唯一 |
内存效率 | 函数结束后释放内存 | 程序运行期间一直占用内存 |
使用建议 | 优先使用 | 谨慎使用 |
修改方式 | 直接修改 | 需用 global 声明 |

📝 综合案例:CK学校成绩管理系统
# ==================== 全局变量定义区 ====================SCHOOL_NAME = "CK学校"MAX_STUDENTS = 100# 全局状态变量g_student_count = 0g_total_score = 0.0g_highest_score = 0.0g_lowest_score = 100.0# ==================== 函数定义区 ====================def add_student_score(name, score): """ 添加学生成绩 参数: name: 学生姓名(局部变量) score: 学生成绩(局部变量) """ global g_student_count, g_total_score, g_highest_score, g_lowest_score # 局部变量:验证结果 is_valid = True error_msg = "" # 数据验证 if not name: is_valid = False error_msg = "姓名不能为空" elif not (0 <= score <= 100): is_valid = False error_msg = "成绩必须在0-100之间" elif g_student_count >= MAX_STUDENTS: is_valid = False error_msg = "学生人数已达上限" if not is_valid: print(f"添加失败:{error_msg}") return False # 更新全局统计数据 g_student_count += 1 g_total_score += score if score > g_highest_score: g_highest_score = score if score < g_lowest_score: g_lowest_score = score print(f"✓ 成功添加:{name},成绩:{score}分") return Truedef show_statistics(): """显示统计信息""" # 局部变量 separator = "=" * 50 print(separator) print(f"{SCHOOL_NAME}成绩统计报告") print(separator) if g_student_count == 0: print("暂无学生成绩数据") else: # 局部变量:计算平均值 average = g_total_score / g_student_count print(f"学生人数:{g_student_count}人") print(f"平均成绩:{average:.2f}分") print(f"最高成绩:{g_highest_score}分") print(f"最低成绩:{g_lowest_score}分") print(separator)def reset_statistics(): """重置统计数据""" global g_student_count, g_total_score, g_highest_score, g_lowest_score g_student_count = 0 g_total_score = 0.0 g_highest_score = 0.0 g_lowest_score = 100.0 print("统计数据已重置")# ==================== 主程序 ====================print(f"欢迎使用{SCHOOL_NAME}成绩管理系统!\n")# 添加学生成绩add_student_score("张三", 85)add_student_score("李四", 92)add_student_score("王五", 78)add_student_score("赵六", 95)add_student_score("钱七", 88)print()show_statistics()# 演示局部变量的独立性def demo_local_variable(): """演示局部变量""" # 这个g_student_count是局部变量,不影响全局变量 g_student_count = 999 print(f"\n在demo_local_variable函数中,g_student_count = {g_student_count}")demo_local_variable()print(f"在主程序中,g_student_count = {g_student_count}")print()reset_statistics()show_statistics()
运行结果:
欢迎使用CK学校成绩管理系统!✓ 成功添加:张三,成绩:85分✓ 成功添加:李四,成绩:92分✓ 成功添加:王五,成绩:78分✓ 成功添加:赵六,成绩:95分✓ 成功添加:钱七,成绩:88分==================================================CK学校成绩统计报告==================================================学生人数:5人平均成绩:87.60分最高成绩:95分最低成绩:78分==================================================在demo_local_variable函数中,g_student_count = 999在主程序中,g_student_count = 5统计数据已重置==================================================CK学校成绩统计报告==================================================暂无学生成绩数据==================================================

🤖 AI辅助学习:用AI加深对本节内容的学习
学习目标
学会利用AI工具辅助学习Python编程,通过与AI的对话互动来: 1. 巩固变量作用域的概念 2. 练习编写包含局部变量和全局变量的代码 3. 通过有趣的编程练习提升学习兴趣 4. 培养自主学习和问题解决能力

📝 AI学习活动一:理解变量作用域
活动说明
通过与AI对话,深入理解局部变量和全局变量的区别。请使用以下提示词与AI进行对话。
AI提示词模板
我正在学习Python中的变量作用域。请帮我完成以下任务:1. 解释什么是局部变量,什么是全局变量2. 给出一个包含局部变量和全局变量的代码示例3. 在代码中标注每个变量的作用域4. 解释如果我在函数内部修改全局变量会发生什么请用简单易懂的语言解释,并给出完整的代码示例。
预期学习成果
·能够清晰区分局部变量和全局变量
·理解变量作用域的概念
·掌握global关键字的使用方法

📝 AI学习活动二:绘制爱心图案
活动说明
利用AI生成绘制爱心图案的代码,在代码中练习使用局部变量和全局变量。
AI提示词模板
请帮我用Python编写一个绘制爱心图案的程序,要求:1. 使用字符画的方式在控制台输出爱心2. 定义一个全局变量HEART_SIZE控制爱心大小3. 定义一个函数draw_heart()来绘制爱心4. 在函数中使用局部变量来控制绘制过程5. 代码要有详细的注释,解释每个变量的作用域请给出完整的代码和运行效果。
参考代码框架
# 全局变量:控制爱心大小HEART_SIZE = 5def draw_heart(): """绘制爱心图案""" # 局部变量:控制绘制 size = HEART_SIZE # 读取全局变量 # 使用嵌套循环绘制爱心 for y in range(size * 2, -size * 2, -1): line = "" for x in range(-size * 2, size * 2): # 爱心方程:(x² + y² - 1)³ - x²y³ = 0 if (x * x + y * y - 1) ** 3 - x * x * y * y * y <= 0: line += "♥" else: line += " " print(line)# 调用函数print("CK学校送给你的爱心:")draw_heart()

📝 AI学习活动三:创建简单的动画效果
活动说明
利用AI生成简单的文字动画代码,理解全局变量在动画状态管理中的作用。
AI提示词模板
请帮我用Python编写一个简单的文字动画程序,要求:1. 在控制台显示一个简单的加载动画(如旋转的符号或进度条)2. 使用全局变量来控制动画状态(如是否继续运行)3. 使用局部变量来处理每一帧的显示4. 使用time模块控制动画速度5. 动画运行5秒后自动停止请给出完整的代码和详细注释。
参考代码框架
import time# 全局变量:控制动画状态g_is_running = Trueg_frame_count = 0def show_loading_animation(): """显示加载动画""" global g_frame_count # 局部变量:动画帧符号 frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] # 局部变量:当前帧索引 current_frame = g_frame_count % len(frames) # 显示当前帧 print(f"\rCK学校系统加载中 {frames[current_frame]}", end="", flush=True) g_frame_count += 1def run_animation(duration): """运行动画指定时长""" global g_is_running # 局部变量:计时 start_time = time.time() while g_is_running: show_loading_animation() time.sleep(0.1) # 检查是否到达指定时长 if time.time() - start_time >= duration: g_is_running = False print("\n加载完成!欢迎来到CK学校系统!")# 运行动画run_animation(5)

📝 AI学习活动四:设计学生成绩分析工具
活动说明
综合运用本章所学知识,设计一个简单的成绩分析工具。
AI提示词模板
请帮我用Python编写一个学生成绩分析工具,要求:1. 使用全局变量存储所有学生的成绩数据2. 定义多个函数实现不同功能:- add_score(name, score): 添加学生成绩- show_average(): 显示平均分- show_highest(): 显示最高分- show_lowest(): 显示最低分- show_all(): 显示所有学生成绩3. 每个函数内部使用局部变量处理数据4. 使用global关键字在函数中修改全局变量5. 添加菜单让用户选择功能请给出完整的代码,并标注每个变量的作用域。

📝 AI学习活动五:变量作用域挑战题
活动说明
通过解决挑战题,深入理解变量作用域的细节。
AI提示词模板
请帮我分析以下Python代码的输出结果,并解释原因:
代码:
x = 10def func1(): x = 20 print("func1:", x)def func2(): global x x = 30 print("func2:", x)def func3(): print("func3:", x)func1()func2()func3()print("main:", x)
请: 1. 预测代码的输出结果 2. 解释每个函数中x的作用域 3. 说明global关键字的作用 4. 如果去掉func3中的print语句,结果会怎样?
📝 AI学习活动六:创意编程——绘制CK学校Logo
活动说明
发挥创意,用字符画绘制CK学校的标志或名称,练习变量作用域的应用。
AI提示词模板
请帮我用Python字符画绘制"CK"两个字母,要求:1. 使用全局变量控制字符画的样式(如使用的字符、大小等)2. 定义函数draw_C()和draw_K()分别绘制两个字母3. 在函数中使用局部变量控制绘制细节4. 可以使用循环和条件语句5. 输出效果要美观请给出完整的代码和运行效果展示。
参考代码框架
# 全局变量:控制样式CHAR = "█"SIZE = 5def draw_C(): """绘制字母C""" # 局部变量 height = SIZE for i in range(height): if i == 0 or i == height - 1: # 第一行和最后一行 print(" " + CHAR * (height - 1)) else: # 中间行 print(CHAR)def draw_K(): """绘制字母K""" # 局部变量 height = SIZE mid = height // 2 for i in range(height): # 局部变量:当前行的K的第二部分位置 if i < mid: spaces = mid - i - 1 elif i == mid: spaces = 0 else: spaces = i - mid line = CHAR + " " * (mid - abs(mid - i)) + CHAR print(line)# 绘制CKprint("\nCK学校标志:\n")print("字母C:")draw_C()print("\n字母K:")draw_K()

📝 AI学习活动七:调试练习——找出变量作用域错误
活动说明
通过调试有错误的代码,加深对变量作用域的理解。
AI提示词模板
请帮我分析以下代码中的错误,并给出修正方案:
count = 0def increment(): count = count + 1 print(f"计数器:{count}")def show_count(): print(f"当前计数:{count}")increment()increment()show_count()
请: 1. 指出代码中的错误 2. 解释错误产生的原因 3. 给出正确的代码 4. 解释修正后的代码如何工作

📝 AI学习活动八:设计互动问答游戏
活动说明
设计一个简单的问答游戏,综合运用变量作用域知识。
AI提示词模板
请帮我用Python编写一个关于CK学校的问答小游戏,要求:1. 使用全局变量记录玩家的得分和答题数2. 定义函数实现以下功能:- ask_question(question, answer): 提问并判断答案- show_score(): 显示当前得分- reset_game(): 重置游戏3. 每个函数使用局部变量处理临时数据4. 游戏结束后显示最终得分和正确率5. 至少包含5个关于Python变量作用域的问题请给出完整的代码。

🎯 AI学习总结
通过与AI的对话互动,你应该能够:
1.✅ 理解局部变量和全局变量的定义和区别
2.✅ 掌握global关键字的使用方法
3.✅ 能够分析代码中变量的作用域
4.✅ 能够编写包含正确变量作用域的程序
5.✅ 能够调试和修复变量作用域相关的错误
