2021年03月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里

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

第1题

不超过100个元素的有序数列,使用二分查找能找到指定的元素,可能的查找次数不包括?

A:1次

B:6次

C:7次

D:8次

答案:D

按照二分查找法的规律,100个元素的有序列表,不管是否找到,至多查找7次。

第2题

运行以下代码,正确的打印结果是?( )

python 复制代码
def f():

    c=0

    for i in range(4,51,4):

        if i%6==0:

            c=c+1

    return c

print(f())

A:1

B:2

C:4

D:8

答案:C

函数f()的作用是求4-50间4和6的公倍数个数,即12的倍数个数。

第3题

10个人站一列,分苹果,问第10个人分到多少个苹果,他说比前面一个人多分到2个,依次往前,都说比前面一个人多分到2个,最后问第一个人,他说分到10个苹果。用以下函数求第10个人分到的苹果数,则应补充选项为?( )

python 复制代码
def  apple(n):

     if n == 1:

         return 10

     else:

         return                   

print(apple(10))

A:apple(n)+2

B:n+2

C:apple(n-1)+2

D:apple(n+1)-2

答案:C

第4题

观察程序段,以下说法错误的是?( )

python 复制代码
def fib(n):

    if n==1 or n==2:

        s=1

    else:

        s=fib(n-1)+fib(n-2)

    return s

m=int(input("请输入m的值(m>2):"))

print(fib(m))

A:如果输入m的值为8,打印的结果为20

B:该程序段用了递归来实现

C:如果缺少语句"return s",程序会报错

D:语句"def fib(n):"中的n为形参

答案:A

定义函数时的语法如下:

def 函数名(参数集合):

<函数体>

[return 函数值]

本题中的自定义函数fib(m)需要返回值,所以"return 函数值"语句不能少,定义时"函数名<参数集合>"中的参数为形参,调用时"函数名<参数集合>" 中的参数为实参。如果输入m的值为8,打印的结果为21。

第5题

关于python函数参数的说法正确的是?

A:函数一定要有参数和返回值

B:在调用一个函数时,若函数中修改了形参变量的值,则对应的实参变量的值也被修改

C:参数的值是否会改变,与函数中对变量的操作有关,与参数类型无关

D:函数的形参在函数被调用时获得初始值

答案:D

函数的形参作用域为本函数,在函数被调用时获得初始值。

第6题

关于递归与递推方法的比较,错误的观点是?

A:递归是将复杂问题降解成若干个子问题,依次降解,求出低阶规模的解,代入高阶问题中,直至求出原问题的解;

B:递推是构造低阶的问题,并求出解,依次推导出高阶的问题以及解,直至求出问题的解;

C:数学上的递推关系可以通过递归的方法来实现;

D:递归算法代码简洁,运行速度比递推快,因此应该尽量采用递归的方法;

答案:D

D.递归的运行开销大。

第7题

运行以下代码,输出结果正确的是?( )

python 复制代码
a=1

b=c=[]

def fun(a,c):

    a=2

    c.append(a)

fun(a,c)

print(a,b,c)

A:2 [2] [2]

B:1 [] [2]

C:1 [2] [2]

D:2 [] [2]

答案:C

函数体内变量a的值为2,添加到了列表c中,b和c指向同一个列表地址,因此列表b也随之改变

第8题

关于Turtle库的表述中,错误的是?

A:Turtle库是Python语言中一个很流行的绘制图像的函数库。

B:画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。

C:turtle.circle( )是只能画一个指定半径为r的圆。

D:turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。

答案:C

turtle.circle( )是turtle中的常用命令,基本语法是circle(radius,e),即画一个指定半径为r,角度e的圆或弧

第9题

有100枚金币,其中有1枚轻1克的假金币,现在要找出这枚假金币,但身边只有1个没有刻度的天秤。小明先是将金币分成50枚一堆,共两堆称重,在轻的那一堆中又分成两堆,接着在轻的25枚中分成12,12,1三堆称重,若两堆12枚的重量相同,则假币为单独剩下的那一枚,否则在轻的那一堆中继续按照之前的办法称下去,直到找到假金币。请问小明采用的办法与哪个算法有着相似之处?

A:递归

B:分治

C:枚举

D:贪心

答案:B

分治算法就是对一个问题采取各个击破的方法,将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。只要求出子问题的解,就可得到原问题的解。

第10题

运行以下代码,正确的打印结果是?( )

python 复制代码
def f(s):

    t=0

    max=0

    for i in s:

        if i>="0" and i<="9":

            t=t+1

        else:

            if t>max:

                max=t

            t=0

    print(max)

