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


一、单选题(共25题,共50分)
1.  运行下列程序,输出的结果是?( B)(2分)

 

def wenhao(name = 'zhejiang'):
    print('hello' + name)
wenhao() 

A. hello
B. hellozhejiang
C. helloname
D. 程序将提示运行错误
试题解析:定义函数时,可以指定形参的默认值。如果在调用函数时给函数提供了实参,Python将使用指定的实参,否则将自动调用形参的默认值。本题中,调用wenhao函数时没有传值,故使用函数的默认值作为函数的调用。因此选B

2.  运行下列程序,输出的结果是?(C)(2分)

rst = lambda a,b=5:a*b 
print(rst(5))

A. 5
B. 15
C. 25
D. 35
答案解析:rst(5)传入一个实参,a被赋值为5,b使用默认值5,因此结果是5*5=25,选C。

3.  运行下列程序,输出的结果是?( C)(2分)

def jsarea(r, PI = 3.14):
    area = PI * r * r
print(jsarea(1))

A. 3.14
B. 因缺失参数,不能计算
C. None
D. 程序代码有错误
答案解析:函数jsarea中,没有return语句,函数中计算的结果area不能传递给函数调用处,因此调用函数的结果是None。

4.  运行下列程序,输出的结果是?(D)(2分)

def js(n):
    s = 0
    while n:
        s = s * 10+n % 10
        n //= 10
    return s
print(js(20230110))

 
A. 20230110
B. 01103202
C. 2301102
D. 1103202
答案解析:函数js的功能是计算n的逆序数,因此选D

5.  在传递信息的过程中, 通常会将一些敏感信息进行加密,以下是对数据进行加密的Python程序段,若输入数据为“cie0108”,则输出的结果是?(C)(2分)

def jm(t):
    s = ""
    for ch in t:
        if "0" <= ch <= "9":
            x = int(ch) + 3
            if x >= 10:
                x = x % 10
            ch = str(x)
        s = s + ch
    return s
print(jm('cie0108'))

A. 1343eic
B. 0108cie
C. cie3431
D. 3431cie
答案解析:函数jm中对原文进行处理,若是字母,不变,累加;若是数字, 转为整型加3然后求其个位上的数,因此答案是cie3431,选C。

6.  运行下列程序,输出的结果是?(B)(2分)

s = 0
def f(n):
    global s
    for i in range(n):
        s = s + i
    return s
print(f(f(3)))

A. 3
B. 6
C. 9
D. 0

答案解析:在函数f中,变量s定义为global全局变量,第一次调用f(3)后返回的结果是3,此时变量s的值变成3,再次调用函数f(3)时,因s的初值已经是3了,因此结果是6。

7.  运行下列程序后,输出的结果是?(D)(2分)

def jsh(n):
    if n == 1:
        return 1
    else:
        return n + jsh(n-1)
print(jsh(10))

 
A. 1
B. 35
C. 45
D. 55
答案解析:递归思想求解1到n之间和,因此答案选D。

8.  运行下列程序后,输出的结果是?(A)(2分)

def fun(s):
    if len(s) == 1:
        return s
    else:
        return fun(s[1:]) + s[0]
print(fun('CIE2023'))

 
A. 3202EIC
B. EIC3202
C. 3220EIC
D. EIC2023
答案解析:函数fun递归实现字符串s逆序,因此选A。

9.  下列有关递归的描述中,正确的是?(C)(2分)
A. 递归函数中肯定有循环结构;
B. 递归没有体现“大事化小”的思想;
C. 递归有明确的结束递归的边界条件;
D. 递归执行效率较高。
答案解析:递归有明确的结束递归的边界条件以及结束时的边界值,递归体现了“大事化小”的思想。

10. 运行下列程序,运行的结果是?( C)(2分)

def leijia(x):
    x += 1
    return x
x=10
y=leijia(x)
print(y)

A. 1
B. 10
C. 11
D. None
答案解析:将实参10传递给函数leijia中的形参x,x加1后得到11,并通过return返回给y,因此选C。

11. 关于分治算法特征的描述中,错误的是?(C )(2分)
A. 当问题的规模缩小到一定的程度就可以容易地解决;
B. 问题可以分解为若干个规模较小的相同问题;
C. 该问题所分解出的各个子问题是可以相互独立,也可以相互交叉;
D. 该问题分解出的子问题的解可以合并为该问题的解。
答案解析:该问题所分解出的各个子问题是相互独立,即该问题具有最优子结构性质。

