def 函数名([形式参数列表]): B. 函数名([实际参数列表]) C. call 函数名 D. 函数名[] 答案:B 解析: 课程指出,函数调用通过函数名和传递的参数进行,形式为 函数名([实际参数列表])。A 是函数定义形式,不是调用形式。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。不必使用关键字参数。def default(x, y=3):。keyParameter(1, y=2, 3) 是错误格式。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。第一次调用合法,不会报错。
modify(y) 为例:y 是不可改变对象,函数内把形参 x 改为平方后,调用结束时 y 仍为 5。可变对象则相反,形参与实参共用存储空间。keyParameter(1, y=2, 3) 是错误调用。 答案: 位置参数:实参与形参按位置从左到右一一对应。默认值参数:定义时写成 形参名=默认值,调用未提供则用默认值;默认值参数必须放在非默认值参数后面,建议只用不可变对象作默认值。关键字参数:调用时写 参数名=值,不必遵循定义顺序,还可跳过某些默认值参数。keyParameter(1, y=2, 3) 错误,是因为关键字参数后面不能再有位置参数。 解析: 评分要点:①三种方式的规则与课程一致;②点明默认值参数位置限制;③明确指出“关键字参数后面不能再有位置参数”。只举例子不说规则,给部分分。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。跳过具有默认值的参数是合法的。
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]。只说结论不写程序,或把列表误当成不可变,不得满分。
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。
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 是按绝对值从大到小。