list="123ab45cd6d"

f(list)

A:0

B:1

C:2

D:3

答案:D

本段代码中,函数f()的作用是求最长的连续数字字符串的长度。

第11题

下列关于函数的描述正确的是?

A:函数是可重复使用的,用来实现单一,或相关联功能的代码段

B:函数中必须return语句

C:函数好处是模块性,但不能提高代码的利用率

D:函数内容以冒号起始,可以不缩进

答案:A

函数是一段封装了特定功能的代码块,可以在程序中多次调用。函数的设计目的是为了实现特定的功能,并且具有模块化的特性,可以提高代码的可读性、可维护性和重用性。

第12题

调用以下函数时,语句"s=s+i"被执行的次数是?( )

python 复制代码
def f():

    s=0

    i=1

    while i<10:

        if i%3==0 or s%2==1:

            s=s+i

        i=i+1

    print(s)

A:3

B:4

C:5

D:6

答案:C

在给定的代码中,s=s+i语句将在第3、4、5、6、9次循环迭代中执行。这是因为在这些迭代中,满足条件i%3==0 or s%2==1

因此,s=s+i语句被执行的次数是5次。

第13题

已知有n本按照书名拼音排序好的图书,使用对分查找法搜索其中任何一本书,最多查找次数为6次,则n的值可能为?

A:20

B:50

C:80

D:110

答案:B

对规模为n的数据进行对分查找时,无论是否查找到,至多进行 |log2n|+1次(|log2n|表示小于等于log2n的最大整数),因此25≤n<26,即32≤n<64。

第14题

某程序代码设计如下,若输入整数5,则最终输出的结果为?( )

python 复制代码
def fact(x):

    if x==1:

        s=1

    else:

        s=fact(x-1)*x

    return s

n=int(input("请输入一个大于1的整数:"))

print(fact(n)+fact(n-1))

A:120

B:24120

C:144

D:12024

答案:C

由于fact(5)=fact(4)*5, fact(4)=fact(3)*4, fact(3)=fact(2)*3, fact(2)=fact(1)*2, fact(1)=1,所以fact(5)+fact(4)=120+24=144。

第15题

用匿名函数方式求两个数中较大的数,下列定义语句格式正确的是?

A:result = lambda 'x,y': y if x> y else x

B:result= lambda x,y: y if x> y else x

C:result= lambda 'x,y': x if x> y else y

D:result= lambda x,y: x if x> y else y

答案:D

匿名函数的定义语法:lambda 参数:表达式语法。先写lambda关键字,然后依次写匿名函数的参数,多个参数中间用逗号连接,然后是一个冒号,冒号后面写返回的表达式。

第16题

下列程序段的正确运行结果是?( )

python 复制代码
def fun(m,n):

    while m!=n:

        if m>n:

            m=m-n

        else:

            n=n-m

    return m

print(fun(24,16))

A:4

B:8

C:-8

D:2

答案:B

自定义函数fun(m,n)的作用是求m,n两个整数的最大公约数。

第17题

运行下列程序,输出结果正确的是?( )

python 复制代码
def fun(x,y=5):

    return x*y

a=fun(10,10)

print(a)

A:100

B:50

C:10

D:运行出错

答案:A

参数的默认值被替换。

第18题

如果需要在某函数内部调用上一层的局部变量,则可以使用( )关键字。

A:Local

B:nonlocal

C:global

D:nonglobal

答案:B

仅B可以调用上一层的局部变量

第19题

在Python程序中,设已定义函数op,它有一个整型传值参数,一个字符串型传值参数。设x,y为整型变量,z为字符串型变量,则下列能调用该函数的正确语句是?

A:op

B:op(x,y,z)

C:op x,y

D:op(x+y,z)

答案:D

在调用自定函数时需要用到"函数名<参数表>"的方法,且自定义函数op共有两个参数。

第20题

下列哪个语句段的时间复杂度最低?

A:

python 复制代码
if n%2==0:

    x=x*2

else:

    x=x+2

B:

python 复制代码
n=1

while n<=100:

    x=x+2

C:

python 复制代码
for i in range(100):

    for j in range(10):

        x=x+2

D:

python 复制代码
for i in range(100):

    for j in range(i):

        x=x+2 

答案:A

时间复杂度按数量级递增顺序为:常数阶、对数阶、线性阶、线性对数阶、平方阶

第21题

下列哪个不是Python中的内建函数?

A:asc(x)

B:ord(x)

C:chr(x)

D:abs(x)

