✏️ 课堂习题

第 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
定义一个函数 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
将以下 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,包含 addmultiply 函数,并在 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 块内的代码不执行。
这样就能把测试代码和模块功能代码分开,导入时只获得函数定义而不会执行测试。