内容正文:
青少年软件编程(Python)等级考试试卷(四级)
202203真题与解析
分数:100 题数:38 测试时长:60分钟
一、单选题(共25题,每题2分,共50分)
1. 关于函数,以下选项中描述错误的是? ( )
A. 函数能完成特定的功能,对函数的使用不需要了解函数内部实现原理,只要了解函数的输入输出方式即可。
B. 使用函数的主要目的是减低编程难度和代码重用。
C. Python 使用 del 保留字定义一个函数。
D. 函数是一段具有特定功能的、可重用的语句组。
2. Python机器学习方向的第三方库是? ( )
A. Turtle
B. TensorFlow
C. Pygame
D. Random
3. Python可以将形式参数定义为可变参数,即传入函数中的实际参数可以是任意多个,主要有“*parameter”以及“**parameter”两种形式。以下关于可变参数的定义形式表述错误的是? ( )
A. “*parameter”这种形式表示接受任意多个实际参数并将其放到一个列表中
B. 如果想要使用一个已经存在的列表作为函数的可变参数,可以在列表的名称前加“*”后作为形式参数进行调用
C. “**parameter”这种形式表示接受任意多个类似关键字参数一样显示赋值的实际参数并将其放到一个字典中
D. 如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典的名称前加“**”后作为形式参数进行调用
4. 关于以下程序,运行程序输出的结果是? ( )
def demo(a,b):
print(a+b)
mydict={'a':1,'b':2}
demo(**mydict)
demo(*mydict)
A. 3 3
B. 3 ab
C. ab 3
D. ab ab
5. 函数调用时通过“键-值”形式加以指定实际参数,即使用关键字参数,可以让函数更加清晰、容易使用,关于关键字参数的限制,以下表述中哪一个是错误的? ( )
A. 关键字参数之间不存在先后顺序
B. 不得重复提供实际参数
C. 关键字参数可以位于位置参数之前
D. 关键字参数必须位于位置参数之后
6. 下列关于函数的说法,错误的是? ( )
A. 函数是一种功能抽象的模块
B. 使用函数的目的只是为了增加代码复用
C. 函数的使用包括定义函数和调用函数
D. 函数名可以是任何有效的Python标识符
7. 下列哪个关键字可用来创建自定义函数? ( )
A. function
B. def
C. class
D. procedure
8. 关于算法描述正确的是? ( )
A. 算法是一种程序设计语言
B. 算法每个步骤必须有确切的定义
C. 算法就是数值计算方法
D. 算法至少要有一个输入
9. 以下哪个不是Python中的内建函数? ( )
A. ord(x)
B. abs(x)
C. chr(x)
D. def(x)
10. 以下选项中,关于python函数参数的说法错误的是? ( )
A. 在调用一个函数时,若函数中修改了实参变量的值,则对应的形参变量的值也被修改
B. 函数一定要有参数和返回值
C. 位置形参必须在关键字形参的前面
D. 函数的形参在函数被调用时获得初始值
11. 关于Python的自定义函数的描述,下列哪个选项是错误的? ( )
A. 函数名的命名规则与变量名的命名规则相同
B. 如果有多个参数,各参数之间使用“,”隔开
C. 函数没有参数,在函数名后面仍然要保留一对空的“()”,后面不需要加“:”
D. 函数体相对于自定义函数的关键字必须保持一定的缩进
12. 执行以下程序,以下选项中哪一项是错误的? ( )
def miao(x,y):
z=x+y*2
y=x
return z
x=2
y=3
z=miao(x,y)+y
A. 该函数名称为miao
B. 执行该函数后,变量x的值为2
C. 执行该函数后,变量y的值为2
D. 执行该函数后,变量z的值为11
13. 可以通过下列哪一个关键字,通过局部变量修改全局变量的值? ( )
A. nonlocal
B. global
C. nonglobal
D. Globall
14. 设有以下函数,运行程序输出的结果是? ( )
def fun(m,n):
m-=n
return m
a=fun(4,1)
print(a)
A. 1
B. 2
C. 3
D. 4
15. 有如下 Python 程序,运行该程序后,输出结果为? ( )
def fun(s):
st=s[1]
for i in range(1,len(s)):
if len(st)==0 or s[i]!=st[len(st)-1]:
st=st+s[i]
else:
st=st[0:len(st)-1]
print(st)
fun("xxyyzzxyz")
A. xyz
B. xyzxyz
C. xyxyz
D. xxyyz
16. 观察下列代码,说法错误的项是? ( )
def fi(n):
if n==1 or n==2:
s=1
else:
s=fi(n-1)+fi(n-2)
return s
a=int(input("请输入a的值:"))
print(fi(a))
A. 该程序段用递归算法来实现
B. 语句“def fi(n):”中的n为形参
C. 边界条件为n==1
D. 当a=6时,程序输出8
17. 以下函数要计算1到100自然数的和,则划线处应补充选项为? ( )
def su(n):
s =0
while n > 0:
————————————
return s
print(su(100))
A. n=n-1 s=s+n
B. n=n+1 s=s+n
C. s=s+n n=n-1
D. s=s+n n=n+1
18. 下列关于递归的描述不正确的是? ( )
A. 递归函数一定包含条件控制语句
B. 递归函数一定包含调用自身的语句
C. 在调用自身函数时需要明确的边界终止条件
D. 递归算法一般代码简洁,执行效率高,空间复杂度低
19. 以下关于递归与递推方法的比较,正确的观点是? ( )
A. 递推是将复杂问题分解成若干个子问题,依次降解,求出低阶规模的解,代入高阶问题中,直至求出原问题的解
B. 递归是构造低阶规模的问题,并求出解,依次推导出高阶的问题以及解,直至求出问题的解
C. 数学上的递推关系可以通过递归的方法来实现
D. 递归算法代码简洁,运行速度比递推快,因此应该尽量采用递归的方法
20. 下列程序段的运行结果为? ( )
def fun(a):
if a<=1:
return 1
else:
return fun(a-1)*2
print(fun(5))
A. 4
B. 8
C. 16
D. 25
21. 以下函数要实现5的阶乘,则划线处应补充选项为? ( )
def fun(i):
if i<=1:
return 1
else:
return
print(fun(5))
A. i*(i-1)*(i-2)*...*2*1
B. (i-1)*fun(i)
C. i*fun(i+1)
D. i*fun(i-1)
22. 以下常见算法中,体现分治思想的是? ( )
A. 解析算法
B. 枚举算法
C. 冒泡排序
D. 对分查找
23. 对于序列98,88,76,65,48,24,12,12,8,1,采用“对分查找”法查找8,需要查找多少次? ( )
A. 5
B. 4
C. 3
D. 2
24. 分治法所能解决的问题一般具有以下几项特征,下列哪一项描述不正确? ( )
A. 该问题的规模缩小到一定的程度就可以容易地解决
B. 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
C. 利用该问题分解出的子问题的解可以合并为该问题的解
D. 该问题所分解出的各个子问题之间包含公共的子子问题
25. 一般用于安装Python第三方库的工具是? ( )
A. import
B. install
C. setup
D. pip
二、判断题(共10题,共20分)
26. 如下图代码,运行之后,最终打印出的结果是4,请判断对错。()
27.下图左右两段代码运行之后,打印出的结果不相同!请判断对吗?()
28. 为实现下图左边的打印效果,小明编写了如下图右边的代码。
请问,他这代码能正确打印出左边效果来吗?()
29. 为打印出5、4、3、2、1这个数字序列,小明编写了一个递归函数,如下图所示。
请问,他这个程序是正确的吗?()
30.有abc三个口袋,a袋中有1粒糖,b袋中有2粒糖,c袋中有3粒糖小红与小明两人轮流在任意一袋中取糖出来。每次可以在任意一袋中,取任意颗(比如,可在c袋中取3、2、1任意颗)到最后,谁最后一次取,并将所有糖都取完了,谁就获胜,获胜者将得到所有的糖。
小明让小红先取,自己后取。
小红说:不!先取的人肯定会输!
请判断,小红所说,是正确还是错误?( )
31. 小明听说,使用pygame模块可以编写很多有趣的小游戏,于是他想在自己的电脑上安装这个模块。
他使用了如下命令进行安装,请问,他下面这条命令正确吗?()
pip install -i https://pypi.doubanio.com/simple/ pygame
32. 匿名函数L(x1,y1,x2,y2)的返回值是(x1-x2)**2 + (y1-y2)**2的计算结果。()
L = lambda x1,y1,x2,y2:(x1-x2)**2 + (y1-y2)**2
33. primenumber(number)函数是判断一个数是否是素数的函数,将函数的循环条件“for i in range(2,number)”更改为“for i in range(2,number//2)”能够降低primenumber(number)函数的时间复杂度。()
def primenumber(number):
if number < 2:
print(number,"不是素数!")
else:
for i in range(2,number):
if number % i == 0:
print(number,"不是素数!")
break
else:
print(number,"是素数!")
34. 在一个程序实现过程中,若某一部分的代码功能反复出现了多次,我们可以把这段反复出现的代码定义成一个函数,然后在需要的时候调用,这体现了函数代码的复用性。()
35. 执行以下代码:()
def func(list_1):
list_1=[5,8]
list_1=[20,12,53]
func(list_1)
t=tuple(list_1)
print(t)
程序输出的结果为:(5,8)。
三、编程题(共3题,共30分)
36. 7个评委给每个选手打分,评委分数中去掉最高分与最低分,计算所得平均分是每个选手的最后得分,保留2位小数。
根据上述计算规则,编写自定义函数完成程序功能,完善代码。
"""
根据评委分数,计算去掉最高分与最低分后的平均分,保留2位小数
函数名 def getScore(fs):
参数 fs:表示评委的分数,为列表
返回值 :返回选手的得分,保留2位小数。
"""
def getScore(fs):
maxfs = 0
minfx = 999999
n = ①
for f in fs:
if f > maxfs:
②
elif f < minfx:
minfx = f
yxf = sum(fs)-maxfs-minfx
avgfs = ③
return avgfs
fs = [9.56,9.68,9.78,9.67,9.81,9.21,9.75]
defen = ④
print(defen)
37. 素数是只能被1和本身整除的正整数,编写自定义函数,实现判断正整数是否为素数。完善程序代码。
"""
判断正整数n是否为素数,若是返回True;否则返回False
函数名 def prime(n)
参数 n:表示正整数
返回值 :n是素数,返回True;否则返回False
"""
def prime(n):
if n < 2:
return False
else:
for i in range( ① ,n):
if ② :
return False
return ③
n = 7
if ④ :
print("{}是素数".format(n))
else:
print("{}不是素数".format(n))
38. 编写程序计算n(n<=10)位数中,包含奇数个5的个数。比如1位数中包含奇数个5的个数是1个。利用递推方法计算n位数包含奇数个5的个数。完善划线处的代码。
c = [[0 for i in range(2)] for i in range(11)] #存放奇数个5和偶数个5的二维列表
c[1][0] = 9 #一位数中包含偶数个5的个数
c[1][1] = 1 #一位数中包含奇数个5的个数
k = 9
n = 5
for i in range(2, ① ):
if i == n:
k = ②
c[i][0] = c[i-1][1] + k * c[i-1][0]
c[i][1] = ③
print(c[n][1])
参考答案及解析:
一、单选题
1. 答案:C
- 解析:Python使用`def`保留字定义一个函数,不是`del`。
2. 答案:B
- 解析:`TensorFlow`是Python机器学习方向的第三方库;`Turtle`是图形绘制库;`Pygame`是游戏开发库;`Random`是随机数生成库。
3. 答案:A
- 解析:可变参数“*parameter”这种形式表示接受任意多个实际参数并将其放到一个元组中,如果想要使用一个已经存在的列表作为函数的可变参数,可以在列表的名称前加“*”后作为形式参数进行调用;“**parameter”这种形式表示接受任意多个类似关键字参数一样显示赋值的实际参数并将其放到一个字典中,如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典的名称前加“**”后作为形式参数进行调用。
4. 答案:B
- 解析:`demo(**mydict)`使用关键字参数调用函数,输出1+2=3;`demo(*mydict)`将字典的键作为位置参数传递给函数,输出“ab”。
5. 答案:C
- 解析:关键字参数必须位于位置参数之后,不能在位置参数之前。
6. 答案:B
- 解析:使用函数的目的不仅是增加代码复用,还包括提高代码的可读性、可维护性等。
7. 答案:B
- 解析:Python使用`def`关键字创建自定义函数。
8. 答案:B
- 解析:算法是指解题方案的准确而完整的描述,每个步骤必须有确切的定义;算法不是一种程序设计语言,也不只是数值计算方法,算法可以有零个或多个输入。
9. 答案:D
- 解析:`ord(x)`返回字符的 ASCII 值,`abs(x)`返回数字的绝对值,`chr(x)`根据 ASCII 值返回字符,没有`def(x)`这个内建函数。
10. 答案:B
- 解析:函数不一定要有参数和返回值,可以定义无参数无返回值的函数。
11. 答案:C
- 解析:函数没有参数,在函数名后面仍然要保留一对空的“()”,后面需要加“:”。
12. 答案:C
- 解析:函数`miao`计算`x + y * 2`的值,并将`y`赋值为`x`。调用`miao(x,y)+y`,即`miao(2,3)+3=(2 + 3 * 2)+3=11`,变量`y`的值在函数内部被修改为2,但在函数外部仍然是3。
13. 答案:B
- 解析:使用`global`关键字可以在局部作用域中修改全局变量的值。
14. 答案:C
- 解析:函数`fun`计算`m - n`的值并返回,调用`fun(4,1)`返回4 - 1 = 3。
15. 答案:A
- 解析:函数`fun`遍历输入的字符串,将相邻重复的字符删除,最后输出不重复的字符序列。
16. 答案:C
- 解析:边界条件为`n==1`或`n==2`。
17. 答案:C
- 解析:循环中每次将当前的`n`加到`s`上,然后`n`减1,直到`n`变为0。
18. 答案:D
- 解析:递归算法一般代码简洁,但执行效率不一定高,因为可能存在很多重复计算,空间复杂度也可能较高。
19. 答案:C
- 数学上的递推关系可以通过递归的方法来实现。递推是从低阶问题逐步推导高阶问题的解;递归是将复杂问题降解成若干个子问题,通过解决子问题来求解原问题。
20. 答案:C
- 函数`fun`是递归函数,每次调用将结果乘以2,`fun(5)=fun(4)*2=fun(3)*2*2=fun(2)*2*2*2=fun(1)*2*2*2*2=1*2*2*2*2=16`。
21. 答案:D
- 递归实现阶乘,当`i>1`时,`i`的阶乘等于`i`乘以`(i-1)`的阶乘。
22. 答案:D
- 对分查找体现了分治思想,将问题分成较小的子问题进行求解。
23. 答案:C
- 第一次查找中间值为48,8小于48,第二次查找中间值为12,8大于12,第三次查找找到8,共查找3次。
24. 答案:D
- 分治法所解决的问题,各个子问题之间是相互独立的,不包含公共的子子问题。
25. 答案:D
- `pip`是用于安装Python第三方库的工具。
二、判断题
26. 答案:正确
- 默认参数的值被改变了,所以将计算传入的两个参数的值,结果就是4。
27. 答案:错误
- 第一段代码打印出的结果应该是5,第二段代码变量b的值并没有被改动,打印出的结果是3,所以两段代码结果不同。
28. 答案:正确
- 基本的递归,函数通过对自身的调用,实现每将调用参数减1,所以,本题正确。
29. 答案:错误
-递归在判断之前,程序将永无止境,不会停止,所以,这个程序写错了。正确的写法,应该把n(x-1),放到if判断语句之后。
30. 答案:正确
- 从最简单的开始:1、如果总共只有1粒糖,则谁先谁胜;2、如果有两袋,每袋中有1颗,显然谁先谁输:3、如果有两袋,1袋中1颗,另一袋中有2颗,显然谁先谁胜(只需拿掉2颗中的一颗,剩下条件就变成了上面2,对方先,对方输);如果有两袋,每袋都是2颗,显然谁先谁输(如果一次拿掉2颗,
则对方拿剩下的2颗,对方胜;如果只拿某袋中的1颗,则变成了上面3,对方先,也是对方胜)5、如果有三袋,每袋1颗,则显然谁先谁胜6、如果有三袋,其中两袋有1颗,一袋2颗,显然谁先谁胜,只需将2颗的拿掉,剩下两个1颗,就是上面2,对方先对方输如果有三袋,其中两袋有2颗,一袋1颗,显然谁先谁胜(只需拿掉1颗的,剩下就变成了上面4,对方先,对方输)8、如果三袋,分别有1、2、3颗,谁先谁输:如果从3中拿1颗,就变成了上面7,对方先,对方胜;如果从3中拿2,就变成上述6,也是对方胜,如果将3拿完,就变成上述3,也是对方胜。所以,整个游戏,谁先谁输。
31. 答案:正确
- `pip install -i https://pypi.doubanio.com/simple/ pygame`是正确的安装`pygame`模块的命令。
32. 答案:正确
- 匿名函数`L(x1,y1,x2,y2)=(x1-x2)**2 + (y1-y2)**2`的返回值是`(x1-x2)**2 + (y1-y2)**2`的计算结果。
33. 答案:错误
- 判断number是否是素数时,如果在:1~number/2范围内存在一个数能将number整除,那么number就不是素数。例如:number=a×b,当a≥number/2时,b<number/2,当b≥number/2时,a<number/2,所以我们只需在1~number/2范围内判断即可。虽然将number换成number/2,但去系数后,时间复杂度仍为O(n)。
34. 答案:正确
- 把反复出现的代码定义成函数并调用,体现了函数代码的复用性。
35. 答案:错误
- 函数`func`中的`list_1=[5,8]`只是在函数内部重新定义了一个新的列表,不会影响外部的`list_1`,所以最终输出结果不是`(5,8)`。
三、编程题
36.参考答案:
参考程序:
def getScore(fs):
maxfs = 0
minfx = 999999
n = len(fs) - 2
for f in fs:
if f > maxfs:
maxfs = f
elif f < minfx:
minfx = f
yxf = sum(fs)-maxfs-minfx
avgfs = int(yxf / n * 100 +0.5) / 100
return avgfs
fs = [9.56,9.68,9.78,9.67,9.81,9.21,9.75]
defen = getScore(fs)
print(defen)
试题解析:
评分标准:
①len(fs) – 2或等效答案; (3分)
②maxfs = f; (3分)
③int(yxf / n * 100 +0.5) / 100 或等效答案; (4分)
④getScore(fs)。 (2分)
解析:
①n = len(fs) – 2:这里 `len(fs)` 得到评委分数列表 `fs` 的长度,也就是评委的总数。而题目要求去掉最高分和最低分后计算平均分,所以实际上参与平均计算的分数个数是评委总数减 2,即 `n = len(fs) – 2`。
②maxfs = f:在遍历评委分数列表 `fs` 的过程中,如果当前分数 `f` 大于当前记录的最大分数 `maxfs`,就更新最大分数为当前分数,即 `maxfs = f`。
③int(yxf / n * 100 +0.5) / 100:这里首先 `yxf` 是去掉最高分和最低分后的总分,`n` 是去掉最高分和最低分后参与平均计算的分数个数。`yxf / n` 得到的是平均分,但要保留两位小数。先将其乘以 100,加上 0.5 后取整(目的是进行四舍五入),再除以 100 就实现了保留两位小数的效果。
④getScore(fs):这是调用定义的函数 `getScore`,并传入评委分数列表 `fs`,从而得到选手的最终得分。
37.参考答案:
参考程序:
def prime(n):
if n < 2:
return False
else:
for i in range(2,n):
if n % i == 0:
return False
return True
n = 7
if prime(n):
print("{}是素数".format(n))
else:
print("{}不是素数".format(n))
评分标准:
①2 ; (2分)
②n % i == 0; (2分)
③True ;(2分)
④prime(n)。(2分)
试题解析:
①处填2:判断一个正整数`n`是否为素数时,从 2 开始遍历是因为素数的定义是只能被 1 和本身整除。如果从 1 开始遍历是没有意义的,因为任何数都能被 1 整除。从 2 开始可以依次检查`n`是否能被大于 1 且小于`n`的数整除。
②处填n % i == 0:在遍历过程中,如果`n`能被当前遍历的数`i`整除(即`n`除以`i`的余数为 0),那就说明`n`除了 1 和本身外还能被其他数整除,所以不是素数,此时返回`False`。
③处填True:当遍历完 2 到`n - 1`的所有数后都没有找到能整除`n`的数,那就说明`n`只能被 1 和本身整除,符合素数的定义,所以返回`True`。
④处填prime(n):这里是调用自定义的函数`prime(n)`来判断正整数`n`是否为素数。如果函数返回`True`,则打印“`n`是素数”;如果返回`False`,则打印“`n`不是素数”。
38.参考答案:
参考程序:
c = [[0 for i in range(2)] for i in range(11)] #存放奇数个5和偶数个5的二维列表
c[1][0] = 9 #一位数中包含偶数个5的个数
c[1][1] = 1 #一位数中包含奇数个5的个数
k = 9
n = 5
for i in range(2,n+1):
if i == n:
k = k - 1
c[i][0] = c[i-1][1] + k * c[i-1][0]
c[i][1] = k*c[i-1][1] + c[i-1][0]
print(c[n][1])
评分标准:
① n+1 ;(3分)
② k - 1 ; (3分)
③ k*c[i-1][1] + c[i-1][0] 。(4分)
试题解析:
1. for i in range(2, n + 1)::这里是从 2 开始循环到 `n`,因为已经初始化了一位数的情况,现在要计算 2 位数到 `n` 位数中包含奇数个 5 的个数。循环范围到 `n + 1` 是因为 `range` 函数是半开半闭区间,不包括结束值本身。
2. if i == n: k = k - 1:当循环到要计算的位数 `n` 时,调整 `k` 的值。这里的目的不太明确,可能是因为在计算特定位数 `n` 时,需要对 `k` 进行特殊处理。
3. c[i][1] = k*c[i - 1][1] + c[i - 1][0]:这是递推公式,用于计算 `i` 位数中包含奇数个 5 的个数。它由两部分组成,一部分是 `k` 乘以 `i - 1` 位数中包含奇数个 5 的个数,另一部分是 `i - 1` 位数中包含偶数个 5 的个数。这是基于一种考虑,当在 `i - 1` 位数的基础上增加一位数字时,如果要使得 `i` 位数中包含奇数个 5,可以有两种情况:一是原来 `i - 1` 位数中已经有奇数个 5,现在新增加的一位不是 5,有 `k` 种选择(因为除了 5 以外有 `k` 个数字可选);二是原来 `i - 1` 位数中是偶数个 5,现在新增加的一位是 5。这两种情况的和就是 `i` 位数中包含奇数个 5 的个数。
学科网(北京)股份有限公司
$$