答案:A

Python中没有asc(x)这个内建函数,ord(x)函数的作用是返回x对应的ASCII值,chr(x)函数的作用是返回x对应的字符,abs(x)函数的作用是返回x的绝对值。

第22题

关于函数的定义语句,以下几项中正确的是?

A:def f(c=2,a,b):

B:def f(a,b=2,c):

C:def f(*c,**d,a,b):

D:def f(a,b,*c,**d):

答案:D

顺序实参必须要放在关键字实参之前,位置参数*args必须要在关键字参数**kwargs前,否则会程序报错。

第23题

下列关于递归的描述不正确的是?

A:递归函数一定包含条件控制语句

B:递归函数一定包含调用自身的语句

C:在调用自身函数时需要明确的边界终止条件

D:递归算法一般代码简洁,执行效率高,空间复杂度低

答案:D

递归算法并不一定代码简洁,执行效率高,或者空间复杂度低。实际上,在某些情况下,递归算法可能会导致代码冗长和执行效率低下,因为每次递归调用都涉及函数调用和堆栈操作。

第24题

下列哪个不是Python第三方库的pip安装方法?

A:使用pip命令

B:使用wheel命令

C:集成安装方法

D:文件安装方法

答案:B

第三方库安装

第25题

对于下列递归式子,当n=4时,F的值是?( )

F(n)=F(n-1)+3 F(1)=2

A:2

B:5

C:11

D:14

答案:C

用递归式子推导得出。

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

第26题

python 复制代码
def add(a, b, c=0):

    return a+b+c

print(add(1, 2, 4))

这段程序的运行结果为3。

答案:错误

在调用函数时给函数提供了实参时,Python将使用指定的实参值

第27题

算法复杂度分析的目的是分析算法的效率,以求改进。

答案:正确

算法复杂度分析的目的是分析算法的效率,以便对算法进行改进。通过分析算法的复杂度,我们可以评估算法在输入规模增大时所需的时间和空间资源。这有助于我们比较不同算法的效率,并选择最优算法来解决问题。

因此,算法复杂度分析的目的是为了分析算法的效率,并找到改进的方法。

第28题

python 复制代码
sum=0

for i in range(5):

    sum=sum+i

print(sum)

运行以上程序,输出结果是15。

答案:错误

给定的代码计算了从0到4的累加和。然而,由于范围函数range(5)不包括上限值5,因此循环只会迭代0、1、2、3、4这五个数。

因此,输出结果将是10,而不是15。

第29题

已有函数def demo(*p):return sum§,表达式 demo(1, 2, 3, 4) 的值为10。

答案:正确

给定的函数demo(*p)使用了可变参数,可以接受任意数量的参数。在这个函数中,参数p被传递给sum()函数,用于计算所有参数的和。

因此,表达式demo(1, 2, 3, 4)将会将参数1、2、3、4传递给sum()函数,计算它们的和,结果是10。

第30题

使用python -m pip install --upgrade pip命令能够升级pip。

答案:正确

使用python -m pip install --upgrade pip命令可以升级pip。在命令行中执行此命令后,pip工具将会检查当前安装的pip版本,并尝试升级到最新版本。这是通过安装最新版本的pip包来实现的。

因此,给定的命令确实可以用于升级pip。

第31题

在python函数中,局部变量不能与全局变量重名。

答案:错误

当全局变量和局部变量同名时,首先会找程序内部有没有局部变量,如果有,则调用,如果没有,才会去调用全局变量。

第32题

下列程序段返回的值为"Hello!Python"。

python 复制代码
lst="Hello!Python"

def f():

    global lst

    lst="Hello!"

    return lst

f()

print(lst)

答案:错误

在函数f中,通过使用global关键字,我们将lst变量声明为全局变量。然后在函数内部,我们将其值修改为"Hello!"。最后,我们调用函数f()并打印全局变量lst的值。

因此,输出结果将是"Hello!",而不是"Hello!Python"。函数内部的修改只会影响全局变量的值。

第33题

使用分治算法求解,子问题不能重复。

答案:正确

分治算法的子问题之间不可以包含公共的子问题。

第34题

设计一个程序来求xn(x的几次方)的值,算法思想是:把xn转换为xxn-1,而xn-1又可以转换为xxn-2,如此重复下去,直到x*x0,而x0=1,从而求出了xn的值。这个程序可以用递归来实现。

答案:正确

递归体现了"大事化小,小事化了"的思想,把大问题转换成小问题来解决,且有终止条件,即算法中的到x0=1为止。

第35题

