Python 模拟考试 2 — 解析
📝 一、单选题(每题2分,共40分)¶
第1题¶
Python中,以下哪个不是合法的变量名?()
| 选项 | 内容 |
|---|---|
| A | _name |
| B | my_var |
| C | 2nd_value ✅ |
| D | StudentAge |
答案
C
📖 解析:
-
A 合法:下划线开头的变量名合法,常用于表示私有变量
-
B 合法:字母、数字、下划线组合合法
-
C 不合法:变量名不能以数字开头,
2nd_value以数字2开头,语法错误 -
D 合法:大驼峰命名法完全合法
🔑 知识点:Python标识符规则
-
只能包含字母、数字、下划线
-
不能以数字开头
-
不能使用关键字
-
区分大小写
📌 记忆要点
数字不能开头,关键字不能当变量名
第2题¶
下列关于Python3中字符串的说法,正确的是()。
| 选项 | 内容 |
|---|---|
| A | 字符串属于可变数据类型 |
| B | 单引号和双引号定义的字符串没有区别 ✅ |
| C | 三引号只能用于定义多行注释 |
| D | 字符串可以用del删除其中某个字符 |
答案
B
📖 解析:
-
A 错误:字符串是不可变类型,任何\"修改\"操作都创建新字符串对象
-
B 正确:单引号
'hello'和双引号"hello"在Python中完全等价 -
C 错误:三引号可定义多行字符串,也可做文档字符串(docstring),不只是注释
-
D 错误:字符串不可变,
del只能删除整个变量,不能删除某个字符
🔑 知识点:字符串特性
-
不可变:任何\"修改\"操作都创建新字符串
-
引号等价:
'a'=="a" -
三引号:多行字符串 / 文档字符串 / 多行注释
第3题¶
表达式 len("Hello世界") 的结果是()。
| 选项 | 内容 |
|---|---|
| A | 5 |
| B | 6 |
| C | 7 ✅ |
| D | 8 |
答案
C
📖 解析:
-
Python3中字符串以Unicode编码,
len()统计的是字符个数,不是字节数 -
"Hello世界"= 5个英文字母 + 2个中文字符 = 7个字符 -
如果用
utf-8编码的字节数则是 5+6=11字节,但len()不统计字节
🔑 知识点:len()函数与字符串编码
-
len()统计字符数,不是字节数 -
Python3中一个中文字符=1个字符长度
-
区分
len(s)和len(s.encode('utf-8'))
第4题¶
下列关于Python列表的说法,错误的是()。
| 选项 | 内容 |
|---|---|
| A | 列表中的元素可以是不同类型 |
| B | 列表可以使用负数索引访问元素 |
| C | 列表是不可变数据类型 ✅ |
| D | 列表可以使用append()方法添加元素 |
答案
C
📖 解析:
-
A 正确:列表是异构容器,元素可以是任意类型
-
B 正确:负数索引从末尾开始,
lst[-1]是最后一个元素 -
C 错误:列表是可变数据类型,可以增删改元素
-
D 正确:
append()是列表的常用方法,在末尾添加元素
🔑 知识点:可变与不可变类型
| 可变 | 不可变 |
|---|---|
| list | int/float/str |
| dict | tuple |
| set | frozenset |
第5题¶
以下关于函数返回值的说法,正确的是()。
| 选项 | 内容 |
|---|---|
| A | 函数必须有return语句 |
| B | 没有return语句的函数返回None ✅ |
| C | 函数只能返回一个值 |
| D | return语句只能出现在函数末尾 |
答案
B
📖 解析:
-
A 错误:函数可以没有return语句
-
B 正确:没有return或return后无值,函数默认返回
None -
C 错误:
return a, b返回元组,实际上可以返回多个值 -
D 错误:return可出现在函数任何位置,执行到即返回
📌 记忆要点
无return → 返回None;return可多处出现
第6题¶
执行下列代码后,输出结果是()。
| 选项 | 内容 |
|---|---|
| A | 6 |
| B | 8 ✅ |
| C | 9 |
| D | 报错 |
答案
B
📖 解析:
-
func(1, 2)→ a=1, b=2(覆盖默认值3), c=5(使用默认值) -
计算:1 + 2 + 5 = 8
-
默认参数在被调用时若提供了新值则覆盖
🔑 知识点:默认参数
-
定义时赋默认值:
def f(a, b=3, c=5) -
调用时若省略则用默认值,否则覆盖
-
默认参数必须放在非默认参数之后
第7题¶
关于Python中全局变量和局部变量,下列说法错误的是()。
| 选项 | 内容 |
|---|---|
| A | 在函数内部定义的变量是局部变量 |
| B | 在函数外部定义的变量是全局变量 |
| C | 函数内部可以直接修改全局变量的值 ✅ |
| D | 使用global关键字可以在函数内声明全局变量 |
答案
C
📖 解析:
-
A 正确:函数内部定义的变量作用域限于函数内部
-
B 正确:函数外定义的变量是全局变量
-
C 错误:函数内部不能直接修改全局变量,必须用
global声明后才能修改 -
D 正确:
global x声明后可以在函数内修改全局变量x
🔑 知识点:作用域规则
-
函数内可读取全局变量,但修改需要
global声明 -
不用global时,赋值操作会创建同名局部变量
第8题¶
以下代码的运行结果是()。
| 选项 | 内容 |
|---|---|
| A | abc |
| B | bcd ✅ |
| C | bcde |
| D | abcd |
答案
B
📖 解析:
-
切片
[1:4]表示从索引1开始,到索引4之前结束(左闭右开) -
s[1]=\'b\', s[2]=\'c\', s[3]=\'d\' → 结果为
"bcd"
🔑 知识点:字符串切片
-
s[start:end]→ 左闭右开[start, end) -
s[start:end:step]→ 带步长的切片 -
负数索引:
s[-1]表示最后一个字符
第9题¶
下列表达式中,结果为True的是()。
| 选项 | 内容 |
|---|---|
| A | 3 \> 2 \> 1 ✅ |
| B | 3 > 2 > 2 |
| C | 1 and 0 |
| D | not True or False |
答案
A
📖 解析:
-
A 正确:Python支持链式比较,
3 > 2 > 1等价于(3>2) and (2>1)→True and True→True -
B 错误:
3 > 2 > 2→(3>2) and (2>2)→True and False→False -
C 错误:
1 and 0→0(and返回第一个为假的值,或最后一个值) -
D 错误:
not True or False→False or False→False
🔑 知识点:链式比较和逻辑运算
-
Python链式比较:
a > b > c≡(a>b) and (b>c) -
and:全真返回最后一个真值,遇到假则返回该假值 -
or:遇到真则返回该真值,全假返回最后一个假值
第10题¶
下列关于Python字典的说法,错误的是()。
| 选项 | 内容 |
|---|---|
| A | 字典中的键必须是唯一的 |
| B | 字典中的值可以是任意类型 |
| C | 字典是有序的数据结构(Python 3.7+) |
| D | 字典的键可以是列表 ✅ |
答案
D
📖 解析:
-
A 正确:字典键必须唯一,重复键会覆盖旧值
-
B 正确:值可以是任意类型,包括列表、字典等
-
C 正确:Python 3.7+字典保证插入顺序
-
D 错误:字典的键必须是不可变类型,列表是可变的,不能做键
🔑 知识点:字典键的类型要求
-
可做键:int/float/str/tuple/frozenset(不可变类型)
-
不可做键:list/dict/set(可变类型)
-
原因:键需要能计算hash值,可变对象无法hash
第11题¶
表达式 type({}) 的返回值是()。
| 选项 | 内容 |
|---|---|
| A | <class 'set'> |
| B | \<class \'dict\'\> ✅ |
| C | <class 'list'> |
| D | <class 'tuple'> |
答案
B
📖 解析:
-
{}在Python中表示空字典,不是空集合 -
空集合必须用
set()创建 -
type({})→<class 'dict'> -
type(set())→<class 'set'>
📌 记忆要点
{} = 空字典,set() = 空集合
第12题¶
以下代码的运行结果是()。
| 选项 | 内容 |
|---|---|
| A | 3 |
| B | 4 ✅ |
| C | 报错 |
| D | 不确定 |
答案
B
📖 解析:
-
y = x是引用赋值,y和x指向同一个列表对象 -
y.append(4)修改的是这个共享对象 -
因此x也变为
[1,2,3,4],len(x)= 4
🔑 知识点:引用与拷贝
-
y = x→ 浅拷贝(引用),修改y影响x -
y = x.copy()或y = x[:]→ 创建新列表,修改y不影响x -
y = copy.deepcopy(x)→ 深拷贝,递归复制嵌套对象
第13题¶
下列哪个不是Python的关键字?()
| 选项 | 内容 |
|---|---|
| A | elif |
| B | pass |
| C | main ✅ |
| D | del |
答案
C
📖 解析:
-
elif:else if的缩写,条件语句关键字 -
pass:空操作占位符关键字 -
main:不是关键字,Python没有main关键字(C语言才有) -
del:删除变量/元素的关键字
📌 记忆要点
Python用if __name__ == '__main__':而非main关键字
第14题¶
以下代码的运行结果是()。
| 选项 | 内容 |
|---|---|
| A | [1, 2, 3] |
| B | [1, 3, 5] ✅ |
| C | [2, 4] |
| D | [5, 3, 1] |
答案
B
📖 解析:
-
a[::2]等价于a[0:len(a):2] -
从索引0开始,步长为2:取索引0→1, 2→3, 4→5
-
结果:
[1, 3, 5]
🔑 知识点:切片步长
-
s[start:end:step]完整语法 -
::2→ 从头到尾,步长2(隔一个取一个) -
[::-1]→ 反转序列
第15题¶
表达式 'Hello'.replace('l', 'L', 1) 的结果是()。
| 选项 | 内容 |
|---|---|
| A | HeLLo |
| B | HELLO |
| C | HeLlo ✅ |
| D | hello |
答案
C
📖 解析:
-
replace(old, new, count)中count指定替换次数 -
'Hello'.replace('l', 'L', 1)→ 只替换第1个\'l\'为\'L\' -
H-e-l-l-o → H-e-L-l-o →
"HeLlo"
🔑 知识点:replace()方法
-
不指定count:替换所有匹配
-
指定count:只替换前count个
-
返回新字符串,原字符串不变(字符串不可变)
第16题¶
以下关于Python异常处理的说法,正确的是()。
| 选项 | 内容 |
|---|---|
| A | try语句块可以单独使用 |
| B | except子句只能有一个 |
| C | else子句在发生异常时执行 |
| D | finally子句无论是否发生异常都会执行 ✅ |
答案
D
📖 解析:
-
A 错误:
try必须搭配except或finally,不能单独使用 -
B 错误:可以有多个
except子句,分别捕获不同异常 -
C 错误:
else子句在没有发生异常时执行 -
D 正确:
finally无论是否异常都会执行,常用于资源释放
🔑 知识点:异常处理结构
| 子句 | 执行时机 |
|---|---|
try |
始终执行 |
except |
发生异常时 |
else |
无异常时 |
finally |
始终执行 |
第17题¶
表达式 list(range(1, 10, 3)) 的结果是()。
| 选项 | 内容 |
|---|---|
| A | [1, 4, 7] ✅ |
| B | [1, 4, 7, 10] |
| C | [3, 6, 9] |
| D | [1, 3, 6, 9] |
答案
A
📖 解析:
-
range(1, 10, 3)→ 起点1,终点10(不含),步长3 -
生成序列:1, 4, 7(下一个10 ≥ 10,停止)
-
list()转换为列表
🔑 知识点:range()函数
-
range(stop)→ 0到stop-1,步长1 -
range(start, stop)→ start到stop-1,步长1 -
range(start, stop, step)→ 自定义步长 -
range对象是惰性的,不占大量内存
第18题¶
关于Python中的import语句,下列说法错误的是()。
| 选项 | 内容 |
|---|---|
| A | import math 导入整个math模块 |
| B | from math import sqrt 只导入sqrt函数 |
| C | import math as m 给math模块取别名m |
| D | from math import * 只导入__all__列表中指定的内容 ✅ |
答案
D
📖 解析:
-
A 正确:
import math导入模块的所有内容,通过math.xxx访问 -
B 正确:
from math import sqrt只导入sqrt,可直接使用 -
C 正确:
as给模块取别名,简化调用 -
D 错误:
from math import *导入模块中所有公开名称,但如果模块定义了__all__则按__all__导入;若没有__all__则导入所有不以_开头的名称。说\"只\"导入__all__不够准确
📌 记忆要点
import * 不推荐使用,容易命名冲突
第19题¶
以下代码的运行结果是()。
| 选项 | 内容 |
|---|---|
| A | {1, 2, 3, 4} |
| B | {2, 3} ✅ |
| C | {1, 4} |
| D | 报错 |
答案
B
📖 解析:
-
&是集合的交集运算符 -
s1 \& s2 → 两个集合的公共元素 →
{2, 3}
🔑 知识点:集合运算
| 运算符 | 含义 | 方法 |
|---|---|---|
& |
交集 | intersection() |
| |
并集 | union() |
- |
差集 | difference() |
^ |
对称差集 | symmetric_difference() |
第20题¶
执行 print("abc123".isalnum()) 的结果是()。
| 选项 | 内容 |
|---|---|
| A | True ✅ |
| B | False |
| C | abc123 |
| D | 报错 |
答案
A
📖 解析:
-
isalnum()判断字符串是否全部由字母或数字组成 -
"abc123"全部为字母+数字 →True -
注意:
"abc 123".isalnum()→False(含空格) -
类似方法:
isalpha()(全字母)、isdigit()(全数字)
📌 记忆要点
isalnum() = 全是字母或数字,空格/符号都返回False
✅ 二、判断题(每题1分,共14分)¶
第1题¶
Python中,列表和元组的主要区别是列表可变而元组不可变。
答案
✅ 正确
解析: 列表(list)是可变序列,可以增删改元素;元组(tuple)是不可变序列,创建后不能修改。这是两者最核心的区别。
第2题¶
Python中,break语句只能用于循环语句中,不能用于其他地方。
答案
✅ 正确
解析: break只能用于for和while循环中,用于提前终止循环。如果在循环外使用break会报SyntaxError。
第3题¶
在Python中,3 + 4j是合法的复数表示。
答案
✅ 正确
解析: Python支持复数类型,3 + 4j中3是实部,4j是虚部。j或J表示虚数单位。可以用type(3+4j)验证为<class 'complex'>。
第4题¶
print()函数的end参数默认值是换行符\n。
答案
✅ 正确
解析: print()默认end='\n',即每次输出后自动换行。可以通过end=''或end=' '等修改。
第5题¶
字典的items()方法返回的是一个列表。
答案
❌ 错误
解析: Python3中items()返回的是视图对象(dict_items),不是列表。视图对象是动态的,字典变化时视图也变化。可以用list(d.items())转为列表。
第6题¶
continue语句的作用是跳出整个循环。
答案
❌ 错误
解析: continue的作用是跳过当前这一次循环的剩余语句,直接进入下一次循环。跳出整个循环用的是break。
第7题¶
Python中的pass语句什么都不做,只是一个占位符。
答案
✅ 正确
解析: pass是空操作占位语句,用在语法上需要语句但逻辑上暂不需要操作的地方,如空函数体、空类定义等。
第8题¶
range(0) 和 range(0, 0) 都会生成空序列。
答案
✅ 正确
解析: range(0) → 从0到-1(不可能),空序列。range(0, 0) → 从0到-1(不可能),空序列。两者等价。
第9题¶
字符串方法find()如果找不到子串则返回-1。
答案
✅ 正确
解析: find()找不到返回-1,找到返回起始索引。注意:index()找不到则抛出ValueError异常,这是两者的区别。
第10题¶
Python中,== 运算符比较的是两个对象的内存地址。
答案
❌ 错误
解析: == 比较的是值是否相等,is 才比较**内存地址(标识)**是否相同。例如 [1,2] == [1,2] → True,但 [1,2] is [1,2] → False(两个不同对象)。
第11题¶
函数的默认参数值只在函数定义时计算一次。
答案
✅ 正确
解析: 默认参数值在函数定义时计算并存储,不在每次调用时重新计算。这导致可变默认参数(如def f(a=[]))会\"记忆\"上次的修改,是一个常见陷阱。
第12题¶
在Python中,0、0.0、""、[]、()、{} 的布尔值都是False。
答案
❌ 错误
解析: 0、0.0、""、[]、() 的布尔值是False,但{}是空字典,布尔值也是False。所以看似全对……但注意:空集合set()也是False。而None也是False。此题12个值全部为False,答案应为✅正确。
修正:此题答案为✅ 正确,上述所有值的
bool()结果都是False。
第13题¶
使用with open()语句打开文件后,不需要手动调用close()方法。
答案
✅ 正确
解析: with语句是上下文管理器,退出with块时自动调用close(),即使发生异常也会关闭文件。这是推荐的文件操作方式。
第14题¶
sorted()函数会对原列表进行排序并返回None。
答案
❌ 错误
解析: sorted()返回一个新的排序列表,不修改原列表。而list.sort()是对原列表原地排序,返回None。
✏️ 三、程序填空题(每题10分,共30分)¶
第1题:冒泡排序¶
题目: 使用冒泡排序对列表进行升序排列。
| Python | |
|---|---|
✅ 答案
-
begin1:
if lst[j] > lst[j + 1]: -
begin2:
lst[j], lst[j + 1] = lst[j + 1], lst[j]
📖 解析:
-
冒泡排序核心:相邻元素比较,如果前面的比后面大就交换
-
lst[j] > lst[j+1]判断是否需要交换(升序) -
Python支持元组解包交换:
a, b = b, a
🔑 知识点:冒泡排序
-
外层循环控制轮数,内层循环控制每轮比较
-
每轮将最大的元素\"冒泡\"到末尾
-
时间复杂度:O\(n²\)
第2题:统计字符¶
题目: 统计字符串中字母、数字和其他字符的个数。
| Python | |
|---|---|
✅ 答案
-
begin1:
if ch.isalpha(): -
begin2:
elif ch.isdigit():
📖 解析:
-
isalpha()判断字符是否为字母 -
isdigit()判断字符是否为数字 -
都不满足则归入\"其他\"
🔑 知识点:字符串判断方法
| 方法 | 功能 |
|---|---|
isalpha() |
是否全为字母 |
isdigit() |
是否全为数字 |
isalnum() |
是否全为字母或数字 |
isspace() |
是否全为空白字符 |
isupper() |
是否全为大写 |
islower() |
是否全为小写 |
第3题:斐波那契数列¶
题目: 输出斐波那契数列的前n项。
| Python | |
|---|---|
✅ 答案
-
begin1:
while count < n: -
begin2:
a, b = b, a + b
📖 解析:
-
while count < n控制输出n项 -
a, b = b, a + b利用元组解包同时更新a和b -
斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, ...
🔑 知识点:斐波那契数列
-
定义:F\(0\)=0, F\(1\)=1, F\(n\)=F\(n\-1\)+F\(n\-2\)
-
迭代法优于递归法(避免重复计算)
-
Python元组解包实现简洁的变量交换
🔧 四、程序改错题(每题10分,共40分)¶
第1题:回文判断¶
题目: 判断输入的字符串是否为回文串。
✅ 答案
-
错误1:
right = len(s)→right = len(s) - 1 -
错误2:
return "是回文"→return "不是回文" -
错误3:
return "不是回文"→return "是回文"
📖 解析:
-
错误1:
len(s)是字符串长度,但最大索引是len(s)-1,所以right应初始化为len(s)-1 -
错误2:当
s[left] != s[right]时说明不匹配,应返回\"不是回文\" -
错误3:循环正常结束说明所有字符都匹配,应返回\"是回文\"
🔑 知识点:回文判断
-
回文:正读反读相同,如\"abcba\"
-
双指针法:左指针从0开始,右指针从末尾开始
-
另一种方法:
s == s[::-1]
第2题:列表去重¶
题目: 对列表进行去重并保持原顺序。
✅ 答案
-
错误1:
result = {}→result = [] -
错误2:
if item not in result:→ 保持不变(配合列表使用正确) -
错误3:
print(remove_duplicates(original))→print("去重后:", remove_duplicates(original))
📖 解析:
-
错误1:
{}创建的是字典,应用[]创建列表 -
错误2:
not in对列表和字典都可用,配合修正1后逻辑正确 -
错误3:题目要求输出格式为\"去重后: [3, 1, 2, 4, 5]\"
🔑 知识点:去重方法对比
| 方法 | 保持顺序 | 示例 |
|---|---|---|
| 列表遍历 | ✅ | 见本题 |
list(set(lst)) |
❌ | 简单但丢失顺序 |
dict.fromkeys(lst) |
✅ | Python3.7+字典保序 |
第3题:温度转换¶
题目: 将华氏温度转换为摄氏温度(公式:C = \(F \- 32\) / 1.8)。
✅ 答案
-
错误1:
c = f - 32 / 1.8→c = (f - 32) / 1.8 -
错误2:
f = input("输入华氏温度:")→f = float(input("输入华氏温度:")) -
错误3:
print("摄氏温度为:" + celsius)→print("摄氏温度为:" + str(celsius))或print("摄氏温度为:%.1f" % celsius)
📖 解析:
-
错误1:
32 / 1.8会先计算(除法优先级高于减法),导致计算错误,需要加括号 -
错误2:
input()返回字符串,必须转换为数值类型 -
错误3:
celsius是浮点数,不能直接用+拼接字符串
🔑 知识点:运算优先级 \& 类型转换
-
算术优先级:
()\>**\>*/\>+- -
input()始终返回字符串,需用int()或float()转换 -
字符串拼接用
str()转换,或用 f-string /%格式化
第4题:学生成绩管理¶
题目: 定义学生类,包含姓名和成绩,并计算平均成绩。
✅ 答案
-
错误1:
def _init_→def __init__(双下划线) -
错误2:
Student("张三", 85)→ 末尾缺少右括号) -
错误3:
Student.score→s.score(用实例名而非类名)
📖 解析:
-
错误1:构造方法名必须是
__init__(双下划线),_init_(单下划线)不是特殊方法 -
错误2:括号不匹配,
append(和Student(嵌套后缺少一个) -
错误3:
Student.score访问的是类属性,应使用实例s.score
🔑 知识点:类与对象
-
__init__是双下划线,不是单下划线 -
访问实例属性用
实例名.属性名 -
类名访问的是类属性(共享),实例名访问的是实例属性(独有)
💻 五、程序设计题(每题13分,共26分)¶
第1题:猜数字游戏¶
题目: 编写程序实现猜数字游戏:
-
程序随机生成1~100之间的整数
-
用户输入猜测的数字
-
如果猜大了提示\"太大了\",猜小了提示\"太小了\",猜对了提示\"恭喜你猜对了!\"
-
显示用户总共猜了几次
-
输入0可以提前退出游戏
参考答案
📖 解析:
-
random.randint(1, 100)生成1~100的随机整数 -
用
while True实现循环猜测 -
count计数器记录猜测次数 -
break退出循环
🔑 知识点
-
random.randint(a, b)返回[a, b]范围内的随机整数 -
while True+break是常见的循环控制模式 -
输入验证:
int()转换输入
第2题:学生成绩统计¶
题目: 编写程序实现以下功能:
-
输入若干个学生的姓名和成绩,存入字典(姓名为键,成绩为值)
-
输入空行结束输入
-
计算并输出:平均成绩、最高分及对应学生姓名、最低分及对应学生姓名
-
输出成绩从高到低排序的结果
示例输出:
参考答案
📖 解析:
-
字典存储姓名-成绩对,键唯一保证每人一条记录
-
max(d, key=d.get)按值找最大键,返回姓名 -
sorted(d.items(), key=lambda x: x[1], reverse=True)按值降序排序 -
join()格式化输出排序结果
🔑 知识点
-
max()/min()的key参数指定比较规则 -
sorted()的key参数用lambda自定义排序 -
dict.items()返回键值对视图,可迭代 -
sum()快速求和,len()计数
知识点覆盖总结
| 题型 | 知识点 |
|---|---|
| 单选1-5 | 变量命名、字符串特性、len()、列表可变性、函数返回值 |
| 单选6-10 | 默认参数、作用域、切片、链式比较、字典键类型 |
| 单选11-15 | type()、引用拷贝、关键字、切片步长、replace() |
| 单选16-20 | 异常处理、range()、import、集合运算、字符串判断方法 |
| 判断1-7 | 列表元组区别、break、复数、print参数、items()、continue、pass |
| 判断8-14 | range空序列、find()、==vs is、默认参数、布尔值、with、sorted() |
| 填空1-3 | 冒泡排序、字符分类、斐波那契 |
| 改错1-4 | 回文判断、列表去重、温度转换、类定义 |
| 编程1-2 | random模块猜数字、字典成绩统计 |