1.以下程序输出为:(A)
def test(a,b,*args):
print(a)
print(b)
print(args)
test(11,22,33,44,55,66,77,88,99)
A.11 22 (33, 44, 55, 66, 77, 88, 99)
B.编译错误
C.运行错误
D.11 22 (11,22,33, 44, 55, 66, 77, 88, 99)
解析:
def test(a,b,*args),a,b位置参数;*args为不定长位置参数,传入的参数被放入一个元祖里。所以,a,b分别被赋值11、22,而其他的数被存到一个元组里。
2.有如下函数定义,执行结果正确的是:(A)
def dec(f):
n=3
def wrapper(*args,**kw):
return f(*args,**kw)*n
return wrapper
@dec
def foo(n):
return n * 2
A.foo(2) == 12
B.foo(3) == 12
C.foo(2) == 6
D.foo(3) == 6
解析:
调用函数foo(2)执行的过程:2*2*3=12;调用foo(2),执行wrapper(),wrapper()函数调用foo()函数,foo函数的返回值是2*2=4,回到wrapper函数4*3=12,返回值为12;把wrapper函数里面return f(*args,**kw) * n ,拆为两步走(先res=f(*args,**kw) * n 再return res)。
3.执行下列程序,输出结果为:(C)
def fun(a,*,b):
print(b)
fun(1,2,3,4)
A.[2,3,4]
B.[3,4]
C.报错
D.4
解析:
当函数的的形参单独为*时,它并不属于未匹配的位置参数,而是表示后面的参数必须使用关键字参数进行匹配,所以这里会抛出异常。参数的顺序应该是(位置参数,默认参数,位置不定长参数,关键字不定长参数);如果你希望强迫调用者使用某些参数,且必须以关键字参数的形式传参,那么你只需要在所需位置的前一个位置放置一个*。 def f1(a, *, b, c): return a + b + c 对于上面这个函数而言,调用时参数a可以任意值, 但b,c参数一定要以关键字参数的形式传参,如fun(1, b=4, c=5),否则将会报错。
4.下面这段程序的功能是什么:( A )
def f(a, b):
if b == 0:
return a
else:
return f(b, a%b)
a,b = map(int,input("Enter two natural numbers:" ).split())
print(f(a, b))
A.求ab最大公约数
B.求ab最小公倍数
C.求a%b
D.求a/b
解析:
a%b是求余数 碾转相除法,又称欧几里得函数,以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数。假设a = 27, b = 18 即 f(a, b)=f(27, 18); if不成立,进else; f(b, a%b)=f(18, 27%18)即f(18, 9); 没有达到退出的条件,再调f(18, 9); f(b, a%b) = f(9, 18%9)即f(9, 0); b=0,if成立,输出a=9 即只有在a%b=0的时候,条件才成立,输出a。
5.python变量的查找顺序为:(A)
A.局部作用域>外部嵌套作用域>全局作用域>内置模块作用域
B.外部嵌套作用域>局部作用域>全局作用域>内置模块作用域
C.内置模块作用域>局部作用域>外部嵌套作用域>全局作用域
D.内置模块作用域>外部嵌套作用域>局部作用域>全局作用域
解析:
局部作用域,也就是我们在函数中定义的变量;嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;全局变量,就是模块级别定义的变量;系统内置模块里面的变量,比如int, bytearray等。