✏️ 课堂习题
第 6 章 · 函数 · 共 8 题 · 内容覆盖讲稿全部知识点
1
定义一个函数
max_of_three(a, b, c),接收三个数,返回其中最大的值。分别用位置参数和关键字参数两种方式调用。▼
参考答案
python
def max_of_three(a, b, c):
if a >= b and a >= c:
return a
elif b >= a and b >= c:
return b
else:
return c
# 位置参数调用
print(max_of_three(10, 25, 15)) # 25
# 关键字参数调用
print(max_of_three(c=30, a=10, b=20)) # 30
2
以下代码的输出是什么?请解释
global 关键字的作用。▼
参考答案
python
x = 10
def change1():
x = 20 # 这是局部变量,不影响全局x
print("change1内:", x)
def change2():
global x # 声明要修改全局变量
x = 30
print("change2内:", x)
change1()
print("调用change1后:", x) # 10
change2()
print("调用change2后:", x) # 30
解释:change1 中的 x=20 创建了一个局部变量,不影响全局 x,所以调用后全局 x 仍是 10。
change2 中用 global x 声明要操作全局变量,所以 x=30 修改了全局 x,调用后变为 30。
3
定义一个函数
(1) 调用
(2) 调用
avg(*scores),可以接收任意多个成绩,返回平均分。要求:(1) 调用
avg(85, 90, 78, 92) 输出平均分(2) 调用
avg() 时不能报错,应返回 0▼
参考答案
python
def avg(*scores):
if len(scores) == 0:
return 0
return sum(scores) / len(scores)
print(avg(85, 90, 78, 92)) # 86.25
print(avg()) # 0
4
写出以下递归程序的执行过程(画出每次调用的参数和返回值),最后输出结果是什么?
▼
参考答案
python
def mystery(n):
if n == 1:
return 1
return n + mystery(n - 1)
print(mystery(5))
执行过程:
mystery(5) = 5 + mystery(4)
mystery(4) = 4 + mystery(3)
mystery(3) = 3 + mystery(2)
mystery(2) = 2 + mystery(1)
mystery(1) = 1(终止条件)
逐层返回:1 → 2+1=3 → 3+3=6 → 4+6=10 → 5+10=15
最终输出:15(即 1+2+3+4+5)
5
将以下
(1)
(2)
(3)
def 函数改写为等效的 lambda 表达式:(1)
def square(x): return x**2(2)
def is_even(n): return n % 2 == 0(3)
def longer(a, b): return a if len(a) > len(b) else b
▼
参考答案
python
# (1) square = lambda x: x ** 2
# (2) is_even = lambda n: n % 2 == 0
# (3) longer = lambda a, b: a if len(a) > len(b) else b
# 测试
square = lambda x: x ** 2
print(square(5)) # 25
is_even = lambda n: n % 2 == 0
print(is_even(7)) # False
print(is_even(8)) # True
longer = lambda a, b: a if len(a) > len(b) else b
print(longer("hello", "hi")) # hello
6
使用
map() 和 lambda 完成:将列表 ["PYTHON", "JAVA", "C++"] 中所有字符串转为小写,再使用 filter() 筛选出长度大于 3 的字符串。▼
参考答案
python
strs = ["PYTHON", "JAVA", "C++"]
# map 转小写
lowered = list(map(lambda s: s.lower(), strs))
print(lowered) # ['python', 'java', 'c++']
# filter 筛选长度>3
result = list(filter(lambda s: len(s) > 3, lowered))
print(result) # ['python', 'java']
7
使用
reduce() 求列表 [2, 4, 6, 8, 10] 中所有元素的乘积。再指定初始值为 0.5,结果是多少?▼
参考答案
python
from functools import reduce
nums = [2, 4, 6, 8, 10]
# 不指定初始值
result = reduce(lambda a, b: a * b, nums)
print(result) # 3840(2*4*6*8*10)
# 指定初始值0.5
result2 = reduce(lambda a, b: a * b, nums, 0.5)
print(result2) # 1920.0(0.5*2*4*6*8*10)
8
解释
if __name__ == '__main__': 的作用。编写一个模块 mymath.py,包含 add 和 multiply 函数,并在 if __name__ == '__main__' 块中编写测试代码。▼
参考答案
python
# mymath.py
def add(x, y):
return x + y
def multiply(x, y):
return x * y
if __name__ == '__main__':
# 这段代码只在直接运行 mymath.py 时执行
# 被 import 导入时不会执行
print("测试 add:", add(3, 5)) # 8
print("测试 multiply:", multiply(4, 6)) # 24
解释:每个 Python 模块都有一个内置的 __name__ 变量。
当脚本直接运行时,__name__ 的值为 '__main__',if 块内的代码会执行。
当脚本作为模块被导入时,__name__ 的值为模块名,if 块内的代码不执行。
这样就能把测试代码和模块功能代码分开,导入时只获得函数定义而不会执行测试。