内容正文:
青少年软件编程(Python)等级考试试卷(四级)
202409真题与解析
分数:100 题数:38 测试时长:60分钟
1、 单选题(共25题,每题2分,共50分)
1.一款经典的猜数字游戏:甲先在50以内随意写一个数字,乙开始猜,如果乙猜的比甲写的数大了,甲就说大了,反之,则说小了。请问根据对分查找思想,乙最多用多少次能猜出甲写的正确数字?()
A. 10
B.8
C.6
D.4
2.二分查找法是利用了哪种算法思想?()
A 动态规划
B.分治算法
C.递推算法
D.递归算法
3.运行下列程序后,输出的结果是?
def f(n):
if(n==1):
return 1
return n*f(n-1)print(f(5))
A. 24
B. 120
C. 15
D. 5
4.下列定义计算圆周长的匿名函数中,正确的是?()
A. lambdar:2r*3.14
B. lambda r3,14*2*r
C.rst =lambda r3.14*r*2
D. rst= lambdar:3.14*2*r
5.有如下Python程序段,在调用函数sjc时实参是?()
def sjc(x):
a,b=1,1
print(a,b,x)
sjc(20)
A 20
B 1
C a
D b
6.下列有关匿名函数lambda的描述,错误的是?()
A.lambda表达式可以包含一个表达式
B在匿名函数中需要使用return来返回值
C.lambda表达式可以调用其他函数
D.定义匿名函数时,要将它赋值给一个变量
7. 下列程序,运行的结果是?()
def qh(a,b,c=5):
return a+b+c
print(qh(5,10),qh(10,10,10))时
A. 15 25
B.20 25
C.20 30
D.15 30
8. 有如下Python程序段,执行该程序段后的结果是?()
def area(rpi=3.14):
return r*r*pi
print(area(3,10))
A.90
B.28.26
C. 314
D. None
9.fun函数可以传入的参数a不确定有多少个,划线处的代码正确的是?()
def fun():
pass
A. a
B. A[]
C.a()
D.*a
10.请选择下面代码的输出结果是?
def f(n):
n +=1
return n
x=10
y = f(x)
print(y)
A.10
B. 11
C. 12
D. None
11.执行如下Python程序,语句“s=s+i”被执行的次数是?()def f(n):
S=0
for i in range(1,n):
ifi% 3 ==0 or i% 2 == 0:
S= S+i
f(10)
A.5
B.6
C. 7
D. 8
12. 有如下Python程序段,执行该程序后,输出的结果是?()
def qh(n):
s,f=0,1
for i in range(1,n+1):
S +=f*i
f=-f
return s
print(qh(4))
A. 10
B. 2
C.-2
D.-10
13. 有如下Python程序,运行后fac(a)函数被调用了几次?
def fac(a):
if a == 1:
return 1
else:
return a + fac(a-1)
print(fac(6))
A.5
B. 6
C. 7
D. 8
14.Python中对已经安装的第三方库进行更新,使之升级到最新版本的pip指令是?()
A.pip install <第三方库名>
B.pip install-U<第三方库名>
C.pip download <第三方库名>
D.pip search<第三方库名>
15.Python中可以通过import math 语句导入math函数库,下列选项中可以实现向下取整的是?()
A.math.ceil()
Bmath.sqrt()
C.math.round()
D.math.floor()
16.以下代码的时间复杂度是多少?()
i=1
n=100
while i < n:
i=i*2
A.O(n)
B.O(log2N)
C. O(n*n)
D. 0(n2)
17.以下哪种函数一定是直接或间接调用函数本身的函数?( )
A.自定义函数
B.库函数
C.匿名函数
D.递归函数
18.以下选项中关于递归算法的描述,错误的是?()
A.代码简明
B.一定要有基例(指不需要递归就能求解得的解)
C.递归算法都可以用非递归的方法实现
D.自定义函数体通常使用循环程序结构
19.实现递推算法的核心程序结构通常是使用?()
A.顺序结构
B.自定义函数
C.循环结构
D.分支结构
20.关于递归与递推算法,表述不准确的观点是?()
A.递推算法在计算过程中利用已知条件,不断用变量的旧值递推出变量的新值,直至得到结果的算法
B.递推算法利用循环结构来实现
C.递归算法把问题转化为规模缩小了的同类问题的子问题,然后再递归调用函数或过程来求得问题的解
D.由于递归算法的实现代码简明精练,因此实际工作中要尽量采用递归算法解决问题,以提高工作效益。
21.实际应用中,一般不采用递归的方法来解决层次或序列规模较大的计算问题,其原因是?
A.递归结束条件不易满足
B代码变得复杂
C.运行过程容易出错
D.算法运行所需的空间消耗增大,运行效率下降很快
22.运行下列Python程序后的结果是?()
def f(n):
n*2
return n
a=[7,1]
b=f(a)
print(a,b)
A.[7,1][7,1.7,1]
B.[7,1][14,2]
C.[7,1],[7.11.[7,1]
D.[7,1][7,1]
23.陈丽把自己每天的学习时间情况记录在文本文件"record.txt”中,现在她想用Python程序打开并读取某天的学习时间情况,请问打开文件的正确操作的是?()
A.open('record.txt','r')
B.close('record.txt','r')
C.write('record.txt')
D.readline('record.txt')
24. 小明设计了一个计算矩形体积的函数,以下调用函数的四个选项中,参数传递错误的是?()
def vol(length,width,height):
v= length * width * height
return v
A. s = vol(3,4,7)
print(s)
B. s= vol(3, 7,width=4)
print(s)
C.s= vol(3,height=7,width=4)
print(s)
D.s = vol(3, width=4,height=7)
print(s)
25. 小陈编写了一段计算超市打折活动的程序,运行时报错,原因可能是下面哪项?
def discount(price,rate):
final_ price = price *rate
old_price = float(input('请输入原价:”))
rate = float (input('请输入折扣率:"))
discount ( old price , rate )
print(“打折后价格是:',final price )
A.调用函数时参数传递错误,应该以参数名price传递
B.final price是局部变量,只在函数体内生效
C.定义函数时,没有定义参数的类型
D.函数体没有return语句,函数执行完毕后返回结果为None
二、判断题(共10题,共20分)
26.对数组进行快速排序是利用分治的思想,整个排序过程可以递归进行,算法效率高效,是一种稳定的排序算法,时间复杂度为O(nlogn)。()
27.把实现相同功能的代码作为一个代码块封装在一起,形成函数。()
28. 调用函数时如果位置实参和关键字实参两种方式混用,位置实参必须要放在关键字实参之前。()
29.有如下Python程序段,运行该程序段后,将提示错误。()
def js(x=3,y):
print(x,y)
js(10)
30.我们可以通过import模块的方法安装Python第三方库。()
31.如果执行算法所需的临时空间不会随变量的变化而变化,那么该算法的空间复杂度为一个常量。()
32.递归函数中,一定要包含对自身的调用,而且一定要有终止条件。()
33.递推算法设计时,首要任务是寻找规律,确定递推表达式,从而求解问题。
34.在Python语法中,全局变量只能在主程序中使用,局部变量只能在局部函数中可用。()
35. Python白定义函数时,传递参数的数量必须是明确的。()
三、编程题(共3题,共30分)
36.日期问题
小明同学学习Pvthon的函数后,想动手利用函数来解决生活中的问题。于是他突发奇想,输入日期,统计这一天是这一年的第几天。编写的代码如下,请完善划线处的代码。
def isRn(year):#判断year是否闰年or year % 400 == 0:
if __①___ or year %400==0:
return 1
return 0
def jsDays(data):#计算日期data在这一年是第几天
s=0
year = int(data[:4])
month = int(data[4:6])
day = int(data[6:])
for i in range(___②____):
s += days[i]
s += day
if month > 2 and___③____:
s += 1
return s
def checkRq(data):#判断输入的日期是否正确
month = int(data[4;6])
day = int(data[6:])
if month <1 or month >12:
return 0
if days[month-1]<day or day <1:
return 0
return 1
days = [31,28,31,30,31,30,31,31,30,31,30,31]#定义每个月的天数
rq =input(输入年月日,格式如:20240102
')
if checkRq(rq):
d=_④
print(r9,是这一年的第',d,'天')
else:
print(rq,'输入的日期有错误')
37.数学游戏
校园里流行一种新的数学游戏:每次邀请两个同学参加,第一个同学先从1和2中挑一个数字,第二个同学可以在对方的基础上选择加1或者加2,然后又轮到第一个同学,他也可以选择加1或者加2,之后再把选择权交给对方,就这样交替地选择加1或者加2,谁先加到20,谁就赢了。小智编写了以下程序,分析总共存在多少种可能出现的情形。请补充完成该程序。
def act(n):
if n==1 or __①__:
return 1
sn = __②__
return__③__
tn = act(__④__)
print("总共存在%d种可能出现的情形。"%tn)
38.乘客问题
某路公共汽车,总共有八站,从一号站发车时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘,到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个!…,到了终点站车上还有乘客6人问发车时车上的乘客有多少?根据递归思想,编写自定义函数完成该程序功能,完善空白处代码。
def num(i):
if i == 8:
return ①
else:
return②
print(③)
参考答案及解析:
一、单选题
1. 答案:C
- 解析:在50以内猜数字,每次都能将范围缩小一半,最多需要6次($2^5<50<2^6$)。
2. 答案:B
- 解析:二分查找法利用了分治算法思想,将问题分成较小的子问题进行解决。
3. 答案:B
- 解析:这是一个递归函数计算阶乘,`f(5)=5*f(4)=5*4*f(3)=5*4*3*f(2)=5*4*3*2*f(1)=5*4*3*2*1=120`。
4. 答案:D
- 解析:匿名函数定义计算圆周长应为`lambdar:3.14*2*r`。
5. 答案:A
- 解析:调用函数`sjc(20)`时,实参是20。
6. 答案:B
- 解析:匿名函数`lambda`不需要使用`return`来返回值,表达式的值就是返回值。
7. 答案:C
- 解析:第一个`qh(5,10)`计算`5+10+5=20`,第二个`qh(10,10,10)`计算`10+10+10=30`。
8. 答案:A
- 解析:函数`area`计算圆的面积,传入参数`3`和`10`,则计算`3*3*10 = 90`。
9. 答案:D
- 函数可以传入不确定数量的参数时,使用`*a`。
10. 答案:B
- 函数`f`将传入的参数加1后返回,`x = 10`,调用函数后`y = 11`。
11. 答案:B
- 循环中满足条件`i%3 == 0 or i%2 == 0`的数有2、3、4、6、8、9,共6个,所以语句“`s = s + i`”被执行6次。
12. 答案:C
- 函数`qh`通过循环计算`S += f * i`,其中`f`在每次循环中交替为正负,计算结果为-2。
13. 答案:B
- 函数`fac(a)`递归调用自身`a - 1`次,加上初始调用共`a`次,所以`fac(6)`被调用6次。
14. 答案:B
- `pip install -U <第三方库名>`可以更新已安装的第三方库。
15. 答案:D
- `math.floor()`可以实现向下取整。
16. 答案:B
- 循环中`i`每次乘以2,时间复杂度为$O(log_2N)$。
17. 答案:D
- 递归函数一定是直接或间接调用函数本身的函数。
18. 答案:D
- 递归函数体通常使用条件判断结构来确定是否继续递归调用。
19. 答案:C
- 实现递推算法的核心程序结构通常是使用循环结构。
20. 答案:D
- 虽然递归算法代码简明,但实际工作中不一定尽量采用递归算法解决问题,因为递归可能会导致空间消耗增大,运行效率下降。
21. 答案:D
- 一般不采用递归解决大规模问题是因为算法运行所需的空间消耗增大,运行效率下降很快。
22. 答案:D
- 函数`f(n)`中`n*2`没有赋值给任何变量,最后返回的是传入的参数`n`,所以`a=[7,1]`,`b=f(a)`后`b=[7,1]`。
23. 答案:A
- `open('record.txt','r')`可以以只读模式打开文件。
24. 答案:B
- 按照给出的函数定义,vol(length,width,height),这里vol(3, 7,width=4)会产生混淆,前面两个参数是位置参数,第三个参数突然变成了关键字参数,且不知道第三个位置参数对应的值是什么,这种传递方式错误。
25. 答案:B
- `final_price`是局部变量,只在函数体内生效,在外部打印会报错。
二、判断题
26. 答案:错
- 快速排序是不稳定的排序算法。
27. 答案:对
- 把实现相同功能的代码封装在一起形成函数。
28. 答案:对
- 调用函数时如果位置实参和关键字实参两种方式混用,位置实参必须放在关键字实参之前。
29. 答案:错
- Python中定义函数时,默认参数必须在非默认参数之后,这里`def js(x=3,y)`错误。
30. 答案:错
- 不能通过`import`模块的方法安装第三方库,应该使用`pip install`等命令安装。
31. 答案:对
- 如果执行算法所需的临时空间不随变量变化而变化,空间复杂度为常量。
32. 答案:对
- 递归函数中一定要包含对自身的调用且有终止条件。
33. 答案:对
- 递推算法设计首要任务是寻找规律确定递推表达式。
34. 答案:错
- 全局变量可以在函数中使用,但需要使用`global`关键字声明;局部变量在函数内部使用,但可以通过参数传递等方式在外部使用。
35. 答案:错
- Python自定义函数时,可以使用可变参数来传递不确定数量的参数。
三、编程题
36. 参考答案:
def isRn(year):
# 判断 year 是否闰年
if year % 4 == 0 and year % 100!= 0 or year % 400 == 0:
return 1
return 0
def jsDays(data):
s = 0
year = int(data[:4])
month = int(data[4:6])
day = int(data[6:])
for i in range(1, month):
s += days[i - 1]
s += day
if month > 2 and isRn(year):
s += 1
return s
def checkRq(data):
month = int(data[4:6])
day = int(data[6:])
if month < 1 or month > 12:
return 0
if days[month - 1] < day or day < 1:
return 0
return 1
days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
rq = input('输入年月日,格式如:20240102
')
if checkRq(rq):
d = jsDays(rq)
print(rq, '是这一年的第', d, '天')
else:
print(rq, '输入的日期有错误')
答案解析:
①处应填入`year % 4 == 0 and year % 100!= 0`,这是判断闰年的条件之一。
②处应填入`range(1, month)`,因为要遍历从1月到输入日期的前一个月,计算这些月份的总天数。
③处应填入`isRn(year)`,判断如果输入的日期在2月之后且当前年份是闰年,就需要加上一天。
④处应填入`jsDays(rq)`,调用函数计算输入日期是这一年的第几天。
37.参考代码:
def act(n):
if n == 1 or n == 2:
return 1
sn = act(n - 1) + act(n - 2)
return sn
tn = act(20)
print("总共存在%d 种可能出现的情形。"%tn)
答案解析:
以下是对四个空的答案及解析:
①处应填入`n==2`:
- 解析:题目中说明第一个同学先从 1 和 2 中挑一个数字,当当前数字为 1 或 2 时,只有一种可能出现的情形,所以这里判断当`n`等于 1 或 2 时返回 1。
②处应填入`act(n - 1) + act(n - 2)`:
- 解析:对于当前数字`n`,可以从`n - 1`通过加 1 到达`n`,也可以从`n - 2`通过加 2 到达`n`,所以到达`n`的情形数等于到达`n - 1`的情形数加上到达`n - 2`的情形数,通过递归调用`act(n - 1)`和`act(n - 2)`来实现。
③处应填入`sn`:
- 解析:将计算得到的到达当前数字`n`的情形数`sn`返回。
④处应填入`20`:
- 解析:最终目的是计算到达数字 20 有多少种可能出现的情形,所以调用`act`函数时传入参数 20。
38、 参考答案:
参考代码:
def num(i):
if i == 8:
return 6
else:
return (num(i + 1) - (8 - i)) * 2
print(num(2))
答案解析:
①处应填入`6`:
- 解析:当`i == 8`时,也就是到了终点站,已知终点站车上还有乘客 6 人,所以返回 6。
②处应填入`(num(i + 1) - (8 - i)) * 2`:
- 解析:每到一站,先下一半乘客,再上来比前一站少一个乘客。如果下一站(`i + 1`)的人数是`num(i + 1)`,那么当前站(`i`)的人数应该是`((下一站人数 - 当前站上来的乘客数) * 2)`,当前站上来的乘客数是`8 - i`(因为每站上来的乘客比前一站少一个,从第二站开始,第二站上来 6 个,第三站上来 5 个……第八站上来 1 个,所以第`i`站上来的是`8 - i`个),所以这里返回`(num(i + 1) - (8 - i)) * 2`。
③处应填入`num(2)`:
- 解析:从第二站开始调用函数计算发车时车上的乘客数,因为题目中从一号站发车时车上已有`n`位乘客,但实际上在函数中是从第二站开始递归计算的,所以这里传入参数 2 调用`num`函数,最后计算出的结果也就是从第一站发车时车上的乘客数。
学科网(北京)股份有限公司
$$