牛客网专项练习30天Pytnon篇第26天
1.执行以下程序,输出结果为:(A)
def fun(a=(),b=[]):
a += (1,)
b.append(1)
return a,b
fun()
print(fun())
A.((1,), [1, 1])
B.((1,1), [1, 1])
C.((1,), [1])
D.((1,1), [1])
解析:
Python的默认参数只在函数定义时被赋值一次,而不会每次调用函数时又创建新的引用。这意味着,函数定义完成后,默认参数已经存在固定的内存地址了,如果使用一个可变的默认参数并对其进行改变,那么以后对该函数的调用都会改变这个可变对象,而默认参数如果是不可变对象,不存在该问题,因此正确答案为A选项。
2.对于下列Python代码,描述正确的有:(BD)
foo = [1,2]
foo1 = foo
foo.append(3)
A.foo 值为[1,2]
B.foo 值为[1,2,3]
C.foo1 值为[1,2]
D.foo1 值为[1,2,3]
解析:
等号后边的值赋给前边,相当于把后边的数据地址赋给了前边,两个值对应了一个地址,其中一个改变,另一个也改变。
3.一个段代码定义如下,下列调用结果正确的是:(A)
def bar(multiple):
def foo(n):
return multiple ** n
return foo
A.bar(2)(3) == 8
B.bar(2)(3) == 6
C.bar(3)(2) == 8
D.bar(3)(2) == 6
解析:
return一个函数,考察闭包。当程序调用bar(a)时,返回一个foo函数的引用,此时变成foo(b),去执行foo函数里的函数体。执行bar函数,bar(2) 返回内层函数foo 传入私有变量 multiple=2,执行foo函数,bar(2)(3) = foo(3) =2 * 2 *2 = 8。
4.执行下列程序,输出结果为:(A)
def fn():
t = []
i = 0
while i < 2:
t.append(lambda x: print(i*x,end=","))
i += 1
return t
for f in fn():
print(f(2))
A.4,4,
B.2,2,
C.0,1,
D.0,2,
解析:
函数fn存在闭包现象,自由变量是i,由于python闭包采用延迟绑定,也就是当调用匿名函数时,循环早已结束,此时i的值为2,所以输出结果都为2*2=4,正确答案为A;这段函数先是通过 in 读取到函数fn(),开始走两遍while循环,i的值变为2,然后开始执行f(2),2是作为x的参数的赋值,这个时候直接开始执行 t.append(lambda x: print(i*x,end=",")),循环两遍,循环的次数还是取决于while的条件,你把i的值调成3的话就是走三次,但是由于i的值始终是2,所以x*i,x=2,i=2,循环两遍,两遍i的值都是2,结果:4,4,。
5.嵌套函数在其外部区域引用一个值时,该嵌套函数就是一个闭包,以下代码输出值为:(D)
def adder(x):
def wrapper(y):
return x + y
return wrapper
adder5 = adder(5)
print(adder5(adder5(6)))
A.10
B.12
C.14
D.16
解析:
这道题考查的是闭包,外部函数确定x的值为5,内部函数的值为6,所以第一次计算结果为11,第二次计算,还是在x为5的前提下,需要在11的基础上再加5,11+5=16,故选D。