内容正文:
青少年软件编程(Python)等级考试试卷(四级)
202406真题与解析
分数:100 题数:38 测试时长:60分钟
一、单选题(共25题,每题2分,共50分)
1.执行以下程序后所输出的结果是?( )
def f(n):
s=0
for i in range(2, n+1):
p = True
for j in range(2, int(i**0.5)+1):
if i % j == 0:
p = False
break
if p==True and i%3==1:
s=s+i
return sprint(f(13))
A 20 B 41 C 21 D 91
2.以下说法错误的是?( )
A python中可以在不同的自定义函数中声明相同名字的变量,使用时不会造成数据混乱
B 形参在其自定义函数内不能与其它变量重名
C 全局变量可以被多个自定义函数调用
D 因为全局变量作用域是整个程序,所以局部变量和全局变量不能使用相同变量名
3.当程序运行时,如果自定义函数内某个变量与程序的全局变量使用相同的变量名,程序会如何处理?( )
A 优先调用全局变量,屏蔽局部变量 B 优先调用局部变量,屏蔽全局变量
C 程序报错 D 将二者视为相同变量,赋值等操作会对二者同时产生影响
4. 如下代码,运行之后,最终打印结果是?( )
def f(x):
color=["红","橙","黄","绿","青","蓝","紫"]
def lucky(x,y):
n=x+y
return n
m=x*int(lucky(5,6))%7
print("幸运颜色是:",color[m])
f(5)
A 幸运颜色是:红 B 幸运颜色是:橙 C 幸运颜色是:黄 D 运颜色是:紫
5. 以下有关return 语句的表述中错误的是?( )
A return语句可以出现在函数内部的任何位置
B 一个函数内可以存在多个return语句,但在函数执行过程中,只有一个会被执行
C 一个函数可以没有return语句,视为返回一个None对象
D return`语句可以返回多个值,比如return a,b,c,将返回一个列表[a,b,c]
6.以下关于关键字nonlocal 和 global表述中错误的是?( )
A:global声明的变量将变成全局变量
B:nonlocal只能声明引用上一层函数中的局部变量,如不存在则会继续向上一层寻找
C:nonlocal 和 global相同点是在函数体内改变非局部变量的值
D:global声明变量时不能同时对该变量赋值
7.用枚举算法求解“各位数之和等于8的所有三位数”时,下列枚举范围中效率最高的是?( )
A:0-999 B:100-999 C:100-800 D:107-800
8.下列关于分治算法的描述中,错误的是?( )
A问题的规模分解到一定的程度,问题容易解决 B问题可以分解为若干个规模较小相同问题
C问题所分解出的各个子问题是可以相互交叉 D问题分解出的子问题的解可以合并为该问题的解
9.解决下列问题体现分治算法思想的是?( )
A打印1000以内的完美数(完美数是除了本身之外的因数之和等于本身) B输出100以内能被5整除的整数
C求斐波那契数列第n项 D用快速排序算法对n个整数升序排序
10.有6位学生的身高分别为“166、168、169、171、172、175”,其中小王的身高为172,若采用二分查找,则需要找多少次才能够找到小王?( )
A:1 B:2 C:3 D:4
11.阶乘是一个数与所有小于它的正整数的乘积。例如,5的阶乘(写作5!)是5 * 4 * 3 * 2 * 1 = 120。以下是用递归方法编写求阶乘的代码,横线处填写的代码是?( )
def fun(n):
if n == 1:
return 1
else:
return ________print(fun(5))
A n * (n-1) B fun(n-1) C n * fun(n-1) D fun(n*(n-1))
12.运行如下代码,请输出运算结果?( )
def fun(lst):
if len(lst) == 0:
return 0
return lst[0] + fun(lst[1:])
x = [1,2,3,4,5]print(fun(x))
A:9 B:6 C:10 D:15
13.以下是编写一个Python函数,使用递归方法实现字符串的反转,请在横线处填写正确的代码?( )
def fun(s):
if len(s) <= 1:
return s
else:
return _____________
x = "abcde"print(fun(x))
A fun(s[1:]) B fun(s[1:]) + s[0] C fun(s[:1]) + s[0] D fun(s[:1])
14.运行以下代码,请输出运算结果?( )
def fun(s, n):
if n == 0:
return ""
else:
return s + fun(s, n-1)
s = "abc"
n = 3print(fun(s, n))
A:abc B:abab C:abcabcabc D:ababab
15.运行以下代码,请输出运算结果?( )
x = 1
while x < 100:
if x % 3 != 0:
print(x, end=',')
elif x // 10:
break
x += 2print(x)
A:1 B:3,9,11 C:3,6,9,10 D:1,5,7,11,13,15
16.下面图形每一行从字母A开始,以ABC方式重复。行数为输入的整数。请在python代码段横线处填入合适的代码?( )
A
AB
ABC
ABCA
ABCAB
ABCABC
ABCABCA
n = int(input())
for i in range(1, n+1):
for j in range(0, i):
print("%s" % _____________, end='')
print()
A 'A' + j / 3 B chr(ord('A') + j % 3) C 'A' + j % 3 D hr(ord('A') + j / 3)
17.以下哪种情况下适合使用自定义函数?( )
A体现自己独特思路的功能块 B代码量大的功能块 C会多次用到的功能块 D逻辑复杂的功能块
18.调用自定义函数时,以下哪种情况下程序运行时一定会出错?( )
A对实参以关键字赋值的方式去调用函数 B对形参赋以默认值
C给赋予了默认值的形参传入新值 D传入的实参个数比形参个数少
19.以下程序语句中,存在语法错误的是?( )
A result= lambda a:a+b
B lambda a,b,c:a**0.5
C lambda a,b=10:a*b
D dlt=lambda a,b,c:b**0.5-4*a*c
20.对于如下自定义的函数:
def myfunc(a,b,c)
return a+b+c
以下调用该函数的语句中,能正确执行的是?( )
A myfunc(1,2) B myfunc(a=3,2,1) C myfunc(3,b=2,1) D myfunc(3,2,c=1)
21.对于以下自定义函数及程序,运行后的结果是?( )
def prts( str ):
print (str)
return str
s="Py"
prts(prts(s))
A 出错 B Py C Py及None D Py及Py
22.使用*args和**kwargs形参来定义函数时,正确的说法是?( )
A使用*args代表列表,使用**kwargs代表元组 B可以在调用函数时传入多个实参
C不再允许设置位置参数或关键字参数 D可以设置位置参数或关键字参数,但必须放置在*args参数前面
23.下列关于函数return语句的说法,正确的是?( )
A return语句中返回值的数据类型可以是字符串,也可以是列表 B 一个函数中只能有一个return语句
C return语句中不能有表达式 D return只能返回一个值
24.用Python绘制y=x**2+6*x+2的函数图像,需要用到的模块是?( )
A plot B pygame C matplotlib D turtle
25.陈明同学利用Python语言编写了一段“根据出生年月判断生肖属相”的程序,调试运行时,程序没有报错且顺利运行,但未能正确输出对应属相,造成这个结果的原因可能是?( )
A程序语句语法错误 B程序复杂度高,算法效率低
C Python的环境配置不对 D求解算法的逻辑错误
二、判断题(共10题, 共20分)
26.如果在函数内访问其作用域内不存在的变量,程序一定会报错。( )
27.时间复杂度最小的是常数阶O(1)。( )
28.某同学参加猜幸运数(幸运数范围是1-100之间)游戏:先猜50,主持人说偏大;然后猜25,主持人说偏小;然后又猜37……通过这种策略,该同学很快猜出幸运数,这体现了分治思想。( )
29.某个问题既能用递归算法求解,又能用递推算法求解,则使用递归算法求解更容易,效率也高得多。( )
30.执行如下代码,输出结果是95。( )
n = 100
while n > 0:
if n % 2:
break
elif n % 3 == 0:
n -= 5
else:
n -= 20
print(n)
31.编程时,必须把实现复杂功能的代码封装起来,设计成函数。( )
32.自定义函数中可以不使用return语句,但匿名函数中要通过return语句返回运算结果。( )
33.如果允许形参设置默认值,则函数定义时要先列出没有默认值的形参,再列出有默认值的形参。( )
34.Numpy是Python的一个第三方库,是一个科学计算库,提供各种数学运算和科学计算的方法。( )
35.变量作用域的使用可提高程序逻辑的局部性,增强程序的可靠性,减少名字冲突,有效提高程序运行效率。( )
三、编程题(共3题, 共30分)
36.计算问题从1到n的数字(包含n),分别计算出能被k整除的数字之和与不能被k整除的数字之和,并输出它们差的绝对值,完成下列程序。
n = int(input("n="))
k = int(input("k="))
s1, s2 = 0, 0
for i in range(1, __①___):
if (___②__ == 0):
s1 = ___③____
else:
s2 = ___④____
print(___⑤____)
37.劳动实践基地育才学校的劳动实践基地是一个巨大的矩形,参与劳动实践的同学们每次只能种一个正方形地块,每种一个正方形时所花的体力值是正方形的周长,本学期种过的地不可以再种,同学们想使用最少的体力值去种完这块田地,请帮助计算花费最小的体力值。输入格式
两个正整数 x,y,表示田地的长和宽。
输出格式
输出最小体力值。
输入样例1
1 10
输出样例1
40
输入样例2
2 2
输出样例2
8
def solve(x, y):
if x == y:
return ①
if x > y:
a, b = x, y
else:
a, b = ②
if ③ :
return 4 * a
else:
return 4 * a + solve( ④ , b)
n, m = map(int, input().split())
print(solve(n, m))
38、约瑟夫环2024年春节联欢晚会上,刘谦表演了一个纸牌魔术,深受观众欢迎。这个魔术的内容其实是一个经典的约瑟夫环问题,相当于n张牌形成一个环,依次循环报数,每次报到m的那一张牌扔掉,直到剩下最后一张牌。小智编写了以下程序来模拟8张牌的淘汰过程,请补充完成该程序。
def Josephus(num,gap):
location_list = [a for a in range(1,num+1)]
if num == 1 :
①
else:
index = 0
for i in ② :
index = (index + gap - 1 )% ③
print("本次淘汰的牌为:",location_list[index])
del location_list[index]
print( "最后剩下的牌为:",location_list[ ④ ])
Josephus(8,2)
参考答案及解析:
一、单选题
1. 答案:A
- 解析:分析函数`f(n)`,遍历 2 到`n`,判断素数且满足`i%3==1`则累加`i`。调用`f(13)`,经过计算`s`最终为 20,答案是 A。
2. 答案:D
- 解析:局部变量和全局变量可以使用相同变量名,在函数内优先使用局部变量,屏蔽全局变量。
3. 答案:B
- 解析:当自定义函数内某个变量与程序的全局变量使用相同的变量名时,优先调用局部变量,屏蔽全局变量。
4. 答案:D
- 解析:先计算内部函数得值为 11,再计算`m = 5 * int(11) % 7 = 6`,根据索引从列表中取出“紫”,答案是 D。
5. 答案:D
- 解析:`return a,b,c`将返回一个元组,而不是列表。
6. 答案:B
- 解析:如果外层函数中不存在该变量,则会报错,不会继续向上寻找。
7. 答案:D
- 解析:缩小枚举范围可以提高效率,107-800的范围更有针对性。
8. 答案:C
- 解析:分治算法中问题所分解出的各个子问题是相互独立的,不能相互交叉。
9. 答案:D
- 快速排序算法体现了分治算法思想,将问题分解为较小的子问题进行排序,然后合并。
10. 答案:B
- 二分查找每次将区间缩小一半。 1. 第一次查找:区间为整个序列“166、168、169、171、172、175”,中间元素是 171,172>171,所以在右侧区间继续查找。 2. 第二次查找:区间变为“172、175”,中间元素是 172,找到了小王。 所以需要找 2 次才能够找到小王, 答案是 B。
11. 答案:C
- 递归求阶乘,`n`的阶乘等于`n * (n - 1)`的阶乘,即`n * fun(n - 1)`。
12. 答案:D
- 函数`fun`通过递归计算列表中所有元素的和,`[1,2,3,4,5]`的和为15。
13. 答案:B
- 递归实现字符串反转,先反转后面的部分再加上第一个字符。
14. 答案:C
- 函数`fun`通过递归重复拼接字符串`n`次。
15. 答案:D
- 初始x = 1,循环中奇数且不是 3 的倍数被打印,打印出 1,5,7,11,13,15等奇数。
16. 答案:B
- 根据循环和取余操作,打印出重复的`ABC`序列,使用`chr(ord('A') + j % 3)`可以得到正确结果。
17. 答案:C
- 会多次用到的功能块适合设计成函数,提高代码复用性。
18. 答案:D
- 传入的实参个数比形参个数少会导致程序运行时出错。
19. 答案:A
- `result = lambda a:a+b`中`b`未定义。
20. 答案:D
- 调用函数时实参和形参要对应,`myfunc(3,2,c=1)`正确地传入了三个参数。
21. 答案:D
- 函数`prts`先打印传入的参数,再返回参数,调用`prts(prts(s))`会先打印`Py`,然后再打印返回的`Py`。
22. 答案:B
- `*args`和`**kwargs`可以在调用函数时传入多个实参。
23. 答案:A
- `return`语句中返回值的数据类型可以是字符串、列表等多种类型;一个函数中可以有多个`return`语句;`return`语句中可以有表达式;`return`可以返回多个值,返回的是元组。
24. 答案:C
- 用`matplotlib`模块可以绘制函数图像。
25. 答案:D
- 程序没有报错且顺利运行,但未能正确输出对应属相,可能是求解算法的逻辑错误。
二、判断题
26. 答案:错
- 如果在函数内访问其作用域内不存在的变量,会先在外部作用域查找,如果找不到才会报错。
27. 答案:对
- 时间复杂度最小的是常数阶`O(1)`,表示算法的执行时间不随输入规模的增长而增长。
28. 答案:对
- 猜幸运数的过程体现了分治思想,将问题范围不断缩小。
29. 答案:错
- 虽然递归算法代码简洁,但效率不一定比递推算法高,递归可能会有重复计算,效率可能较低。
30. 答案:错
- 程序中当`n = 100`时,不满足`n % 2`,执行`n -= 20`,变为80;接着不满足`n % 2`,又执行`n -= 20`,变为60;继续不满足`n % 2`,执行`n -= 20`,变为40;还是不满足`n % 2`,执行`n -= 20`,变为20;此时满足`n % 2 == 0`且`n % 3 == 0`,执行`n -= 5`,变为15。所以输出结果是15。
31. 答案:错
- 不是必须把实现复杂功能的代码封装起来设计成函数,要根据实际情况决定。
32. 答案:错
- 自定义函数中也可以不使用`return`语句而直接打印结果等;匿名函数中也可以不通过`return`语句,直接在表达式中返回结果。
33. 答案:对
- 如果允许形参设置默认值,函数定义时要先列出没有默认值的形参,再列出有默认值的形参。
34. 答案:对
- `Numpy`是一个科学计算库,提供各种数学运算和科学计算的方法。
35. 答案:错
- 变量作用域可提高程序逻辑局部性、增强可靠性、减少名字冲突,但不一定能有效提高程序运行效率,故答案为错误。
三、编程题
36. 参考代码:
n = int(input("n="))
k = int(input("k="))
s1, s2 = 0, 0
for i in range(1, n + 1):
if (i % k == 0):
s1 = s1 + i
else:
s2 = s2 + i
print(abs(s1 - s2))
答案解析:
1. 第①是`n + 1`,因为要包含`n`这个数字,所以循环范围应该是`range(1, n + 1)`。
2. 第②是`i % k`,判断`i`是否能被`k`整除。
3. 第③空是`s1 + i`,如果能被整除,将`i`累加到`s1`。
4. 第④空是`s2 + i`,如果不能被整除,将`i`累加到`s2`。
5. 第⑤空是`abs(s1 - s2)`,输出`s1`和`s2`差的绝对值。
37.参考代码:
def solve(x, y):
if x == y:
return 4 * x
if x > y:
a, b = x, y
else:
a, b = y, x
if b == 0:
return 4 * a
else:
return 4 * a + solve(a % b, b)
n, m = map(int, input().split())
print(solve(n, m))
答案解析:
1. 第①为“4 * x”,当矩形的长和宽相等时,即种一个边长为 x 的正方形,其周长为 4x,这是最小体力值。
2. 第②为“y, x”,如果输入的 x 小于 y,需要交换 x 和 y 的值,保证 a 是较大的边长,b 是较小的边长。
3. 第③为“b == 0”,当较小的边长 b 为 0 时,说明已经完成了分割,返回当前最大正方形的周长 4 * a。
4. 第④为“a % b, b”,每次用较大边长 a 除以较小边长 b 的余数和较小边长 b 作为新的长和宽继续递归计算。
38.参考代码:
def Josephus(num, gap):
location_list = [a for a in range(1, num + 1)]
if num == 1:
print("最后剩下的牌为:", location_list[0])
else:
index = 0
for i in range(num):
index = (index + gap - 1) % len(location_list)
print("本次淘汰的牌为:", location_list[index])
del location_list[index]
print("最后剩下的牌为:", location_list[0])
Josephus(8, 2)
答案解析:
1. ①如果只有一张牌,直接输出这张牌,即`print("最后剩下的牌为:", location_list[0])`。
2. ②循环`num`次,即`range(num)`,表示进行`num`轮淘汰。
3. ③每次计算下一个要淘汰的牌的索引时,要对当前列表长度取模,即`% len(location_list)`。
4. ④当只剩下一张牌时,索引为 0,即`location_list[0]`。
学科网(北京)股份有限公司
$$