# 问答库

# 2.3.2 函数调用（问答库）

1. 【单选题·易】函数调用的一般形式是（ ）
   A. `def 函数名([形式参数列表]):`
   B. `函数名([实际参数列表])`
   C. `call 函数名`
   D. `函数名[]`
   **答案：B**
   **解析：** 课程指出，函数调用通过函数名和传递的参数进行，形式为 `函数名([实际参数列表])`。A 是函数定义形式，不是调用形式。

2. 【单选题·易】执行 `x = add(5, 4)` 时，若函数定义为 `def add(a, b):`，则实际参数与形式参数的对应关系是（ ）
   A. 5 传给 b，4 传给 a
   B. 5 传给 a，4 传给 b
   C. 两个实参都传给 a
   D. 必须写成 `add(a=5, b=4)` 才能调用
   **答案：B**
   **解析：** 位置参数按位置一一对应：实参 5、4 分别传递给形参 a、b。不必使用关键字参数。

3. 【判断题·易】当有的参数没有默认值、有的参数具有默认值时，默认值参数必须放在非默认值参数的后面。
   **答案：√**
   **解析：** 课程明确规定：默认值参数必须放在非默认值参数后面。正确写法如 `def default(x, y=3):`。

4. 【判断题·易】按关键字参数传递时，实际参数与形式参数必须遵循函数定义中的参数顺序。
   **答案：×**
   **解析：** 关键字参数允许在调用时明确指定参数名和对应值，不必遵循定义中的参数顺序，还可以跳过某些具有默认值的参数。

5. 【多选题·中】关于实参向形参传递值的方式，下列说法正确的有（ ）
   A. 位置参数按位置一一对应进行传递
   B. 默认值参数在调用未提供该参数时使用预设默认值
   C. 关键字参数可以改变参数顺序，也可以跳过某些默认值参数
   D. 关键字参数后面还可以继续写位置参数
   **答案：ABC**
   **解析：** 课程介绍了位置参数、默认值参数和关键字参数三种方式。D 错误：关键字参数后面不能再有位置参数，如 `keyParameter(1, y=2, 3)` 是错误格式。

6. 【单选题·中】运行下列程序，输出结果是什么？

```python
def default(x, y=3):
    s = x + y
    print('Sum of x and y is:', s)

default(2)
default(2, 4)
```

   A. `Sum of x and y is: 5` 和 `Sum of x and y is: 7`
   B. `Sum of x and y is: 5` 和 `Sum of x and y is: 6`
   C. `Sum of x and y is: 2` 和 `Sum of x and y is: 6`
   D. 因第一次调用少传参数而报错
   **答案：B**
   **解析：** `default(2)` 只给 x 传 2，y 使用默认值 3，和为 5；`default(2, 4)` 把 4 传给 y，和为 6。第一次调用合法，不会报错。

7. 【多选题·中】下列属于不可变数据类型的有（ ）
   A. 整型
   B. 浮点型
   C. 字符串型和元组
   D. 列表、字典和集合
   **答案：ABC**
   **解析：** 课程指出：整型、浮点型、字符串型和元组属于不可变数据类型；列表、字典和集合是可变数据类型。不可变是指不能修改原内存单元里的数据，改值时内存地址也会改变。

8. 【判断题·中】不可改变对象作为实参时，在函数内部改变形参的值，不会导致实参的值发生改变。
   **答案：√**
   **解析：** 课程以 `modify(y)` 为例：y 是不可改变对象，函数内把形参 x 改为平方后，调用结束时 y 仍为 5。可变对象则相反，形参与实参共用存储空间。

9. 【简答题·中】简述位置参数、默认值参数、关键字参数的传递规则，并说明为什么 `keyParameter(1, y=2, 3)` 是错误调用。
   **答案：** 位置参数：实参与形参按位置从左到右一一对应。默认值参数：定义时写成 `形参名=默认值`，调用未提供则用默认值；默认值参数必须放在非默认值参数后面，建议只用不可变对象作默认值。关键字参数：调用时写 `参数名=值`，不必遵循定义顺序，还可跳过某些默认值参数。`keyParameter(1, y=2, 3)` 错误，是因为关键字参数后面不能再有位置参数。
   **解析：** 评分要点：①三种方式的规则与课程一致；②点明默认值参数位置限制；③明确指出“关键字参数后面不能再有位置参数”。只举例子不说规则，给部分分。

