多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Python期末理论笔试题含答案解析:覆盖语法、数据结构与函数编程

Python期末理论笔试题含答案解析:覆盖语法、数据结构与函数编程 简介《Python程序设计》期末考试理论笔试题带答案面向高校Python课程学生与自学入门者定位为考前自测与知识点梳理工具。试卷按常见期末题型编排涵盖选择题20道、填空题、阅读程序题、简答题与编程题覆盖变量与标识符、eval与input函数、print原始字符串、逻辑表达式与运算优先级、for循环及break/continue、字符串切片、正则匹配、集合与字典操作、函数与实例属性、文件读写、异常处理等核心知识点。每道题目均配有答案与简要解析尤其对易混淆点如合法标识符、切片边界、循环控制、集合去重等给出了明确说明。资源为1个PDF文件约244KB内容精炼便于打印或导入笔记软件。目前已有4292人学习下载适合期末系统复习、教师命题参考或Python初学者巩固基础。 又到了期末季邮箱里陆续塞进来不少类似的问题“老师Python理论卷到底考什么有没有能直接背的答案”问得多了我就干脆把平时用来做阶段性验收的一套《Python程序设计》期末理论笔试题整理成文。这套卷子不是为了刁难人而是用来检验一门Python课程里最基本的python语法、数据结构、函数与作用域、面向对象、程序阅读和动手编码能力是否真正过关。题目覆盖了期末复习中最常被问到的高频考点每道题都附了答案和解析学生可以自测老师也可以拿来改成自己班级的试卷。1. 为什么我决定把期末理论题做成“带答案版”1.1 理论卷真正的考查目标很多人对理论笔试题有误解觉得期末理论卷就是考背书、考记语法关键字。实际上一份合格的理论卷考的是“读代码的能力”和“判断代码行为的能力”。选择题和程序阅读题本质上是在模拟人肉执行代码考查你能不能像解释器一样在脑子里把这个程序跑一遍。这种能力是上机写代码的基础也是很多学生真正欠缺的地方。我带过的班里经常出现一种情况上机时让他写一个统计字符串字符出现次数的函数他能写出来但一换成纸面题目给出一个带默认参数的函数问他两次调用的输出是什么他就开始犹豫。这说明他对函数的定义时机、默认参数的绑定规则理解得不够透彻只是记住了能跑通的代码。理论卷的价值就是把这类“代码能跑但没理解透”的问题暴露出来。1.2 这套试卷的知识点地图下面是我整理这套卷子时的考点覆盖计划题型题量分值参考主要考点选择题8题24分python语法、运算符和类型转换、列表与字典、深浅拷贝、函数默认参数、生成器、异常处理填空题7题18分lambda、列表去重、继承体系、文件模式、面向对象特性、列表推导式、日志级别程序阅读题4题24分闭包与nonlocal、循环控制、字符串切片与编码、类型转换编程与论述题3题必做1题选做34分字符统计、列表解析式与生成器对比、with文件操作、面向对象类设计合计22题左右100分覆盖“语法—数据结构—程序控制—函数—OOP—文件—异常”完整主线这个结构不是拍脑袋定的而是按照“基础识别→准确记忆→模拟执行→综合应用”四个层次往上走的。分值也刻意向程序阅读题和编程题倾斜因为这两类题最能反映真实水平。2. 题型结构与分值分配一份标准卷怎么排2.1 四大题型的分工从“认识”到“应用”选择题承担的是“认识与辨析”功能。它不需要你完整写出代码只需要你在四个选项里找出正确的。这意味着题目必须设计得有区分度不能全考“def是什么意思”这种送分题而要加入概念对比比如列表和元组、浅拷贝和深拷贝、get方法和下标访问。填空题承担的是“准确记忆”功能。答错一个字都拿不到分比如把“多态”写成“重载”把“WARNING”写成“WARN”这种细节能有效筛掉那些“大概知道但不够精确”的学生。程序阅读题承担的是“模拟执行”功能。这一部分最接近真实开发中“读别人代码”的场景。你不需要运行环境只需要在纸上或心里把代码逐步执行清楚这对逻辑推理能力要求很高也是最容易拉开分差的位置。编程与论述题承担的是“组织代码”功能。一道题通常需要学生独立完成函数定义、逻辑分支、返回值选择和异常处理。这一块不只看最终结果还要看命名规范、边界处理、是否用了不必要的全局变量等。2.2 难度梯度设计为什么编程题放在最后这套卷子的顺序不是随便排的。选择题在前是为了让学生先进入考试状态程序阅读题居中考验耐心编程题放最后是因为它的思维强度最大而且需要留足书写时间。我见过不少学生前面选择题答得飞快最后编程题只剩十几分钟写得密密麻麻却缺少基本结构。所以我通常会建议学生答题时先把会做的题目快速完成再集中时间处理程序阅读题和编程题不要在一道选择题上死磕超过两分钟。程序阅读题的分值排在中间也是一种心理设计。它有标准答案但需要推理过程学生能感受到难度逐步提升而不是一上来就被难住。教学上这种梯度也能让基础薄弱的学生不至于直接放弃整张卷子。3. 选择题解答与易错点精讲3.1 语法与数据类型基础第1题在Python中定义函数时使用的主要关键字是 A. class B. func C. def D. function答案C这道题属于基础中的基础但它每年都有人错。def是Python定义函数的关键字class用于定义类func和function都不是Python的关键字。有些同学受其他语言影响会选D记住Python的函数定义就认def。第2题下列关于列表与元组的说法正确的是 A. 列表不可变元组可变B. 列表和元组都支持下标访问C. 元组只能通过tuple()创建D. 列表不允许混合存放不同类型的数据答案B列表可变、元组不可变方向千万别搞反。列表用方括号定义元组通常用小括号定义但真正的关键是逗号(1, 2)是元组(1)只是整数1要写成(1,)才是单元素元组。元组虽然不可变但也能用下标访问所以B正确。D错在列表本来就允许混合类型比如[1, a, 2.5]。第3题表达式7 // 2和-7 // 2的结果分别是 A. 3、-3 B. 3.5、-3.5 C. 3、-4 D. 4、-3答案C//是向下取整除法不是简单的“只保留整数部分”。7 // 2得到3这个没问题但-7 // 2不是 -3而是 -4因为它要向负无穷方向取整。很多同学在这一步丢分就是因为下意识把除法和取整混在一起。3.2 常用数据结构与字典方法第4题执行d {a: 1, b: 2}后d.get(c, 0)的返回值是 A. None B. 0 C. c D. 抛出 KeyError答案Bdict.get(key, default)在键不存在时不会抛异常而是返回默认值。这道题里默认值是0所以返回0。如果写成d[c]才会抛出KeyError而d.get(c)不传第二参数时返回None。记住get方法就是用来做安全取值的。第5题关于浅拷贝和深拷贝下列说法错误的是 A.copy.copy()默认创建浅拷贝B.copy.deepcopy()会递归复制嵌套对象C. 浅拷贝后的新对象中嵌套列表仍然指向原列表D. 浅拷贝会复制嵌套列表中的每个元素答案D浅拷贝只复制最外层容器嵌套对象仍然共享引用深拷贝会递归复制所有层级的对象。很多教材把概念写得很抽象其实只要记住一句话浅拷贝复制“外壳”深拷贝连“内脏”一起复制。拿copy.copy([[1, 2], [3, 4]])举例新建列表的顶层和原列表不同但里面的两个子列表仍是同一个对象。3.3 函数、作用域与生成器第6题下列代码的输出是 def f(a, b[]): b.append(a) return b print(f(1)) print(f(2))A.[1][2]B.[1][1, 2]C.[1][2, 1]D.[2][1]答案B这是Python里最经典的“可变默认参数”坑。默认列表b在函数定义时创建一次第二次调用时并没有重新初始化而是继续复用同一个列表所以第二次打印出来是[1, 2]。安全写法是写成def f(a, bNone): if b is None: b []后面我会再展开讲。第7题关于生成器下列说法正确的是 A. 生成器会一次性生成所有元素B. 生成器只能遍历一次C. 生成器必须使用returnD. 生成器不能用于for循环答案B生成器是惰性求值的也就是说它不会一下子把所有结果算出来而是每次用yield产出一个值。它能用在for循环里但不能像列表一样反复遍历。区别极大列表是把所有元素放进内存生成器是“算一个、给一个”适合处理大数据流。第8题下列语句中可能触发ValueError的是 A.int(abc)B.1 / 0C.open(not_exist.txt)D.[1, 2, 3][5]答案Aint(abc)无法把非数字字符串转成整数会抛出ValueError。1 / 0是ZeroDivisionErroropen不存在的文件是FileNotFoundError列表索引越界是IndexError。理论考试很喜欢把各种异常放在一起考复习时建议把异常名和被触发的场景对应起来记而不是只背异常名称的中文翻译。4. 填空题和程序阅读题最容易拉开分差的题型4.1 填空题答错一个字都拿不到分第1题在Python中定义匿名函数使用的关键字是 ______其语法结构为 ______。答案lambdalambda 参数列表 : 表达式匿名函数也叫lambda函数函数体只能是一个表达式不能包含赋值语句或完整的分支结构。它常用于sorted的key参数、map、filter等场景比如按元组第二项排序sorted(data, keylambda x: x[1])。第2题现有列表lst [3, 1, 2, 1, 3]要求去重且保持原始顺序常见的写法是 ______。答案list(dict.fromkeys(lst))直接set(lst)能去重但会打乱顺序因为集合本身是无序的。dict.fromkeys(lst)会以列表元素作为字典键并按插入顺序保留键再用list()转回列表就能保序去重。这个方法在工作里很实用比“set后按原列表下标排序”更简洁。第3题Python中所有类的最终基类是 ______。答案object在Python 3中所有类都直接或间接继承自object。即便是定义一个什么都没写的class A:它也有从object继承来的基础方法比如__str__、__repr__。这个概念在讲面向对象时往往被一笔带过但填空题里它就是送分或送命题。第4题在对文件进行操作时模式字符串w表示 ______a表示 ______。答案写入并覆盖原文件追加写入w模式打开文件时会把原内容清空不存在则创建新文件a模式不会清空原文件而是在文件末尾追加内容。做日志输出或数据积累时经常用a。如果既不想覆盖又不想追加只读请用r。第5题面向对象程序设计的三大特性是、、______。答案封装、继承、多态注意是“多态”不是“重载”。Python中多态通过“鸭子类型”体现——一个对象是否适合某操作取决于它有没有对应的方法而不是它的类型。比如有人有speak()方法狗也有speak()方法不管它们是否继承同一个父类都能在同一个循环里被调用。第6题执行[i * i for i in range(5) if i % 2 0]得到的结果是 ______。答案[0, 4, 16]range(5)产生 0、1、2、3、4if i % 2 0过滤出 0、2、4再分别平方得到 0、4、16。列表推导式是Python非常常用的写法但考试时建议先拆解range再算条件过滤最后再算表达式不要直接从结果反推。第7题logging模块的日志级别从低到高是 DEBUG、INFO、______、ERROR、CRITICAL。答案WARNING日志级别顺序是 DEBUG INFO WARNING ERROR CRITICAL。设置levellogging.INFO时低于INFO的DEBUG日志会被过滤掉。这个考点看起来偏冷门但实际项目中很常用写在填空里能提醒学生不要只盯语法而忽略标准库。4.2 程序阅读题人肉执行一段代码程序阅读题第1题写出下列代码的输出。def outer(): x 10 def inner(): nonlocal x x 1 return x return inner f outer() print(f()) print(f())输出11 12这道题考闭包和nonlocal。inner里出现了x 1Python会先判断x的作用域。如果不写nonlocal xx会被当成inner内部的局部变量直接报UnboundLocalError。加上nonlocal后inner能修改外壳函数outer里的x。第一次调用f()x从10变11第二次调用继续在同一个闭包上操作变成12。程序阅读题第2题写出下列代码的输出。for i in range(1, 6): if i 3: continue if i 5: break print(i, end )输出1 2 4continue的效果是跳过本次循环break是直接结束整个循环。i取1、2时正常打印i取3时跳过i取4时正常打印i取5时触发break退出循环所以输出是1 2 4后面带一个空格。很多学生把continue和break搞混这个题目就是在考察两个关键字是否真正理解。程序阅读题第3题写出下列代码的输出。s Python编程 print(len(s)) print(s[::-1])输出8 程编nohtyP在Python 3中字符串的len是按Unicode字符计算的汉字和英文字母都算一个字符。“Python编程”一共8个字符。[::-1]是从后往前切片所以结果把“编程”放到前面再把“Python”逆序成“nohtyP”。如果还在用Python 2的字节思维做题这里会很吃亏。程序阅读题第4题写出下列代码的输出。print(str(3) 3) print(int(12) 2) print(float(1.5) * 2)输出33 14 3.0这题考类型转换的边界。str(3) 3是字符串拼接结果是33int(12) 2是整数加法结果是14float(1.5) * 2得到浮点数3.0注意不是3。很多培训机构喜欢把str和int混在一起考就是在考察你到底是在做“拼接”还是在做“运算”。5. 编程与论述题评分时我在看什么5.1 编程题第1题字符统计函数题目编写一个函数count_chars(s)接收一个字符串返回一个字典键是字符值是出现次数。要求忽略大小写并且只统计英文字母。参考实现def count_chars(s: str) - dict: s s.lower() result {} for ch in s: if ch.isalpha(): result[ch] result.get(ch, 0) 1 return result这道题考察的点非常集中。第一步用lower()统一大小写这是“忽略大小写”的关键第二步用isalpha()过滤掉空格、数字和标点第三步用result.get(ch, 0) 1实现计数而不是写if ch in result这种更长的分支。使用dict.get带默认值是Python里非常自然的计数习惯。评卷时我最常看到的错误忘记了lower()把空格也统计进去或者直接用result[ch] 1导致KeyError。这些错误说明学生对字典操作还不够熟练而不是逻辑能力有问题。5.2 编程题第2题列表解析式与生成器表达式的对比题目分别用列表解析式和生成器表达式求0到10之间的偶数平方并说明两者在内存使用上的区别。参考实现squares_list [i * i for i in range(11) if i % 2 0] squares_gen (i * i for i in range(11) if i % 2 0)range(11)包含0到10过滤条件i % 2 0选出偶数表达式i * i得到平方。列表解析式的结果是一个完整的列表生成器表达式的结果是一个生成器对象。两者的核心区别是列表解析式会立即算出所有元素并占用对应大小的内存生成器表达式是惰性的每迭代一次才算出一个元素。如果处理的数据量很大比如1000万个数字的平方列表解析式可能直接把内存撑爆而生成器表达式几乎不占额外空间。代价是生成器只能遍历一次不能像列表那样反复访问。5.3 编程题第3题文件读取与with语句题目简述with open语句的作用并实现一个函数统计UTF-8文本文件的行数。参考实现def count_lines(filename: str) - int: with open(filename, r, encodingutf-8) as f: return sum(1 for line in f)with语句最直接的好处是无需手动调用f.close()即使读取过程中发生异常文件也会被正常关闭。指定encodingutf-8可以避免中文乱码。sum(1 for line in f)是按行迭代计数不会一次性把整个文件读进内存比len(f.readlines())更省内存。如果文件不存在这个函数会抛出FileNotFoundError。实际项目中可以加上异常处理def count_lines(filename: str) - int: try: with open(filename, r, encodingutf-8) as f: return sum(1 for line in f) except FileNotFoundError: return -1这属于加分写法评卷时我会给额外分值。5.4 编程题第4题选做面向对象类设计题目设计一个BankAccount类包含owner和balance属性提供存款、取款、查询余额的方法。余额不足时提示并返回False并重写__str__方法。参考实现class BankAccount: def __init__(self, owner: str, balance: float 0.0): self.owner owner self.balance balance def deposit(self, amount: float) - bool: if amount 0: print(存款金额必须为正数) return False self.balance amount return True def withdraw(self, amount: float) - bool: if amount 0: print(取款金额必须为正数) return False if amount self.balance: print(余额不足) return False self.balance - amount return True def get_balance(self) - float: return self.balance def __str__(self) - str: return f{self.owner}的余额为{self.balance:.2f}面向对象编程题评卷时我会依次看四件事__init__是否正确初始化实例属性方法参数是否写了self取款时有没有做余额判断__str__是否返回字符串而不是直接打印。题目里没有强制要求参数校验但能写出amount 0判断的学生说明平时写代码就有关注边界条件的习惯。6. 备战期末和平时教学的3个心得6.1 可变默认参数这类“经典坑”值得反复练可变默认参数是Python里出了名的坑几乎每个讲函数的章节都会提但期末卷子上的正确率依然不高。原因在于如果学生只是抄结果不亲手敲一遍def f(a, b[]): b.append(a); return b很难理解“默认参数在函数定义时只创建一次”。我的建议是把这个坑拆成三个小问题反复练习默认参数的绑定时机是什么不可变默认参数为什么没有这个坑写成bNone又怎么处理想明白这三步闭包和函数作用域的理解也会跟着加深。6.2 理论题不难难在概念之间的等价变换很多理论题本质上查手册都能查出来但考试不可能让你翻手册它考的是你在不同表示方式之间快速切换的能力。比如“去重且保持顺序”可以直接写list(dict.fromkeys(lst))也可以用set加sorted按原索引排序。两种方案结果相同但背后对“顺序”的理解是不一样的。复习阶段多问自己“这道题除了这种写法还有没有别的写法”比单纯刷题更有用。python数据类型、类型转换、文件操作这些内容也完全可以彼此组合出题。6.3 复习建议与可用资源期末复习不要只是背概念建议把每道程序阅读题都变成一个小脚本在本地环境里跑一遍亲手验证输出。很多同学看答案时觉得自己会了但真正动手跑一遍后才发现自己连python命令都还没顺更不用说vscode里环境配置是不是已经完整。理论笔试不直接考环境搭建但复习效率却被环境卡住就太亏了。如果时间紧张优先抓这几块python语法基础、列表和字典的操作、函数定义与作用域、文件读取、异常处理、面向对象基础。平时写代码积累下来的易错点建议全部整理成test.py这类小脚本跑一遍记一遍比反复翻笔记管用。这套卷子拿回去照着做一遍再对照解析批改会比光看两遍课本有用得多。本文还有配套的精品资源点击获取
返回列表