12. 张老师有n(范围在1到15之间)个礼物分给同学们,他请同学们猜礼物的数量,请问同学们猜几次后肯定知道礼物的数量(不算运气成分第1次或第2次就猜到)?(C )(2分)
A. 15
B. 7
C. 4
D. 3
答案解析:二分查找特征,15个礼物,每次对半猜,4次后肯定知道结果。

13. 下列排序算法中,时间复杂度最小的是?(C )
A. 插入排序
B. 冒泡排序
C. 快速排序
D. 选择排序
答案解析:快速排序时间复杂度是O(nlogn),其他都是O(n*n)。

14. 小方要在程序中生成[10,99]之间的随机整数,下列程序不能实现的是?(D )
 
A. 
import random
a = random.randint(10,99)

B. 
import random as t
a = t.randint(10,99)

C. 
from random import randint
a = randint(10,99)

D. 
from random import randint as t
a = t.randint(10,99)

15. 下列哪个关键字可用来创建自定义函数?(B )
A. function;
B. def;
C. class;
D. procedure。
答案解析:def 关键字可用来创建自定义函数

16. 在 Python 语言中,求列表长度用下列哪个函数?(B )(2分)
A. size
B. len
C. length
D. str
答案解析:在 Python 语言中,求列表长度用len 函数

17. 下列关于函数返回值的描述中,正确的是?( A)(2分)
A. Python函数的返回值使用很灵活,可以没有返回值,可以有一个或多个返回值。
B. 函数定义中最多含有一个return语句。
C. 在函数定义中使用return语句时,至少给一个返回值
D. 函数只能通过print语句和return语句给出运行结果
答案解析:Python函数的返回值使用很灵活,可以没有返回值,可以有一个或多个返回值,是正确的。

18. 下列有关自定义函数的描述,正确的是?(C )(2分)
A. 函数的定义必须在程序的开头;
B. 函数定义后,其中的程序可以自动执行;
C. 函数定义后需要调用才会执行;
D. 函数体与关键字必须左对齐。

19. 运行下列程序,输出的结果是?(C)(2分)

Sum=1
for i in range (1,5):
    Sum=Sum*i
print(Sum,i)


A. 24;5
B. 120;5
C. 24;4
D. 120;4


20. 关于下列代码的描述,错误的是?(D)(2分)

def fact(n):
    s=1
    for i in range(1,n+1):
        s*=i
    return s


 
A. s不能在函数外使用
B. range()函数是Python内置函数
C. 如果n=4,返回的值为24
D. 代码中n是可选参数
答案解析:代码中n是可选参数是错误的。

21. 某人将自己密码旅行箱的密码遗忘了。当事人记起密码是一个三位自然数,并且密码个位数是8,其它位含1但不能确定是哪一位。请将所有可能的密码遍历出来。

 请完成程序并运行?(D)

 for x in range(100,__ ①__): #三位密码的范围
         if ____ ②___ and "1" in str(x): #符合条件的密码
                 print(x)


 
A. 999;x%10=8
B. 999:x%10==8
C. 1000;x%10=8
D. 1000;x%10==8

22. 甲同学第一天跳绳100下,第二天开始每天增加5下;乙同学第一天跳绳100下,每隔一天增加10下。计算30天两人的跳绳总数。
甲的跳绳数:100、105、110、115、120……
乙的跳绳数:100、100、110、110、120……

请补全程序代码?(A)

a=100    #甲同学第一天跳绳次数
b=100    #乙同学第一天跳绳次数
x=a      #甲同学累计跳绳次数,初始值是第一天的次数
y=b      #乙同学累计跳绳次数,初始值是第一天的次数
#从第二天开始迭代计算
for i in range(2,31):
    a=     ①            #甲同学每天增加5次
    if i%2==1:    #当天数为奇数时
        b=     ②        #乙同学增加10次
    x=x+a
    y=y+b
print("甲同学30天跳绳",x,"下")
print("乙同学30天跳绳",y,"下")

 
A. a+5;b+10
B. +5;+10
C. a+10;b+5
D. +10;+5

23. 用递归算法计算10的阶乘10!的值#自定义阶乘函数。自定义函数fact(n)是求n的阶乘。
10!=1×2×3×…×10
请补全程序代码?(A)(2分)

#自定义函数

def fact(n):      #求阶乘
    if(n==1):     #终止条件
        return 1  #结束递归
    else:         #递归条件
        p=__①____  #调用递归(自身)
        return p  #返回乘积

#主程序
print("10!=",fact(10))  #调用递归

