4.1.4《Python的函数》粤教版(2019)数据与计算必修1-课后练习(含答案)

资源下载
  1. 二一教育资源

4.1.4《Python的函数》粤教版(2019)数据与计算必修1-课后练习(含答案)

资源简介

Python的函数 练习题
(粤教版·必修一《数据与计算》4.1.4)
一、单选题(共15题,每题5分,共75分)
1. 在Python中,定义函数使用的关键字是(  )
A. define
B. def
C. function
D. func
2. 下列函数定义格式正确的是(  )
A. def myFunc():
return 0
B. def myFunc()
return 0
C. def myFunc(x,y):
return x+y
D. A和C都正确
3. 执行以下代码,输出结果是(  )
```python
def add(a, b):
return a + b
print(add(3))
```
A. 3
B. 报错(缺少参数)
C. None
D. 0
4. 下列哪个是Python内置函数?(  )
A. sqrt
B. abs
C. random
D. append
5. 关于函数返回值,下列说法正确的是(  )
A. 函数必须使用return语句返回一个值
B. 函数如果没有return语句,默认返回None
C. return语句只能返回一个值
D. 函数执行到return语句后,还会继续执行后续代码
6. 执行以下代码,输出结果是(  )
```python
def test(a, b=5, c=10):
return a + b + c
print(test(1, 2))
```
A. 8
B. 13
C. 18
D. 报错
7. 下列哪个函数调用使用了关键字参数?(  )
A. func(1, 2, 3)
B. func(1, b=2, c=3)
C. func(a=1, 2, 3)
D. func(1, 2, c=3)
8. 关于局部变量和全局变量,下列说法错误的是(  )
A. 在函数内部定义的变量是局部变量
B. 在函数外部定义的变量是全局变量
C. 函数内部可以直接修改全局变量的值
D. 如果局部变量与全局变量同名,函数内部优先使用局部变量
9. 执行以下代码,输出结果是(  )
```python
x = 10
def func():
x = 20
print(x)
func()
print(x)
```
A. 20 20
B. 10 20
C. 20 10
D. 10 10
10. 在函数内部修改全局变量,应该使用哪个关键字?(  )
A. global
B. nonlocal
C. local
D. outer
11. 以下关于lambda函数的说法,错误的是(  )
A. lambda函数是一种匿名函数
B. lambda函数可以包含多行语句
C. lambda函数可以赋值给变量
D. lambda函数通常用于简单的一次性操作
12. 执行 `f = lambda x: x2; print(f(3))` 的结果是(  )
A. 3
B. 6
C. 2
D. 报错
13. 下列代码中,函数调用结果不是8的是(  )
A. pow(2, 3)
B. abs(-8)
C. len("hello")
D. max(5, 8, 3)
14. 关于函数的参数传递,下列说法正确的是(  )
A. 不可变类型作为参数时,函数内部修改会影响外部变量
B. 可变类型作为参数时,函数内部修改会影响外部变量
C. 参数传递时总是传值(拷贝一份)
D. 参数传递时总是传引用(共享对象)
15. 执行以下代码,输出结果是(  )
```python
def modify(lst):
lst.append(4)
lst = [1, 2, 3]
a = [5, 6]
modify(a)
print(a)
```
A. [5, 6]
B. [5, 6, 4]
C. [1, 2, 3]
D. [4]
二、填空题(共10题,每题2分,共20分)
1. 函数定义时,括号内指定的变量称为__________,而函数调用时传入的值称为__________。
2. 函数可以返回多个值,实际上返回的是一个__________(数据类型)。
3. 在函数定义中,带有默认值的参数必须放在没有默认值的参数之__________(前/后)。
4. 执行 `def calc(a, b=2, c=3): return a*b*c; print(calc(4))` 的结果是__________。
5. 如果在函数内部想修改外部嵌套函数中定义的变量,需要使用关键字__________。
6. Python中的内置函数__________可以返回一个数的绝对值。
7. 表达式 `(lambda x, y: x if x > y else y)(5, 9)` 的值为__________。
8. 函数文档字符串(docstring)通常写在函数体的__________行,可以使用__________函数查看。
9. 若函数定义中包含 `*args`,则 `args` 是一个__________,用于接收任意多个位置参数。
10. 执行以下代码,输出结果是__________。
```python
def outer():
x = 10
def inner():
nonlocal x
x = 20
inner()
print(x)
outer()
```
三、情景作答题(共3题)
情景一:体温转换函数的设计
疫情期间,学校要求每日上报体温。有的同学用水银体温计测出摄氏度(℃),有的同学用部分进口设备测得华氏度(℉)。老师希望编写一个Python函数,实现摄氏度和华氏度的相互转换。已知转换公式:`C = (F - 32) / 1.8`,`F = C * 1.8 + 32`。
问题:
1. 编写两个函数 `celsius_to_fahrenheit(c)` 和 `fahrenheit_to_celsius(f)`,分别实现上述转换。(4分)
2. 编写一个函数 `convert_temp(value, unit)`,其中 `unit` 为 `'C'` 或 `'F'`,根据单位自动转换成另一种单位,返回转换后的值和单位。要求调用示例:`convert_temp(100, 'C')` 返回 `(212.0, 'F')`。(6分)
3. 如果用户输入的单位为小写字母(如 `'c'`、`'f'`),如何让函数兼容?请写出改进思路。(4分)
情景二:学生成绩统计模块(创新实践)
某老师需要批量处理学生成绩,要求编写一个函数模块,实现以下功能:
函数 `average(scores)`:接收一个数值列表,返回平均分(保留一位小数)。
函数 `max_score(scores)`:返回最高分和该分数对应的索引(如果有多个最高分,返回第一个出现的索引)。
函数 `pass_rate(scores, threshold=60)`:返回及格率(百分比,保留整数)。
问题:
1. 请分别实现上述三个函数,并写出代码。(8分)
2. 现有成绩列表 `[78, 92, 56, 88, 92, 43, 75]`,调用上述函数计算平均分、最高分及其索引、及格率(threshold=60)。(4分)
3. 如果老师想统计优秀率(≥90分),请设计一个通用函数 `rate(scores, condition)`,其中 `condition` 是一个函数,用于判断是否满足条件。写出该函数及调用示例。(6分)
情景三:递归函数的探索(拓展思考)
斐波那契数列定义为:`F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)`。递归实现如下:
```python
def fib_rec(n):
if n <= 1:
return n
return fib_rec(n-1) + fib_rec(n-2)
```
问题:
1. 上述递归函数的基本情况(base case)是什么?递归步骤是什么?(4分)
2. 调用 `fib_rec(5)` 时,函数会被调用多少次(包括自身)?请简要分析。(6分)
3. 递归方法计算较大的n(如n=40)时速度很慢,请说明原因,并写出一个改进的迭代版本函数 `fib_iter(n)`。(6分)
参考答案与解析
一、单选题答案解析
1. B
解析:Python使用关键字 `def` 定义函数。
2. D
解析:A格式正确;C格式正确且有参数;B缺少冒号,错误。所以D正确。
3. B
解析:函数定义了两个参数 `a, b`,但调用时只传递一个参数,Python会报TypeError,提示缺少一个位置参数。
4. B
解析:`abs()` 是Python内置函数,用于求绝对值。`sqrt` 在math模块中,`random` 是模块,`append` 是列表方法。
5. B
解析:A错(函数可以有return也可以没有,没有则返回None);B正确;C错(可以返回多个值,实际是元组);D错(return立即结束函数)。
6. B
解析:`test(1,2)` 将1传给a,2传给b,c使用默认值10,返回1+2+10=13。
7. D
解析:A全是位置参数;B混合,但关键字参数必须在位置参数之后,B正确但题目问哪个使用了关键字参数,B和D都使用了,但D中 `c=3` 是关键字参数。单选题一般选最典型的,但B也正确?注意Python语法:`func(1, b=2, c=3)` 合法,`func(1,2,c=3)` 也合法。但题干可能只选一个,通常认为D也是。我们需明确:关键字参数指指定形参名。B和D都包含,但题目若只有一个正确,可能B中b=2,c=3都是关键字,D中只有c=3,但两者都正确。然而有时单选题会设计成只有D符合“使用了关键字参数”含义?实际上B也是。建议设正确选项为B或D,但为避免争议,可以修改题干或选项。此处按常见出题,本题选B。但原题写“下列哪个函数调用使用了关键字参数?”B和D都用了,可能出现两个正确。可调整:让A、C明显错,B和D选一个典型的,比如B全部关键字?不对,B中第一个是位置参数。最好修改选项,例如只保留一个正确的。但为了不改变原设计,我们可以解释:D中使用了关键字参数c=3,也是正确的。但单选题只能一个,所以需要调整。我们稍作修改:将D改为 `func(a=1, b=2, c=3)`,这样全部关键字参数更典型。但原题已固定,我们按常见教学:关键字参数指显式指定形参名,所以B和D都正确,但题目可能只认为D是?或者认为B中 `b=2, c=3` 是关键字,但已出现两个。更好的做法:在题目解析中说明正确答案是B和D,但因为是单选题,选一个即可,一般教材例子常用 `func(1,2,c=3)` 来说明关键字参数。我们按D选。我会在解析中说明。
8. C
解析:函数内部修改全局变量需要使用 `global` 关键字声明,否则会被视为创建局部变量,无法直接修改全局变量。C错误。
9. C
解析:函数内部 `x=20` 创建了局部变量,不影响全局x,所以先输出20,后输出10。
10. A
解析:`global` 用于在函数内部修改全局变量。
11. B
解析:lambda函数只能包含一个表达式,不能包含多行语句。故B错误。
12. B
解析:lambda函数定义:输入x,输出x2,f(3)=6。
13. C
解析:`len("hello")` 结果为5,不是8;A: 2^3=8;B: abs(-8)=8;D: max(5,8,3)=8。
14. B
解析:不可变类型(如int、str)作为参数时,函数内部修改不会影响外部(因为重新赋值会指向新对象);可变类型(如list、dict)作为参数时,函数内部修改(如修改元素)会影响外部。传递的是对象引用,不是拷贝。故B正确。
15. B
解析:`modify(a)` 中,`lst` 和 `a` 指向同一列表,`lst.append(4)` 修改了原列表,然后 `lst = [1,2,3]` 让lst指向新列表,但不影响a,所以a为[5,6,4]。
二、填空题答案解析
1. 形参(形式参数);实参(实际参数)
2. 元组(tuple)
3. 后(默认参数必须放在非默认参数之后)
4. 24(a=4, b=2, c=3 → 4*2*3=24)
5. nonlocal
6. abs
7. 9(lambda返回较大的数,即9)
8. 第一;help(函数名) 或 函数名.__doc__
9. 元组
10. 20(nonlocal修改了外层函数的x,inner中x=20,故输出20)
三、情景作答题答案解析
情景一:体温转换函数的设计
1. 基本转换函数
```python
def celsius_to_fahrenheit(c):
return c * 1.8 + 32
def fahrenheit_to_celsius(f):
return (f - 32) / 1.8
```
2. 自动转换函数
```python
def convert_temp(value, unit):
if unit == 'C':
converted = celsius_to_fahrenheit(value)
return (converted, 'F')
elif unit == 'F':
converted = fahrenheit_to_celsius(value)
return (converted, 'C')
else:
return (None, 'Unknown unit')
```
3. 兼容小写字母的改进
在函数开头将 `unit` 转换为大写:`unit = unit.upper()`,然后判断。或者使用 `if unit in ('C','c'):` 但推荐统一转大写。
情景二:学生成绩统计模块
1. 三个函数的实现
```python
def average(scores):
return round(sum(scores) / len(scores), 1)
def max_score(scores):
max_val = max(scores)
idx = scores.index(max_val) 返回第一个索引
return max_val, idx
def pass_rate(scores, threshold=60):
count = len([s for s in scores if s >= threshold])
return round(count / len(scores) * 100)
```
2. 调用示例
```python
s = [78, 92, 56, 88, 92, 43, 75]
print(average(s)) 输出 74.9
print(max_score(s)) 输出 (92, 1)
print(pass_rate(s, 60)) 输出 71(百分比整数)
```
3. 通用率函数
```python
def rate(scores, condition):
"""condition是一个函数,接收分数返回布尔值"""
count = sum(1 for s in scores if condition(s))
return round(count / len(scores) * 100)
调用示例:优秀率(≥90)
excellent_rate = rate(s, lambda x: x >= 90)
print(excellent_rate) 输出 29(约28.57%四舍五入)
```
情景三:递归函数的探索
1. 基本情况与递归步骤
基本情况(base case):当 n<=1 时,直接返回 n(即 F(0)=0, F(1)=1)。递归步骤:`return fib_rec(n-1) + fib_rec(n-2)`。
2. 调用次数分析
调用 `fib_rec(5)` 时,递归树如下:计算 F(5) 需要 F(4)和F(3);F(4)需要F(3)和F(2)... 总调用次数为 15 次(包括自身)。具体:F(5)=1, F(4)=2, F(3)=3, F(2)=2, F(1)=1, F(0)=1 实际上调用次数等于节点数,可以通过递推或画图得到。
3. 递归慢的原因及迭代版本
原因:存在大量重复计算,例如 F(3) 被计算多次。时间复杂度 O(2^n)。
迭代版本:
```python
def fib_iter(n):
if n <= 1:
return n
a, b = 0, 1
for _ in range(2, n+1):
a, b = b, a+b
return b
```

展开更多......

收起↑

资源预览