🖥️ 上机练习
第 6 章 · 函数 · 共 7 题 · 请打开 PyCharm 或交互式环境独立完成 · 覆盖函数定义、参数、作用域、递归、lambda、高阶函数
💡
本页只显示题目,参考答案请课后向老师索取,或参考课堂习题部分。
练习 01
函数基础:判断素数
定义一个函数
is_prime(n),判断一个正整数 n 是否为素数(质数)。要求:
- 素数定义:大于 1,且只能被 1 和自身整除
- 返回布尔值 True 或 False
- 使用该函数输出 100 以内的所有素数
提示:只需检查到 sqrt(n) 即可优化效率,但初学阶段用 range(2, n) 也可以。
⏱ 参考用时:10 分钟
练习 02
参数灵活运用
定义一个函数
student_info(name, age, **kwargs):
- name 和 age 是必须的位置参数
- **kwargs 接收额外的可选信息(如班级、爱好、成绩等)
- 函数打印出学生的完整信息卡片
- 分别用不同的 kwargs 参数调用 3 次,展示灵活性
提示:用 for key, value in kwargs.items() 遍历输出额外信息。
⏱ 参考用时:8 分钟
练习 03
作用域练习
编写程序验证 LEGB 规则:
- 在模块顶层定义一个变量 count = 0
- 定义一个函数 outer,内部定义变量 count = 10,再嵌套一个函数 inner
- inner 中分别使用 print(count)(看访问的是哪一层)
- 尝试在 inner 中用 global 和 nonlocal 修改不同层的 count,对比结果
提示:nonlocal 修改外层函数的变量,global 修改模块顶层的变量。
⏱ 参考用时:10 分钟
练习 04
递归函数:斐波那契数列
斐波那契数列定义:F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2)(n>2)。要求:
- 用递归函数实现 fib(n),返回第 n 项的值
- 输出前 20 项斐波那契数列
- 思考:为什么 n=40 时递归会很慢?如何优化?
提示:递归计算 fib(40) 会产生大量重复计算。可尝试用循环改写比较速度。
⏱ 参考用时:12 分钟
练习 05
lambda + map/filter 综合
给定学生成绩列表:
scores = [45, 78, 92, 60, 55, 88, 73, 40, 95, 67],完成:
- 使用 map() 将所有成绩转换为"等级"(≥90: A, ≥80: B, ≥70: C, ≥60: D, <60: F)
- 使用 filter() 筛选出不及格的成绩(<60)
- 使用 filter() 筛选出优秀成绩(≥90)
- 全部使用 lambda 函数,一行代码完成
提示:lambda 中可使用三元运算符嵌套 lambda x: 'A' if x>=90 else 'B' if x>=80 else ...。
⏱ 参考用时:12 分钟
练习 06
sorted 自定义排序
有以下学生信息列表:
students = [
{"name": "张三", "age": 16, "score": 85},
{"name": "李四", "age": 17, "score": 92},
{"name": "王五", "age": 16, "score": 78},
{"name": "赵六", "age": 17, "score": 88}
]
- 按成绩从高到低排序
- 按年龄从小到大排序,年龄相同按成绩从高到低
- 全部使用 lambda 作为 key 参数
提示:多条件排序可用元组作为 key:key=lambda x: (x['age'], -x['score'])。
⏱ 参考用时:10 分钟
练习 07
挑战题:reduce 综合应用
使用 reduce() 完成以下任务:
- 求列表 [3, 7, 2, 9, 5, 1, 8] 中的最大值(不能用 max())
- 将列表 ["P", "y", "t", "h", "o", "n"] 拼接成字符串 "Python"
- 求 1~10 的阶乘和(即 1!+2!+...+10!),先用 map+reduce 求每个数的阶乘,再 reduce 求和
提示:求最大值 reduce(lambda a,b: a if a>b else b, lst)。
⏱ 参考用时:15 分钟