A. n*fact(n-1)
B. n*fact(n)
C. n*fact(n+1)
D. n**fact(n)

24. 用分治法查找列表中是否存在指定的数字。给定的列表已升序排序。请补全程序代码?(B)(2分)

#在列表cards中查找数字x,返回下标值,若未找到,返回-1
def serch(cards=list,x=int):
    a=0             #定义左端点下标
    b=len(cards)-1  #定义右端点下标
    #逐级分割查找范围,缩小查找规模
    while a<=b:
        m=(a+b)//2       #定义中点下标
        if x==cards[m]:  #x刚好等于中点值
            return m
        elif      ①     : #x<中点值,说明x位于左段位置
            b=m-1        #重新定义右端点
        else:
            a=m+1        #重新定义左端点
    return -1            #未找到,返回-1

#主程序
#在列表d中查找用户输入的数字r
d=[1,6,16,24,44,46,79,80,81,82,87,102,134,151,156,188,196,202,212,226,228,248,272,274,286,306,321,351,363]
print(d)    #显示一下列表d
r=int(input("请输入要查找的数字:"))
y=serch(d,r)  #调用子函数,d,r是实参
if y>=0:
    print("已找到",r,",它是列表中第",y+1,"个数字")
else:
    print("未找到",r)


A. x<cards[m-1] 
B. x<cards[m]
C. x>cards[m-1] 
D. x>cards[m]
答案解析:x<cards[m],每次从中间分隔,这个实际上是二分法。分治法查找可以大规模减少比对次数,但是,原数据必须排序。

25. 下列不属于Python数据分析与可视化第三方库的是?( C)(2分)
A. pandas
B. matplotlib
C. opencv
D. numpy
答案解析:opencv不属于python数据分析与可视化第三方库


二、判断题(共10题,共20分)
26. 关键字实参通过“关键字=值”的方式传值,不需要考虑函数调用过程中形参的顺序。(对 )
答案解析:关键字实参通过“关键字=值”的方式传值,不需要考虑函数调用过程中形参的顺序。

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

28. 创建自定义函数时,不需要声明函数形参的类型,形参的类型由调用自定义函数时传递的实参类型确定。( 对)
答案解析:创建自定义函数时,不需要声明函数形参的类型,形参的类型由调用自定义函数时传递的实参类型确定。

29. 递推是按照一定的规律计算序列中的每一项,通常是通过计算前面的一些项来计算后一项的值。( 对)
答案解析:递推是按照一定的规律计算序列中的每一项,通常是通过计算前面的一些项来计算后一项的值。

30. 某同学用天平称量的过程如下:先放置100克砝码,砝码偏重;再将砝码改为50克,砝码偏轻;又将砝码改为75克……通过这种策略,该同学很快完成物品称重工作,这体现了分治思想。( 对)
 
31. 使用"pip install-upgrade pandas"命令能够升级pandas库。(对 )
答案解析:使用"pip install-upgrade 包名" 命令能够更新已经安装的第三方库。

32. Python中调用close()函数可实现对文件内容的读取。( 错)
答案解析:Python中调用read()函数可实现对文件内容的读取。

33. 下面的程序会输出两个值。(错 )

def r(a,b):
   s=a+b
   b+=1
   return s
print(r(3,8))
 


34. 一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?经分析,从第三个月起,每个月的兔子数是上个月与上上个月兔子之和。请判读以下程序是否正确。(对)

#自定义函数
def fib(n):      #斐波那契数列
    if n<=2:
        return 1
    else:
        return  fib(n-1)+fib(n-2)  #前两个数字之和
#主程序,显示每个月兔子数(斐波那契数列)
for i in range(1,13):
    print("第",i,"个月兔子对数为:",fib(i))

35. 下列两个代码块的功能一样。(对)

A.

if(year%4)==0:                  
       if(year%100)==0:
            print(year)

B.

if(year%4)==0 and (year%100)==0:                  
     print(year)

三、编程题(共3题,共30分)
36. 换位密码法是将明文中的字符位置通过一定的规则重新排列从而得到密文的一种加密方法。某换位密码法加密方法如下:先把明文按照固定长度(4位一组)进行分组,然后对每一组的字符进行换位操作,从而得到密文。例如, 字符串"ceit",使用密钥1432进行加密时,首先将字符串以 4 个字符为一组进行分组,然后对每组的字符进行换位,第1个和第3个字符位置不变,把第2个字符和第4个字符交换位置,从而得到密文"ctie"。小张编写的程序如下,请完善划线处的代码:

