中国电子学会Python等级考试四级真题及答案解析 2青少年软件编程试卷展示(含答案)
2024-03 Python四级真题
分数:100
题数:38
测试时长:60min
一、单选题(共25题,共50分)
1. 运行如下代码,若输入整数3,则最终输出的结果为?( C)(2分)
def f(x):
if x==1:
s=1
else:
s=f(x-1)*x
return s
n=int(input("请输入一个大于1的整数:"))
print(f(n)+f(n-1))
A. 2
B. 4
C. 8
D. 16
答案解析:由于f(3)=f(2)*3,f(2)=f(1)*2,f(1)=1,所以f(3)+f(2)=6+2=8。
2. 运行下列程序,输出的结果是?(B )(2分)
def fun(x):
if x > 3:
return x * fun(x-1)
else:
return x
print(fun(6))
A. 120
B. 360
C. 720
D. 60
答案解析:递归函数求解,根据递归函数6*5*4*3=360
3. 下列关于递归的描述不正确的是?(D )(2分)
A. 递归函数一定包含if语句
B. 递归函数体内一定包含调用自身的语句
C. 在调用自身函数时需要明确的边界终止条件与边界值
D. 递归算法一般代码简洁,执行效率高,空间复杂度低
答案解析:递归算法一般代码简洁,易于理解,但执行效率较低,空间复杂度高。
4. 运行下列程序,输出的结果是?(D )(2分)
def fun(a, n):
s = 0
for i in range(1, n+1):
temp = str(a)*i
s += int(temp)
return s
print(fun(1, 3))
A. 3
B. 6
C. 12
D. 123
答案解析:递推函数求解,本题是求1+11+111之和。
5. 运行下列程序,输出的结果是?(A )(2分)
def fun(a, b):
s = 0
a = a[::-1]
for i in range(len(a)):
s += int(a[i])*b**i
return s
print(fun('45', 16))
A. 69
B. 45
C. 64
D. 61
答案解析:递推函数求解,本题是根据一个字符串和进制,转换成对应的十进制。
6. 一个荷花池,第一天荷花开放得很少,第二天开放的数量是第一天的两倍,之后的每一天,荷花都会以前一天两倍的数量开放。如果到第30天,荷花就开满了整个池塘,设第一天开一朵,编程求第30天共开了多少朵荷花。下面空白处的代码填写正确的是?(B )(2分)
s = 0
t = 1
for i in range(1, ① ):
s += t
②
print(s)
A. 30, t = t*2
B. 31, t = t*2
C. 31, t+=2
D. 30, t*=2
答案解析:递推函数求解,本题递推关系是t = t*2, 循环次数是30次。
7. 解决下列问题时,时间复杂度最大的是?(C )(2分)
A. 输入n个不同的包含两位小数的实数,计算这n个数的和
B. 在n个数据中,查找数据k
C. 将n个数据用冒泡排序实现排序
D. 计算算式1-2+3-4+…-n的结果,n为偶数
8. 以下关于分治算法的描述正确的是?(B )(2分)
A. 各个子问题既相互独立又相互联系
B. 问题可以分解成若干个规模较小的相同问题
C. 可以直接对问题进行求解
D. 子问题的解不能合并成原问题的解
答案解析:分治算法的特征,各个子问题相互独立,子问题的求解可以合并成原问题的解。
9. 下列选项中哪一项使用了分治算法?(A )(2分)
A. 二分搜索
B. 选择搜索
C. 插入搜索
D. 顺序搜索
答案解析:二分查找体现了分治算法。
10. 不超过20个元素的降序数列,使用对分查找能找到指定的元素,可能的查找次数不包括?(D )(2分)
A. 3
B. 4
C. 5
D. 6
答案解析:int(log220)+1=5。
11. 下面程序段的输出结果是?(C )(2分)
def add_Run(L=None):
if L is None:
L = ['Lying']
else:
L.append('Run')
return L
add_Run()
print(add_Run())
print(add_Run(['Lying']))
A.
['Lying']
['Run']
B.
['Lying']
['Lying']
['Lying', 'Run']
C.
['Lying']
['Lying', 'Run']
D.
[]
['Lying', 'Run']
答案解析:if分支定义列表,else分支添加列表元素。
12. 下面关于计数器的程序,输出结果正确的是?( A)(2分)
count = 0
def increment():
global count
count += 1
print("计数器的值:", count)
increment()
increment()
increment()
A.
计数器的值: 1
计数器的值: 2
计数器的值: 3
B.
计数器的值:0
计数器的值:1
计数器的值:2
C.
计数器的值: 1
计数器的值: 1
计数器的值: 1
D.
计数器的值:3
答案解析:在函数内部可以通过关键字global来定义全局变量。
13. 下列程序段的输出结果是?( A)(2分)
L = []
x = 3
def test(x):
L.append(x)
x = 5
test(x)
print('L = {}, x = {}'.format(L, x))
A. L = [3], x = 3
B. L = [5], x = 5
C. L = [3], x = 5
D. L = 3, x = 5
答案解析:函数内部定义变量x的值为5,只能作用于函数内部。
14. 以下程序,运行程序输出结果正确的是?( C)(2分)
def demo(x):
return x*2
print(demo(demo(1)))
A. return None
B. 2
C. 4
D. 8
答案解析:调用二次,1乘以二次2,因此结果为4。
15. Python使用下列哪个函数接收用户输入的数据?(B )(2分)
A. accept()
B. input()
C. print()
D. login()
答案解析:在Python中,用于获取用户输入的函数是input()。
16. 下面程序段的输出结果正确的是?(C )(2分)
def power():
x ='python'
y = 'world'
z = x + " " + y
return z
print(power())
A. z
B. x + " " + y
C. python world
D. python" "world
答案解析:该函数作用为连接字符串。
17. 下列关于Python函数的描述中,不正确的是?(B )(2分)
A. 自定义函数时用到的关键字是def
B. 在python函数中,至少有一条return语句
C. 函数print()可以一次输出多个参数,如print('1',"2",3,[4])
D. 用函数eval()可以用于求字符串里表达式的值,如eval('3+5-1')
答案解析:函数可以有返回值,也可以没有返回值。需要返回值的函数,可以包含一条或者多条return语句;没有返回值的函数,不需要包含return语句。
18. 关于以下代码的描述中,正确的是?(A )(2分)
#求两个正方形的面积差
def MianJiCha(a,b):
s=a**2-b**2
return s
a=5
b=10
c=MianJiCha(b,a)+a
A. 代码运行后,变量c的值是80
B. 函数名是MianJiCha(a,b)
C. 可以用MianJiCha(100)的形式调用此函数
D. 代码运行时会报错
答案解析:s=10**2-5**2+5=100-25+5=80
19. 下列关于Python函数的说法中,错误的是?(D )(2分)
A. 利用函数可以降低编程复杂度,增加代码可读性
B. 函数可以重复调用
C. 函数可以降低修改代码的工作量
D. 调用函数时,每次都必须输入相同的参数值
答案解析:有些函数需要输入参数才能调用,有些不需要。需要输入参数的函数在多次调用时,允许输入合法的不同参数。这也正是函数可复用的实现形式。
20. 下列选项中,调用下列代码定义的函数时,程序会报错的是?(D )(2分)
def ShuChu(a,b,c):
print(c,b,a)
A. ShuChu('1','2','3')
B. ShuChu('1','2','3,4')
C. ShuChu(1,2,3)
D. ShuChu(1,2,3,4)
答案解析:在使用位置实参的方式传值时,传入的实参个数必须与形参相同,否则运行程序会报错。
21. 下列选项中,调用以下代码定义的函数时,程序会报错的是?(A )(2分)
def kp(a,b,c):
print(a,b,c)
A. kp(1,b=2,3)
B. kp(a=3,b=1,c=2)
C. kp(1,2,3)
D. kp(1,b=2,c=3)
答案解析:在函数调用时,采用位置实参与关键字实参混合传入参数时,位置实参必须放在关键字实参之前。
22. 下列代码的输出结果是?( C)(2分)
>>>s=lambda m,n:m*n
>>>s(6,6)
A. 6
B. 6,6
C. 36
D. 12
答案解析:匿名函数中,冒号前面是参数列表,冒号后面是函数的返回值。m=6,n=6,s=m*n=6*6=36
23. 以下函数定义错误的选项是?(C )(2分)
A.
def aFunc(m,n):
print(m,n)
B.
def aFunc(m,n=2):
print(m,n)
C.
def aFunc(*m,n):
print(m,n)
D.
def aFunc(m,*n):
print(m,n)
答案解析:*m表示是可变参数,可传入值的个数不确定。可变参数只能放在不可变参数的后面,不然解释器将不能识别哪些值传给可变参数,哪些值传给不可变参数。
24. 用于安装Python第三方库的工具是?(B )(2分)
A. install
B. pip
C. Wheel
D. setup
答案解析:pip是Python自带的第三方库的安装工具。
25. 编程时,如果只需要导入某第三方库中的某个成员,需要使用到的关键字是?(A )(2分)
A. from
B. as
C. into
D. inport
答案解析:导入外部模块的某个成员,使用from关键字。
二、判断题(共10题,共20分)
26. 若某个问题既能用递归算法求解,又能用递推算法求解,则使用递归方法求解更容易,效率也高得多。( 错)
答案解析:递归求解效率要低。
27. 如下代码因为递归的边界条件设置错误,产生了无限递归程序报错。(对 )
def fun(n):
if n > 10:
return 0
else:
return n + fun(n-1)
print(fun(10))
答案解析:递归的边界条件设置错误,产生了无限递归程序报错。
28. 算法的时间复杂度与空间复杂度没有必然关系。(对 )
答案解析:算法的时间复杂度与空间复杂度没有必然关系。
29. 已知有n本按照书名拼音排序好的图书,使用对分查找法搜索其中任何一本书,最多查找次数为4次,则n的值有可能为10。( 对)
答案解析:根据二分查找最坏查找次数可得。
30. 函数定义语句def f(c=1,d=2,a,b):是正确的,因为默认值形参要放在前面。( 错)
答案解析:函数定义,默认值形参要放在后面。
31. return语句可以返回任何数据类型的值,包括整数、浮点数、字符串、列表、元组、字典等。( 对)
答案解析:return语句可以用于在函数执行结束后返回一个值。这个值可以是任何类型,例如整数、浮点数、字符串、列表等等。
32. def ZiDian(**kwargs):
print(kwargs)
ZiDian(a=1)
运行上面的代码后,输出结果为{'a':1}。(对 )
答案解析:当不确定需要传入的值是多少时,在定义形参时,可以使用*args(列表)、**kwargs(字典)来表示。在元素前加上**后,传入的值以字典的形式显示出来。
33. 以下代码可以正常运行,输出8。( 错)
def qh(a,b=3):
print(a+b)
qh(b=2,6)
答案解析:在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。不然,程序会报错。
34. 代码>>>lambda:x=2,y=3:x+y 的运行结果是5。(错 )
答案解析:匿名函数中冒号前面的部分表示参数列表,不能有赋值语句,不然会报“can't assign to lambda”错误。
35. 使用pip install –upgrade numpy命令能够升级numpy科学计算库。( 对)
答案解析:pip的install –upgrade numpy指令用来升级外部模块。
三、编程题(共3题,共30分)
36. 数的分解
给出一个正整数a,要求分解成若干个正整数的乘积,即a=a1×a2×a3×…×an,并且1<a1≤a2≤a3≤…≤an,问这样分解的种类有多少。注意到a=a也是一种分解。
例如,8可以分解成8=2*2*2,8=2*4,8=8总共3种。
代码如下,完善划线处的代码:
def fun(x, y=2):
if x == 1:
global ans
①
for i in range(y, x+1):
if ② :
fun(x//i,i)
lst = [2, 8, 9, 20] #测试数据
for i in lst:
ans = 0
③
print(ans)
程序运行结果如下:
1
3
2
4
参考程序:
def fun(x, y=2):
if x == 1:
global ans
ans += 1
for i in range(y, x+1):
if x % i == 0:
fun(x//i, i)
lst = [2, 8, 9, 20] #测试数据
for i in lst:
ans = 0
fun(i)
print(ans)
评分标准:
(1)ans += 1 或等效答案;(2分)
(2)x % i == 0 或等效答案;(3分)
(3)fun(i) 或等效答案。(3分)
37. 购物组合
小明单位发了100元的购物卡,小明到超市买三类洗化用品:洗发水(15元)、香皂(2元)、牙刷(5元)。要把100元正好花掉,可有哪些购买组合?
def gouwu(money):
for i in range(0,money//15+1):
for j in range(0,money//2+1):
for k in range(0, ① ):
if ② :
print('可选择的购买组合:\t购买洗发水 {} 瓶,香皂 {} 块,牙刷 {}个。'.format( ③ ))
gouwu(100)
标准答案:
参考程序:
def gouwu(money):
for i in range(0,money//15+1):
for j in range(0,money//2+1):
for k in range(0,money//5+1):
if i*15+j*2+k*5==money:
print('可选择的购买组合:\t购买洗发水 {} 瓶,香皂 {} 块,牙刷 {}个。'.format(i,j,k))
gouwu(100)
答案解析:
评分标准:
(1)money//5+1 或等效答案;(3分)
(2) i*15+j*2+k*5==money 或等效答案;(4分)
(3) i,j,k 或等效答案。(3分)
38. 回文素数
回文素数是指一个不小于11的自然数n从左向右和从右向左读,其结果值相同且是素数,即称n为回文素数。一种求解的方法是先判断一个自然数是否为回文数,再判断它是否为素数。如果两个判断都成立,则该自然数是回文素数。请补全代码,找出自然数1000以内的所有回文素数。
#判断是否为素数
def ① (n):
for i in range(2,n):
if ② :
break
else:
return True
#判断是否为回文数
def HuiWenShu(n):
n=str(n)
if n== ③ :
return True
else:
return False
for i in range(11,1001):
if ZhiShu(i)==True ④ :
print('{}是回文素数!'.format(i))
参考程序:
#判断是否为素数
def ZhiShu(n):
for i in range(2,n):
if n%i==0:
break
else:
return True
#判断是否为回文数
def HuiWenShu(n):
n=str(n)
if n==n[::-1]:
return True
else:
return False
for i in range(11,1001):
if ZhiShu(i)==True and HuiWenShu(i)==True:
print('{}是回文素数!'.format(i))
评分标准:
(1)ZhiShu 或等效答案;(2分)
(2)n%i==0 或等效答案;(2分)
(3)n[::-1] 或等效答案;(4分)
(4)and HuiWenShu(i)==True 或等效答案。(4分)
作者:Lemon Liu