
简介Python期末试题题库完整.pdf是一份面向Python初学者和高校学生的期末复习资料内容兼顾知识点总结与典型习题。资料以基础语法、数据类型、运算符、控制结构、函数、文件操作、错误处理等板块为主线通过大量选择题和程序阅读题帮助读者巩固理解。压缩包内仅含1个PDF文件大小约139KB便于下载后直接打印或电子阅读。目前已有13464人浏览学习题目设置贴近考试常见考点例如逻辑运算符与位运算符的区分、round与int函数的数值处理、global变量作用域、文件打开模式以及列表索引等并对每个易混点提供程序运行结果分析。从内容预览可见题目还涉及浮点数科学计数法、int取整规则、sys.argv获取命令行参数、嵌套字典取值等细节覆盖非计算机专业公共课、计算机专业基础课的典型考核点整体结构清晰方便按章节快速定位尤其适合期末考前集中自测也可作为教师出题或课堂练习的参考题目难度适中既有基础概念辨析也有综合代码应用能够满足不同水平学生的复习需求。1. 这份Python题库为什么值得逐行抠拿到一份Python期末试题库大多数人先翻到最后背答案但我建议反过来逐行抠过去。因为这份题库里几乎没有“直给”的题很多选项都是故意做出来的陷阱。比如 and 与 的区别、int(10.96) 为什么不是 11、vehicle[-1] 到底取到谁、函数内部一段赋值为什么改不掉外面的全局变量。这些问题恰好覆盖Python基础语法、数据类型、运算符、控制流、函数和文件操作对刚配好Python环境、准备入门的人来说是很好的自查工具对写了两三年项目的人也能快速暴露出一些“以为会但没验证过”的惯性错误。下面按主题拆开讲每一处都可以直接复制到解释器里跑。2. 运算符与类型转换Python选择题里最高频的失分点出题人在运算符和类型转换上设置的干扰项最多尤其是逻辑与、位与、取整、绝对值这几组几乎每个初学者都会在它们身上纠缠一阵。2.1 逻辑与 and、位与 与短路行为先看一段最直接的验证代码a True b False print(a or b) # True print(a and b) # False print(not a) # False print(3 2) # 2 print(3 3) # 3Python 里没有 C 语言的和||逻辑与只能写成and逻辑或只能写成or。而是位运算符按二进制位做与运算3 的二进制是0b112 是0b10逐位相与得到0b10也就是整数 2。同理3 3的结果是 3 而不是 0。很多题库把3 3的答案写成 0本质上是把逻辑与和位与混淆了。这里还有一个隐藏考点and和or并不一定返回布尔值。比如下面这个表达a a print(a b or c) # c字符串比较按字符编码逐个比较a的编码是 97b是 98所以a b为 False表达式进入or c最终返回字符串c。也就是说or会在左侧为假时返回右侧的原始对象而不是把结果强制包装成 False。这在实际场景里可以用来写默认值比如name input_name or default。2.2 round、int、fabs 的类型陷阱这组题非常适合用一行代码验证print(round(3.49)) # 3 print(round(3.51)) # 4 print(int(10.46)) # 10 print(int(10.96)) # 10 import math print(math.fabs(-3)) # 3.0round()在只传一个参数时返回整数。它的舍入规则是“四舍六入五取偶”对于 3.49 和 3.51 这种边界不明显的小数表现和普通四舍五入一致。int()则直接截断小数部分不管后面小数是 46 还是 96结果都是 10。math.fabs()返回绝对值但始终是浮点数所以math.fabs(-3)是3.0而不是3。这些函数在传播过程中经常因为版本或解释器差异被误记。有人会把round(3.51)记成 3但在 Python 3 中实际结果是 4。所以我不太建议背字母答案更推荐把它当成一个行为测试在命令行里跑一遍再下结论。下面这张表可以当速查表达式结果说明round(3.49)3普通四舍五入round(3.51)4普通四舍五入int(10.96)10向零截断不四舍五入math.fabs(-3)3.0结果是浮点数2.3 幂运算、科学计数法与数值字面量题库里还有一组关于幂和科学计数法的题print(3 ** 2) # 9 print(pow(2, pow(3, 2))) # 512 print(9.6E-5) # 9.6e-05 print(314.15e-2) # 3.1415**是幂运算符pow(a, b)等价于a ** b。所以pow(3, 2)是 9外层pow(2, 9)就是 512。科学计数法中的E或e都合法9.6E-5表示9.6 * 10**-5也就是0.000096。这类题除了识别字面量还提醒我们浮点数在内存里就是按科学计数法存储的打印时可能会显示成9.6e-05这样。另外要注意bool是int的子类True等于 1所以True 2为 FalseTrue 1为 True。这些细节不会出现在界面上但会影响很多条件判断的结果。3. 序列、索引与迭代从 vehicle 列表看清可变与不可变题库里有一组以vehicle为原型的题目从列表索引一路问到嵌套列表长度几乎把序列类型的常见考点串了一遍。3.1 列表索引、负索引、index 与 count先看最基础的一组vehicle [train, bus, car, ship] print(vehicle[0]) # train print(vehicle[1]) # bus print(vehicle[-1]) # ship print(vehicle.index(car)) # 2列表索引从 0 开始所以vehicle[1]是第二个元素bus。负索引从末尾倒着数vehicle[-1]是最后一个元素shipvehicle[-2]是car。index()返回第一个匹配元素的下标count()返回元素出现的次数。当列表很长时index()需要线性查找不要在大循环里反复调用。再看嵌套列表nested [[train, car], [bus, subway], [ship, bicycle], [car]] print(len(nested)) # 4 print(len(nested[1])) # 2 print(len(nested[1][0])) # 3len()只统计最外层的元素数量所以是 4。nested[1]是[bus, subway]长度 2。nested[1][0]是字符串bus长度 3。这类题想考察的是“先定位再逐层展开”的能力在解析二维表格时非常常见。列表还支持乘法print([1, 2, 3] * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]这个操作是把整个列表重复拼接不是逐元素相乘。如果想对每个元素乘 3需要写列表推导式[x * 3 for x in [1, 2, 3]]。3.2 元组的括号陷阱与不可变语义下面这段代码很容易让初学者愣住list1 [(2), (0), (1), (8)] list2 [(2,), (0,), (1,), (8,)] print(type(list1[0])) # class int print(type(list2[0])) # class tuple(2)只是一个普通的括号表达式返回整数 2(2,)才是单元素元组。写元组时如果没有逗号它就不是元组。这个规则还影响嵌套结构(1, 2) * 2结果是(1, 2, 1, 2)而(1) * 2结果是 2。元组的不可变特征让它可以被哈希因此能作为字典的键print({(1, 2, 3): ok}) # {(1, 2, 3): ok}如果把列表放进去解释器会抛出TypeError: unhashable type: list。这也是为什么“用列表当键”不能创建字典。理解 hashable 这个概念后面再看 set、frozenset 会更顺。3.3 序列类型与字符串比较规则Python 官方把字符串、列表、元组归为序列类型字典属于映射类型。下面这张表可以快速区分类型是否序列是否可变能否作为字典键str是否是list是是否tuple是否是dict否是键必须可哈希字符串没有单独的char类型一个字符就是长度为 1 的字符串。所以“Python 不支持的数据类型”里如果出现char正确答案就是它。字符串比较按字典序逐字符比较编码print(abc xyz) # False print((3, 2) (33, 22)) # True第一个表达式先比较a和xa较小所以整体为 False。第二个表达式先比较3和3相等再比较2和32较小所以整体为 True。元组比较的规则在排序时很重要它会先比较第一个元素相等再比较第二个依次类推。3.4 循环中的 break 与 continue循环控制也是题库的重点。下面这段代码把 break 和 continue 的行为放在一起看n 0 while True: n 1 if n 2: continue print(n) if n 5: break输出是1 3 4 5。continue会跳过本次循环剩余的代码直接进入下一轮所以 n 等于 2 的那次打印被跳过。break会终止整个循环当 n 等于 5 时跳出while。exit()可以退出整个解释器进程但正常脚本里应该由break承担跳出循环的工作。注意break只能跳出它所在的最内层循环嵌套循环时如果想一步跳出多层通常得借助标志变量或者把逻辑抽成函数。4. 函数、作用域与命令行参数def、global、argv 一起讲这一章把函数定义、作用域、命令行参数和递归放在一起因为它们在选择题里经常互相干扰。4.1 def 与参数传递机制创建 Python 自定义函数的关键字是def不是function也不是procedure。一个简单例子def my_func(a, b10): return a b print(my_func(1)) # 11 print(my_func(1, 2)) # 3函数定义时的参数是形参调用时传入的是实参。位置参数按顺序绑定关键字参数可以乱序比如my_func(b2, a1)。默认参数在函数定义时只计算一次所以不能把可变对象作为默认值。像def f(lst[])这样写多次调用会共享同一个列表导致数据累积。函数可以没有参数def f():是合法的。因此题库里“函数定义必须有参数”这种说法本身就是错的。参数形式还包括*args和**kwargsdef show(*args, **kwargs): print(args) print(kwargs) show(1, 2, namepython) # (1, 2) {name: python}*args收集多余位置参数**kwargs收集多余关键字参数。这在封装装饰器、扩展函数接口时特别有用。4.2 global 作用域陷阱下面两个程序对应题库里两道很类似但答案相反的题a 10 def set_number(): a 100 set_number() print(a) # 10函数内部的a 100创建了一个局部变量和全局变量a没有关系所以外部a还是 10。如果想要修改全局变量需要加global声明a 10 def set_number_global(): global a a 100 set_number_global() print(a) # 100这里的关键是Python 在函数体内只要看到对一个变量的赋值就会默认把它当作局部变量除非你用global提前声明。如果函数内部先读取全局变量再给它赋值还会触发UnboundLocalError。实际项目中我更推荐用返回值代替global尽量少让函数产生副作用。4.3 sys.argv 参数获取命令行运行脚本时参数经常是通过sys.argv拿到的python my.py v1 v2脚本内容from sys import argv print(argv) print(argv[0]) print(argv[1]) print(argv[2])输出[my.py, v1, v2] my.py v1 v2argv[0]永远是脚本文件名或解释器路径真正的第一个参数从argv[1]开始。题目里问“如何获得 v2”答案就是argv[2]不是argv[1]。如果在 IDE 里运行argv内容取决于运行配置最好在终端中验证。对于参数较多的脚本建议用argparse而不是手写argv否则参数解析逻辑会越来越难维护。4.4 递归与函数设计的边界题库给了一个阶乘函数def factorial(n): if n 0: return if n 1: return 1 return n * factorial(n - 1) print(factorial(5)) # 120这是一个递归函数不是“求任意两个数值 n 和 n-1 的乘积”。递归必须有终止条件这里当 n 等于 1 时返回 1。但注意 n 等于 0 时函数直接返回None所以factorial(0)不是 1。工程上计算阶乘可以直接用math.factorial性能更好。函数的优点一般包括减少重复代码、增强模块化、便于阅读但“加快程序运行速度”这个说法不成立。函数调用本身有额外开销递归过深还可能触发RecursionError。理解函数调用栈之后再看装饰器、生成器这类进阶语法会更顺。5. 文件打开模式与一个查错技巧从 open 的模式参数说起文件操作在选择题里只考了模式参数但实际编码时它和异常处理是绑在一起的所以我放在最后一章一起说。5.1 mode 参数语义下面这段代码展示了最常用的三种模式with open(demo.txt, w, encodingutf-8) as f: f.write(hello) with open(demo.txt, a, encodingutf-8) as f: f.write( world) with open(demo.txt, r, encodingutf-8) as f: print(f.read()) # hello world第一个with用w模式覆盖写入第二个用a模式追加第三个用r模式读取。with语句会在代码块结束后自动关闭文件不用手动调用f.close()这是文件操作的正确写法。w打开时会把原文件清空a打开时写指针始终在文件末尾即使seek到前面也很难直接覆盖。模式读写指针初始位置文件不存在时r可不可开头报错w不可可开头内容清空创建a不可可末尾创建r可可开头报错w可可开头内容清空创建a可可末尾创建实际项目中文件路径可能不存在或者权限不足所以最好和异常处理搭配使用。比如FileNotFoundError和PermissionError在读取用户上传文件、生成日志时都很常见。这个知识点在选择题篇幅里可能只是一道题但工程中的价值要高得多。5.2 用 python -c 和断言脚本快速验证题库答案与其对着 PDF 翻答案不如写一个小脚本批量验证有疑问的表达式。最简单的做法是用python -c直接跑一行python -c aTrue;bFalse;print(a or b, a and b, 3 2, 3 3)输出True False 2 3这种方式适合快速确认一个表达式。如果想把整份题库里拿不准的选项都过一遍可以用断言脚本import math from sys import argv cases [ (int(10.96), 10), (round(3.51), 4), (math.fabs(-3), 3.0), (a b or c, c), ] for i, (result, expected) in enumerate(cases, 1): try: assert result expected, fcase {i}: {result!r} ! {expected!r} print(fcase {i} OK) except AssertionError as e: print(FAIL:, e)这个脚本把“表达式”和“预期结果”做成一对跑完会明确告诉你哪一条不匹配。遇到歧义选项时把它作为新的 case 加进列表再用上sys.argv控制只跑某几项比一行行手动print()高效很多。整份题库过完之后你会发现很多所谓的答案错误其实都是版本差异或参数细节造成的自己亲手验证过的结论才靠得住。本文还有配套的精品资源点击获取