2.3.2-函数调用.md

问答库

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. 【单选题·中】运行下列程序,输出结果是什么?
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。第一次调用合法,不会报错。

  1. 【多选题·中】下列属于不可变数据类型的有( ) A. 整型 B. 浮点型 C. 字符串型和元组 D. 列表、字典和集合 答案:ABC 解析: 课程指出:整型、浮点型、字符串型和元组属于不可变数据类型;列表、字典和集合是可变数据类型。不可变是指不能修改原内存单元里的数据,改值时内存地址也会改变。
  2. 【判断题·中】不可改变对象作为实参时,在函数内部改变形参的值,不会导致实参的值发生改变。 答案:√ 解析: 课程以 modify(y) 为例:y 是不可改变对象,函数内把形参 x 改为平方后,调用结束时 y 仍为 5。可变对象则相反,形参与实参共用存储空间。
  3. 【简答题·中】简述位置参数、默认值参数、关键字参数的传递规则,并说明为什么 keyParameter(1, y=2, 3) 是错误调用。 答案: 位置参数:实参与形参按位置从左到右一一对应。默认值参数:定义时写成 形参名=默认值,调用未提供则用默认值;默认值参数必须放在非默认值参数后面,建议只用不可变对象作默认值。关键字参数:调用时写 参数名=值,不必遵循定义顺序,还可跳过某些默认值参数。keyParameter(1, y=2, 3) 错误,是因为关键字参数后面不能再有位置参数。 解析: 评分要点:①三种方式的规则与课程一致;②点明默认值参数位置限制;③明确指出“关键字参数后面不能再有位置参数”。只举例子不说规则,给部分分。
  4. 【单选题·难】运行下列程序,输出结果是什么?
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。跳过具有默认值的参数是合法的。

  1. 【简答题·难】为什么把整数 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]。完整程序:
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]。只说结论不写程序,或把列表误当成不可变,不得满分。

  1. 【单选题·难】运行下列程序,输出结果是什么?
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。

  1. 【单选题·中】运行下列程序,输出结果是什么?
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 是按绝对值从大到小。

下载此文件