def jiami(yw,key):
    result = ''          
    for i in range(0,         ①       ,len(key)):
        s1=yw[i:i+ len(key) ]
        for j in range(        ②       ):
            result = result +        ③       
    return result
yw= input('请输入待加密的明文:')
key= input('请输入密钥:')
mw=        ④       
print(mw)

运行结果如下图所示:

参考程序:

def jiami(yw,key):
    result = ''          
    for i in range(0,len(yw),len(key)):
        s1=yw[i:i+len(key)]
        for j in range(len(key)):
            result = result + s1[int(key[j])-1]
    return result
yw= input('请输入待加密的明文:')
key= input('请输入密钥:')
mw= jiami(yw,key)         
print(mw)

评分标准:
(1)len(yw);(2分)
(2)len(key);(3分)
(3)s1[int(key[j])-1];(4分)
(4)jiami(yw,key)。(3分)

37. 一张长方形的纸,长m米,宽n米(长宽均为整数),现在要把它刚好裁成一些正方形(边长是整数),有几种裁法,如果要使裁得的正方形面积最大,可以裁多少块。小明学习了递归后,编写程序如下,首先输入长方形的长和宽,计算出结果。请完善划线处的代码:

def tj(a,b):
    c = 0
    minn =        ①        
    if a > b:
        minn = b
    for i in range(1,minn+1):
        if a % i == 0 and b % i == 0:
            c =        ②        
    return c
def gcd(a,b):
    if b == 0:
        return a 
    return        ③        
chang = int(input('输入长方形的长 (单位cm)'))
kuan = int(input('输入长方形的宽 (单位cm)'))
bianchang = gcd(chang,kuan)
total =        ④        
num = tj(chang,kuan)
print('------------结果如下-------------')
print('有{}种裁法'.format(num))
print('裁得的正方形面积最大边长是{}cm,可以裁{}块'.format(bianchang,total))

运行后的结果如下图所示:


评分标准:
(1)a;(2分)
(2)c + 1;(2分)
(3)gcd(b,a%b);(3分)
(4)(chang // bianchang) * (kuan // bianchang)或等价答案。(3分)

38. 商超采用会员制,客户的消费信息如会员号、姓名和积分如下表所示,小方的爸爸想编写一个客户信息管理系统,其中有一个功能是:输入会员号,查询该会员的积分。小方知道后,就跃跃欲试,他首先从数据库读取客户信息到列表data中,其中data[i][0]存储第i条记录的会员号,data[i][1]存储第i条记录的姓名,data[i][2]存储第i条记录的积分;他首先将数组data中数据按会员号升序排序,然后用二分查找算法查找会员号对应的积分信息。代码如下,完善划线处的代码:

def bubble_sort(d):
    for i in range(len(d)-2):
        for j in range(len(d)-1,        ①        ,-1):
            if d[j][0] < d[j-1][0]:
                d[j],d[j-1] = d[j-1],d[j]
def bin_ search(d, key):
    i,j = 0, len(d)-1
    while i <= j:
        m=(i +j)//2
        if        ②        :
            return m
        if key > d[m][0]:
            i = m+1
        else:
            j = m-1
    return -1

#从数据库读取会员信息存列表data中,代码略

data=[[8011,'张飞',12345],[8012,'李强',34512],[7812,'李好',45321]]
bubble_sort(data)
key = int(input('输入会员号:'))
m =         ③        
if m!=-1:
    print (data[m][1],'先生/女士:您的积分是:',data[m][2])
else:
    print('该会员号不正确')


参考程序:

def bubble_sort(d):
    for i in range(len(d)-2):
        for j in range(len(d)-1, i,-1):
            if d[j][0] < d[j-1][0]:
                d[j],d[j-1] = d[j-1],d[j]
def bin_search(d, key):
    i,j = 0, len(d)-1
    while i <= j:
        m=(i +j)//2
        if d[m][0] == key:
            return m
        if key > d[m][0]:
            i = m+1
        else:
            j = m-1
    return -1
#从数据库读取会员信息存列表data中,代码略
data=[[8011,'张飞',12345],[8012,'李强',34512],[7812,'李好',45321]]
bubble_sort(data)
key = int(input('输入会员号:'))
m = bin_search(data,key)
if m!=-1:
    print (data[m][1],'先生/女士:您的积分是:',data[m][2])
else:
    print('该会员号不正确')


评分标准:
(1)i;(2分)
(2)d[m][0] == key;(3分)
(3)bin_search(data,key)。(3分)
 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值