10. 【单选题·难】运行下列程序，输出结果是什么？

```python
def keyParameter(x, y=3, z=4):
    s = x + y + z
    print('Sum of x, y and z is:', s)

keyParameter(z=3, y=2, x=1)
keyParameter(x=1, z=2)
```

    A. `Sum of x, y and z is: 6` 两行
    B. `Sum of x, y and z is: 6` 和 `Sum of x, y and z is: 7`
    C. `Sum of x, y and z is: 10` 和 `Sum of x, y and z is: 6`
    D. 第二次调用因缺少 y 而报错
    **答案：A**
    **解析：** 第一次按关键字改变顺序：x=1、y=2、z=3，和为 6。第二次跳过默认值参数 y（仍为 3），z 改为 2，x=1，和仍为 6。跳过具有默认值的参数是合法的。

11. 【简答题·难】为什么把整数 y=5 传入 `modify` 后 y 不变，把列表 a=[4, 5, 6] 传入 `modifyList` 后 a 会变成各元素的平方？请写出与课程一致、可直接运行的完整程序及输出。
    **答案：** 整数是不可变对象，函数内 `x = x * x` 只让形参指向新对象，实参 y 仍为 5。列表是可变对象，传递的是内存地址，形参 b 与实参 a 共用同一块存储，`b[i] *= b[i]` 就地修改元素，因此 a 也会变为 `[16, 25, 36]`。完整程序：

```python
def modify(x):
    x = x * x
    print('x =', x)

y = 5
modify(y)
print('y = ', y)


def modifyList(b):
    for i in range(len(b)):
        b[i] *= b[i]
    print('b = ', b)

a = [4, 5, 6]
modifyList(a)
print('a = ', a)
```

输出为：

```
x = 25
y =  5
b =  [16, 25, 36]
a =  [16, 25, 36]
```

   **解析：** 评分要点：①区分不可变/可变及“传值 vs 传地址”；②代码与课程 `modify`、`modifyList` 逻辑一致且可运行；③输出中 y 仍为 5、a 变为 `[16, 25, 36]`。只说结论不写程序，或把列表误当成不可变，不得满分。

12. 【单选题·难】运行下列程序，输出结果是什么？

```python
def local(b):
    a = 3
    b = 5
    print("a = {}, b = {}".format(a, b))

def fun():
    print('fun内 b=', b)

b = 4
local(b=b)
fun()
```

    A. `a = 3, b = 5` 和 `fun内 b= 5`
    B. `a = 3, b = 5` 和 `fun内 b= 4`
    C. `a = 3, b = 4` 和 `fun内 b= 4`
    D. `fun` 中访问 b 会引发 NameError
    **答案：B**
    **解析：** `b = 4` 是全局变量。`local(b=b)` 中第一个 b 是形参、第二个 b 是实参，二者同名但是两个变量；函数内 `a = 3`、`b = 5` 改的是局部变量，故打印 `a = 3, b = 5`。`fun` 中的 b 访问的是全局 b，仍为 4。局部赋值不会改掉全局 b。

13. 【单选题·中】运行下列程序，输出结果是什么？

```python
t = [19, 72, -52, 44, -26, 20, 43, 99]
t.sort(key=lambda y: y * y)
print(t)
```

    A. `[19, 20, -26, 43, 44, -52, 72, 99]`
    B. `[-52, -26, 19, 20, 43, 44, 72, 99]`
    C. `[99, 72, -52, 44, 43, -26, 20, 19]`
    D. `[19, 72, -52, 44, -26, 20, 43, 99]`（顺序不变）
    **答案：A**
    **解析：** lambda 表达式 `lambda y: y * y` 创建匿名函数，表达式的值就是返回值，此处作为 `sort` 的 `key` 参数。列表按元素平方从小到大排序，负数平方后仍为正，因此 `-26` 排在 `43` 前面、`-52` 排在 `72` 前面，结果与课程例 2-11 一致。B 是按原值从小到大；C 是按绝对值从大到小。