下列程序段能正确打印1。

python 复制代码
def f(a,b):

    a=a+b

    b=a-b

    a=a-b

    return b

print(F(1,4))

答案:错误

Python中字母区分大小写,所以自定义函数创建和调用时,函数名要一致,否则调用不成功。

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

第36题

利用分治思想,给定一个顺序表,编写一个求出其最大值的程序。

根据上述算法思想,补全下列代码。

输入输出示例:当顺序表是 [22,13,34,4,68,15,5,58,36],输出:68

python 复制代码
def fun_max(num=list):

    return max(num)

def fun(num):

    n =    ①    

    if n <= 2:

        return    ②    

    l_list, r_list = num[:n//2], num[n//2:]

    l_max, r_max =    ③    

    return fun_max(   ④   )

if __name__ == "__main__":

    alist = [22,13,34,4,68,15,5,58,36]

    print(fun(alist))

答案:

python 复制代码
def fun_max(num=list):

    return max(num)

def fun(num):

    n = len(num)

    if n <= 2:

        return fun_max(num)

    l_list, r_list = num[:n//2], num[n//2:]

    l_max, r_max = fun(l_list), fun(r_list)

    return fun_max([l_max, r_max])

if __name__ == "__main__":

    alist = [22,13,34,4,68,15,5,58,36]

    print(fun(alist)) 

评分标准:

① len(num) 或等效答案; (2分)

② fun_max(num) 或等效答案; (2分)

③ fun(l_list), fun(r_list) 或等效答案; (2分)

④ [l_max, r_max] 或等效答案;(2分)

第37题

现有n个人依次围成一圈玩游戏,从第1个人开始报数,数到第m个人出局,然后从出局的下一个人开始报数,数到第m个人又出局,...,如此反复到只剩下最后一个是胜利者。设n个人的编号分别为1,2,...,n,打印出局的顺序。

根据上述算法思想,补全下列代码。

输入输出示例:当n=10,m=4,输出如下:

出局的人是: 4

出局的人是: 8

出局的人是: 2

出局的人是: 7

出局的人是: 3

出局的人是: 10

出局的人是: 9

出局的人是: 1

出局的人是: 6

最后胜利者是: 5

python 复制代码
def fun(n,k):

    L = list(   ①   )

    if n == 1:

        return

    else:

        x = 0

        for i in    ②   

            x =   ③   - 1

            print('出局的人是:',L[x])

            del L[x]

            if x < 0:

                x = 0

        print('最后胜利者是:',   ④   )

fun(10,4)

答案:

python 复制代码
def fun(n,k):

    L = list(range(1,n+1))

    if n == 1:

        return

    else:

        x = 0

        for i in range(n-1):

            x = (x + k) % len(L) - 1

            print('出局的人是:',L[x])

            del L[x]

            if x < 0:

                x = 0

        print('最后胜利者是:',L[0])

fun(10,4) 

评分标准:

① range(1,n+1) 或等效答案;(3分)

② range(n-1): 或等效答案;(3分)

③ (x + k) % len(L) 或等效答案;(3分)

④ L[0] 或等效答案;(3分)

第38题

设计一个算法,将一个正整数分解质因数。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,输出即可。

(2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

根据上述算法思想,补全下列代码。

输入输出示例:当n=105,输出:105= 35 7

当n=60,输出:60= 223*5

python 复制代码
def fun(n):

    print('%d='%n,end=' ')

    for i in    ①   :

        while n!=i:

            if n>i and   ②   :

                print(i,end='*')

                   ③    

            else:

                break

        else:

               ④    

            break

if __name__ == "__main__":

    while True:

        num=input("输入一个正整数:")

        if not num.isdigit():

            break

        fun(int(num))

答案:

python 复制代码
def fun(n):

    print('%d='%n,end=' ')

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

        while n!=i:

            if n>i and n%i==0:

                print(i,end='*')

                n=n//i

            else:

                break

        else:

            print(n)

            break

if __name__ == "__main__":

    while True:

        num=input("输入一个正整数:")

        if not num.isdigit():

            break

        fun(int(num)) 

评分标准:

① range(2,n+1) 或等效答案;(3分)

② n%i==0 或等效答案;(3分)

③ n=n//i 或等效答案;(2分)

④ print(n) 或等效答案;(2分)

相关推荐
青莳吖5 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall12 分钟前
期末考学C
java·开发语言
重生之绝世牛码14 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行20 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157630 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
岑梓铭30 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
shinelord明39 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
游客52044 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
Monly211 小时前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu1 小时前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa