当前位置:   article > 正文

中国电子学会2023年09月份青少年软件编程Python等级考试试卷四级真题(含答案)_中国电子学会2023年9月考级python真题

中国电子学会2023年9月考级python真题

2023-09 Python四级真题

分数:100

题数:38

测试时长:60min

一、单选题(共25题,共50分)

1.  用枚举算法求解“100以内既能被3整除又能被4整除的元素”时,在下列数值范围内,算法执行效率最高的是?(D )(2分)

A.1~101

B.4~100

C.12~100

D.12~96

答案解析:在选取循环控制变量时,枚举范围应尽可能小,但又不能遗漏。

2.  下列有关函数的描述中,正确的是?(C )(2分)

A.函数中必须有return语句

B.在函数内部不能使用全局变量

C.函数能提高应用的模块化程度和代码的重复利用率

D.函数内容以大括号起始,并且缩进

答案解析:函数能提高应用的模块化程度和代码的重复利用率

3.  下列哪个语句能够定义参数个数不确定的函数?(D )(2分)

A.hs(parameters)

B.hs(parameters[])

C.hs(parameters{})

D.hs(*parameters)

答案解析:当不确定需要传入的值是多少个时,在定义形参时,可以使用*parameters来表示。

4.  执行如下Python代码的结果是?(A )(2分)

  1. def area(r,pi=3.14):
  2.      return r*r*pi
  3. print(area(2,10))

A.40

B.200

C.400

D.20

答案解析:函数运行结果,2*2*10,结果是40。

5.  执行如下Python代码,输出结果是?(A )(2分)

  1. def hs(num):
  2.     num += 1
  3.     return num
  4. n=10
  5. s=hs(n)
  6. print(s)

A.11

B.10

C.1

D.运行错误

答案解析:函数的返回值,赋值给变量s,输出11。

6.  有如下Python程序,输出的结果是?(B )(2分)

  1. def whao(year = '2023'):
  2.     print('你好' + year)
  3. whao()

A.你好

B.你好2023

C.你好year

D.没有输出

7.  编写计算正方体体积的匿名函数,下列哪一个语句是正确的?(C )(2分)

A.rst = lambda a : a * 3

B.lambda a : a * 3

C.rst = lambda a : a ** 3

D.lambda a : a ** 3

答案解析:关键字lambda表示匿名函数,冒号之前表示的是这个函数的参数,冒号之后表示的是返回值,在定义匿名函数时,需要将它赋值给一个变量。

8.  执行如下Python程序,运行的结果是?(A)(2分)

  1. def zfzh(s):
  2.     c = ''
  3.     for ch in s:
  4.         if "9">=ch>= "0":
  5.             c+=str(int(ch)+1)
  6.         elif "z">=ch>= "a":
  7.             c+= chr(ord(ch)- ord("a")+ord("A"))
  8.     return c
  9. s = 'hzag-21-8'
  10. print(zfzh(s))

A.HZAG329

B.923HZAG

C.GAZH329

D.923GAZH

9.  在Python中,以下哪个代码是安装numpy模块的方法?(A )(2分)

A.pip install numpy

B.pip uninstall numpy

C.install numpy

D.setup numpy

10. 在Python中导入第三方库的主要关键字是?( B) (2分)

A.from

B.import

C.pip

D.install

11. 《阅微草堂笔记》里描述了槐树果实“响豆”,在夜里爆响,这种豆一棵树只有一粒,难以辨认出。所以古人就等槐树开花结果后,用许多布囊分别贮存豆荚,用来当枕头。夜里如果没有听到声音,便扔掉。如果有爆响声。然后把这一囊的豆荚又分成几个小囊装好,夜里再枕着听……如此这么分下去直到找到响豆。以上故事体现的算法是?(D )(2分)

A.顺序查找

B.枚举算法

C.解析算法

D.分治算法

12. 下列哪项不是分治算法所具有的特征?(B )(2分)

A.求解问题的规模缩小到一定的程度就能够容易地解决

B.求解题可以分解为若干个规模较小的不同问题

C.利用求解问题分解出的子问题的解可以合并为该问题的解

D.求解问题所分解出的各个子问题是相互独立的

答案解析:求解问题可以分解为若干个规模较小的相同问题。

13. 两位同学玩猜数字游戏,规则如下:一方在心里默想一个范围在1-100之间的数,如果另一方猜的数字比对方想的要大,就说大了;如果猜的数字比想的要小,就说小了,直到猜中数字。那么使用二分查找法最多需要猜测的次数是?(C )(2分)

A.10

B.8

C.7

D.6

14. 用递推算法求解n个自然数的乘积,请问代码中横线上需要填入的正确代码是?( A)(2分)

  1. def fact(n):
  2.     s=1
  3.     for i in range(1,n+1):
  4.         s=s*i
  5.     return ________
  6. a=fact(5)
  7. print(a)

A.s

B.i

C.fact(n-1)

D.fact(n)

答案解析:def fact(n):

    s=1

    for i in range(1,n+1):

        s=s*i

    return s

a=fact(5)

print(a)

15. 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

可以用下列代码解决这个问题,请问这段代码是基于(C )算法编写的?(2分)

  1. high=100
  2. s=0
  3. sum=0
  4. for i in range(10):
  5.     s,high=high+high/2,high/2
  6.     sum=sum+s
  7. sum=sum-high
  8. print(sum)
  9. print(high)

A.递归

B.枚举

C.递推

D.二分

答案解析:递推按照一定的规律来计算序列中的第一项,而问题显然是一个等比数列,可以用递推来解决。代码中没有调用自身的情况,所以不是递归。

16. 用递归算法求1~n个连续自然数的乘积的代码如下,请选择合适的代码补全程序?(B)(2分)

  1. def Chengji(n):
  2.     if n <=1:
  3.         return 1
  4.     else:
  5.         return _____?______
  6. print(Chengji(3))

A.n*Chengji(n)

B.n*Chengji(n-1)

C.n*Chengji(n+1)

D.n×Chengji(n-1)

答案解析:def Chengji(n):

    if n <=1:

        return 1

    else:

        return n*Chengji(n-1)

print(Chengji(3))

17. 有一根绳子,第一次剪去一半多2米,第二次剪去剩下的一半多2米,第三次剪去剩下的一半多2米,第四次剪去剩下的一半多2米,第五次剪去剩下的一半多2米,此时绳子还剩2米。这根绳子长几米?想解决这个问题的话,可以采用以下哪种算法?(B )(2分)

A.排序

B.递推

C.解析

D.枚举

答案解析:题目中的绳子长度是按相同的规律剪掉的,所以从后向前,可以按照这个规律来递推计算绳子的长度。

18. 小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个。第二天早上又将剩下的桃子吃一半,又多吃一个。以后每天早上吃前一天剩下的一半另加一个。到第5天早上猴子想再吃时,发现只剩下一个桃子了。问第一天猴子共摘多少个桃子?

这个问题可以用递归来解决,代码如下:

  1. def peach(day):
  2.     if day==1:
  3.         return 1
  4.     return (peach(day-1) + 1)*2
  5. s=peach(5)
  6. print('一共有%d只桃子'%(s))

请问第2行的“if day == 1”代码起到的作用是?(A)(2分)

A.结束递归的边界条件

B.开始递归的边界条件

C.调用自身

D.递归过程中的变化

答案解析:递归算法有明确的结束递归的边界条件(又称终止条件)以及结束时的边界值,可以通过条件语句(if语句)实现。

19. 下列代码可以求两个数的最小公倍数。请认真阅读下列代码运用了什么算法?(C )(2分)

  1. def lcm(s,m,n):
  2.     if s%n==0:
  3.         return s
  4.     else:
  5.         return lcm(s+m,m,n)
  6. a=int(input('请输入第1个数:'))
  7. b=int(input('请输入第2个数:'))
  8. c=lcm(a,a,b)
  9. print('{}和{}的最小公倍数是{}'.format(a,b,c))

A.枚举

B.解析

C.递归

D.二分

答案解析:在定义一个函数或过程时,如果出现调用自身的成分,则称为递归。

20. 关于函数,正确的描述是?( C)(2分)

A.规范的函数设计都应该带有返回值

B.函数体中,只要遇到break关键字,函数就结束

C.函数体中,只要遇到return关键字,函数就结束

D.函数的返回值只能是整型、浮点型、布尔型和字符串

答案解析:Python函数中,一旦遇到return关键字,函数就结束运行。

21. 关于全局变量和局部变量,正确的描述是?(A )(2分)

A.通俗来说,无缩进的变量都是全局变量

B.函数体中,只能使用局部变量

C.Python程序中,全局变量与局部变量不允许重名

D.函数体中,只能通过实参传递的方式实现对全局变量数值的使用

答案解析:无缩进的变量都在最上层,是全局变量。

22. 定义以下函数:

  1. def func(x,y,z=2):
  2.     print(x+y+z)

分别以func(1,2,3)和func(1,2)语句调用该函数,运行后的结果分别是?(D)(2分)

A.6;出错

B.5;出错

C.5;5

D.6;5

答案解析:Python中,形参设定了默认值后,在调用函数时还可以为该形参再传入新值。func(1,2,3)的值是6,func(1,2)的值是5。

23. 在嵌套函数中,也就是一个函数里面还有一个函数,如果内部函数需要修改外部变量的值,处理的方法是?(D )(2分)

A.只能通过不定长参数传递来实现

B.使用local关键字

C.使用nonlocal关键字

D.使用global关键字

答案解析:Python嵌套函数中,如果内部函数需要修改外部变量的值,要使用global关键字。

24. 在自定义函数中,如果发现局部变量与全局变量同名,则?(C )(2分)

A.程序会出现语法错,不能运行

B.程序可以运行,局部变量与全局变量互不干扰

C.可能会出现局部变量修改全局变量的值的情况,需要检查程序设计是否合理

D.不允许出现这种情况,应该采用参数传递的方法去解决问题

答案解析:在Python函数中,如果局部变量与全局变量同名,则局部变量屏蔽全局变量。

25. 考察以下函数定义代码:

  1. def func(x:int,y:str)->str:
  2.     z=x*y
  3.     return z

以下陈述正确的是?(B )(2分)

A.Python是一种动态类型语言,不强制要求指定参数类型,上述代码行是不符合Python语法的

B.为提高程序的可靠性,Python函数定义时允许为形参指定数据类型,也允许为返回值指定类型

C.由于为函数指定了返回值类型,变量z一定要做类型转换后,才能用于上述return语句中

D.由于为形参指定了不同的数据类型,变量x和y也需要先做类型转换后才能进行上述运算

答案解析:Python不强制要求指定参数类型,但是为提高程序的可靠性,Python函数定义时允许为形参指定数据类型,也允许为返回值指定类型。

二、判断题(共10题,共20分)

26. 函数是将实现相同功能的代码封装在一起,实现代码复用。( 对)

答案解析:函数是将实现相同功能的代码封装在一起,实现代码复用。

27. 关键字实参通过“关键字=值”的方式传值,函数参数全部采用此方式传值时,不需要考虑函数调用过程中形参的顺序。( 对)

28. 函数的定义代码不需要在主程序调用函数之前。( 错)

29. 命令pip download <第三方库>表示下载并安装指定的第三方库。( 错)

答案解析:该命令为下载但不安装。

30. 二分查找又称对折半查找,例如:在数列34、17、25、9、10、3中查找3,适合采用二分查找法。(错 )

答案解析:二分查找是一种应用于有序数列的高效查找算法。

31. 递归算法不涉及高深的数学知识,使得很多比较复杂的问题,也可以用简洁的代码解决,代码的执行效率比较高,所以即使有其他算法可行,也应该首选递归算法解决问题。( 错)

答案解析:递归算法代码运行时会引起一系列函数调用,有不少重复计算,其执效率比较低。

32. 递归算法中,必然存在函数体内调用自身的情况,可以在最后调用,也可以在中间调用。(对 )

答案解析:在定义一个函数或过程时,如果出现调用自身的成分,则称为递归。调用自身的位置根据具体情况而定,不强制要求在最后才能调用自身。

33. Python程序中,自定义函数可以放在整个程序的开头,也可以放在主程序之后,比较自由。( 错)

答案解析:Python程序中,自定义函数要放在主程序之前。

34. 通过把某些特定功能语句设计成自定义函数,可以简化主程序的编写。( 对)

35. 下面代码的时间复杂度为O(n*n)。(对)

  1. arr = [ 2, 3, 4, 10, 40 ]
  2. n = len(arr)
  3. for i in range(n):
  4.     for j in range(0, n-i-1):
  5.         if arr[j] > arr[j+1] :
  6.             arr[j], arr[j+1] = arr[j+1], arr[j]

答案解析:双重循环,时间复杂度为O(n*n)。

三、编程题(共3题,共30分)

36. 从键盘上分别输入要查找和替换的字符串,对文本文件进行查找与替换,替换后保存到新的文本文件中。

思路:输入待查找字符串s,需查找子字符串key和替换字符串new,通过调用自定义函数replace实现替换。完善划线处代码。

  1. s = input("请输入待查找的字符串:")
  2. key = input("请输入需查找的子字符串:")
  3. new = input("请输入要替换的字符串:")
  4. def findstr(key, s, begin):
  5. for i in range(begin,len(s) - len(key) + 1):
  6. if s[i: ① ]== key:
  7. return i
  8. return -1
  9. def replace(key, new, s):
  10. begin = 0
  11. while begin < ② :
  12. pos = findstr(key,s, begin)
  13. if pos ==-1:
  14. break
  15. else:
  16. s = s[0:pos]+ new + s[pos + len(key): ③ ]
  17. begin = pos + len(key)
  18. return s
  19. rst = ④ #调用函数替换字符
  20. print(rst)

参考程序:

  1. s = input("请输入待查找的字符串:")
  2. key = input("请输入需查找的子字符串:")
  3. new = input("请输入要替换的字符串:")
  4. def findstr(key, s, begin):
  5.       for i in range(begin,len(s) - len(key) + 1):
  6.             if s[i:i+len(key)]== key:
  7.               return
  8.       return -1
  9. def replace(key, new, s):
  10.       begin = 0
  11.       while begin < len(s)-len(key)+ 1:
  12.             pos = findstr(key,s, begin)
  13.             if pos ==-1:
  14.                       break
  15.             else:
  16.                   s = s[0:pos]+ new + s[pos + len(key):len(s)]
  17.                   begin = pos + len(key)
  18.        return s
  19. rst = replace(key,new,s)       #调用函数替换字符
  20. print(rst)

评分标准:

(1)i+len(key) 或等价答案;(3分)

(2)len(s)-len(key)+ 1 或等价答案;(3分)

(3)len(s) 或等价答案;(3分)

(4)replace(key,new,s) 或等价答案。(3分)

37. 一个列表中存在n个数据,可以用分治算法来找到其中的最小值。具体过程如下:如果列表元素的个数小于等于2的时候,经过一个判断就找到其中的最小值,所以可以先把数据从中间划分为左右两部分,然后通过递归把每一部分再划分为左右两部分,直到数据规模小于等于2的时候,返回结果,然后通过递归到最后为两个数据对比,我们就可以找到最小值。

请根据以上算法过程,补全代码。

  1. # 求列表中小于两个元素的最小值
  2. def get_min(number):
  3.     if len(number) == 1:
  4.         return _____①_____       
  5.     else:
  6.         if number[1] > number[0]:
  7.             return number[0]
  8.         else:
  9.             return number[1]
  10. def solve(number):
  11.     n = len(number)
  12.     if n <= 2:
  13.         return get_min(number)
  14.     else:
  15.         # 将整个列表分为左右两部分
  16.         left_list, right_list =_____②_____, number[n//2:]
  17.         # 递归(树),分治
  18.         left_min, right_min = solve(left_list), _____③_____       
  19.         return get_min([left_min, right_min])
  20. test_list = [5, 11, 3, 2, 7, 9]
  21. print(solve(test_list))

参考程序:

  1. # 求列表中小于两个元素的最小值
  2. def get_min(number):
  3.     if len(number) == 1:
  4.         return number[0]
  5.     else:
  6.         if number[1] > number[0]:
  7.             return number[0]
  8.         else:
  9.             return number[1]
  10. def solve(number):
  11.     n = len(number)
  12.     if n <= 2:
  13.         return get_min(number)
  14.     else:
  15.         # 将整个列表分为左右两部分
  16.         left_list, right_list = number[:n//2], number[n//2:]
  17.         # 递归(树),分治
  18.         left_min, right_min = solve(left_list), solve(right_list)
  19.         return get_min([left_min, right_min])
  20. test_list = [5, 11, 3, 2, 7, 9]
  21. print(solve(test_list))

评分标准:

(1)number[0];(2分)

(2)number[:n//2];(3分)

(3)solve(right_list)。(3分)

38. 未来居民社区设计有一个机器人服务中心,假如某社区有若干栋住宅楼,每栋楼的位置可以由坐标(x,y)表示,其中x坐标表示居民楼的东西向位置,y坐标表示居民楼的南北向位置。这里约定,社区中任意2点(x1,y1)和(x2,y2)的之间的距离使用数值|x1-x2|+|y1-y2|来度量。要求为社区选择建立机器人服务中心的最佳位置,使各个居民点到机器人服务中心的距离总和最小。以下是机器人服务中心的选址程序,采用取各坐标中位数的方法来确定中心位置,请补充完成该程序。

注:中位数的含义:一组按大小顺序排列起来的数据中处于中间位置的数。当有奇数个数据时,中位数就是中间那个数;当有偶数个数据时,中位数就是中间那两个数的平均数。

  1. n=int(input("请输入居民楼总数:"))
  2. hx=[]
  3. hy=[]
  4. for i in range(n):
  5.     x,y = map(int,input("请输入居民楼的x和y坐标:").split(","))
  6.     hx. append(x)
  7.     hy. append(y)
  8. hx = sorted(_____①____)
  9. hy = sorted(______② ____)
  10. if n%2 == 0#偶数情况,求中位数
  11.     sn = int(n/2)
  12.     x0 = int((hx[sn]+hx[sn-1])/2)
  13.     y0 = int((hy[sn]+hy[sn-1])/2)
  14. else:         #奇数情况,求中位数
  15.     sn = int((n-1)/2)
  16.     x0 =_______③_______       
  17.     y0 =_______④_______       
  18. sumx=0
  19. sumy=0
  20. for j in hx:
  21.     dx =abs(x0-j)
  22.     sumx += dx
  23. for k in hy:
  24.     dy = abs(y0-k)
  25.     sumy += dy
  26. print("选址点的坐标是:(%d,%d)"%(x0,y0))
  27. print("选址到各楼的累计距离是:",sumx+sumy)

参考程序:

  1. n=int(input("请输入居民楼总数:"))
  2. hx=[]
  3. hy=[]
  4. #x,y = input("请输入居民楼的x和y坐标:").split(",")
  5. for i in range(n):
  6.     x,y = map(int,input("请输入居民楼的x和y坐标:").split(","))
  7.     hx.append(x)
  8.     hy.append(y)
  9. hx=sorted(hx)      #对输入坐标进行排序
  10. hy=sorted(hy)
  11. if n%2 == 0:        #偶数情况,求中位数
  12.     sn = int(n/2)
  13.     x0 = int((hx[sn]+hx[sn-1])/2)
  14.     y0 = int((hy[sn]+hy[sn-1])/2)
  15. else:                  #奇数情况,求中位数
  16.     sn = int((n-1)/2)
  17.     x0 = hx[sn]
  18.     y0 = hy[sn]
  19. sumx=0
  20. sumy=0
  21. for j in hx:
  22.     dx =abs(x0-j)
  23.     sumx += dx
  24. for k in hy:
  25.     dy = abs(y0-k)
  26.     sumy += dy
  27. print("选址点的坐标是:(%d,%d)"%(x0,y0))
  28. print("选址到各楼的累计距离是:",sumx+sumy)

评分标准:

(1)hx;(2分) 

(2)hy;(2分) 

(3)hx[sn];(3分)

(4)hy[sn]。(3分)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/789130
推荐阅读
相关标签
  

闽ICP备14008679号