这份笔记涵盖变量引用、可变对象、闭包、面向对象(MRO、类属性)、装饰器、生成器、上下文管理器等高频考点,每题均配有完整选项与详细解析。
第一阶段:基础语法与数据类型(第 1 - 10 题)
第 1 题(变量赋值与引用)
题目:
a = [1, 2, 3]b = ab.append(4)a = [5, 6]print(b)
选项:
•A. [1, 2, 3, 4]•B. [1, 2, 3, 4, 5, 6]•C. [5, 6]•D. [1, 2, 3]
参考答案:A
解析:
1.b = a 让 b 指向 a 的同一个列表对象。2.b.append(4) 修改了该共享对象,变为 [1, 2, 3, 4]。3.a = [5, 6] 是重新赋值,让 a 指向新列表,b 依然指向原列表。4.核心:= 是改变标签指向,append 是修改对象本身。
第 2 题(条件判断与逻辑运算符)
题目:
x = 5y = 10if x > 3 and y < 15: print("A")elif x == 5 or y > 20: print("B")else: print("C")
选项:
•A. A•B. B•C. C•D. 报错(语法错误)
参考答案:A
解析: x > 3(True)且 y < 15(True),两个条件同时成立,直接进入第一个 if 分支,后续 elif / else 不再执行。
第 3 题(循环控制与 continue)
题目:
count = 0for i in range(3): count += i if i == 1: continue count += 1print(count)
选项:
•A. 3•B. 4•C. 5•D. 6
参考答案:C
解析:
•i=0:count=0,不跳过,count+=1 → 1•i=1:count+=1 → 2,触发 continue,跳过后面的 count+=1 → 保持 2•i=2:count+=2 → 4,不跳过,count+=1 → 5•核心:continue 只跳过本次循环剩余的代码。
第 4 题(函数作用域与可变对象)
题目:
def add_item(lst): lst = lst + [4] return lstmy_list = [1, 2, 3]new_list = add_item(my_list)print(my_list)print(new_list)
选项:
•A. [1, 2, 3, 4] 和 [1, 2, 3, 4]•B. [1, 2, 3] 和 [1, 2, 3, 4]•C. [1, 2, 3, 4] 和 [1, 2, 3]•D. [1, 2, 3] 和 [1, 2, 3]
参考答案:B
解析:
•lst + [4] 会创建一个新列表,并将局部变量 lst 指向新对象。•外部的 my_list 依然指向原来的 [1, 2, 3],纹丝未动。•核心:+ 生成新对象,append 修改原对象。
第 5 题(字符串与切片操作)
题目:
s = "Python"result = s[-1:-4:-1]print(result)
选项:
•A. "noh"•B. "no"•C. "hty"•D. "nhoP"
参考答案:A
解析:
•负索引:n(-1), o(-2), h(-3), t(-4)。•-1 到 -4(不含),步长 -1 向左取,得到 n、o、h。
第 6 题(逻辑运算符与短路求值)
题目:
a = 10b = 0c = 20result = a and b or cprint(result)
选项:
•A. 10•B. 0•C. 20•D. True
参考答案:C
解析:
•and 优先级高于 or,先算 a and b:10 为真,返回 b(0)。•表达式变为 0 or c:0 为假,返回 c(20)。•核心:and / or 返回最后评估的操作数本身,而非布尔值。
第 7 题(字典与 get() 的默认值)
题目:
d = {'a': 1, 'b': 2}value = d.get('c', 3)d['a'] = d.get('a', 0) + 1print(d)print(value)
选项:
•A. {'a': 1, 'b': 2} 和 3•B. {'a': 2, 'b': 2, 'c': 3} 和 3•C. {'a': 2, 'b': 2} 和 3•D. {'a': 1, 'b': 2} 和 1
参考答案:C
解析:
•d.get('c', 3) 只读取,返回 3,但不会在原字典中插入 'c': 3。•d['a'] 更新为 1+1=2。•核心:get() 不修改原字典。
第 8 题(列表推导式与条件过滤)
题目:
nums = [1, 2, 3, 4, 5]result = [x if x % 2 == 0 else -x for x in nums if x > 2]print(result)
选项:
•A. [-1, -2, -3, -4, -5]•B. [-3, 4, -5]•C. [2, 4]•D. [-2, -4]
参考答案:B
解析:
•右边的 if x > 2 是过滤条件,只取 [3, 4, 5]。•左边的 if-else 是条件表达式:偶数取自身,奇数取负数。
第 9 题(函数默认参数的陷阱)
题目:
def add_item(item, lst=[]): lst.append(item) return lstprint(add_item(1))print(add_item(2))
选项:
•A. [1] 和 [2]•B. [1] 和 [1, 2]•C. [1] 和 [1]•D. 报错(语法错误)
参考答案:B
解析:
•默认参数 lst=[] 在函数定义时创建一次,所有调用共享同一个列表对象。•第二次调用时,列表里已有 1,追加 2 后变为 [1, 2]。•经典陷阱:不要用可变对象作为函数默认参数。
第 10 题(综合实战)
题目:
data = "a1b2c3"result = {}for char in data: if char.isdigit(): key = data[data.index(char) - 1] result[key] = result.get(key, 0) + int(char)print(result)
选项:
•A. {'a': 1, 'b': 2, 'c': 3}•B. {'1': 1, '2': 2, '3': 3}•C. {'a': 3, 'b': 2, 'c': 1}•D. {'c': 3, 'b': 2, 'a': 1}
参考答案:A
解析:
•遍历数字字符 1、2、3。•取前一个字符作为键(a、b、c),累加数字值。•本题数字唯一,未暴露 index() 重复查找的隐患。
第二阶段:面向对象与核心进阶(第 11 - 15 题)
第 11 题(类属性 vs 实例属性)
题目:
class Dog: tricks = [] def __init__(self, name): self.name = name def add_trick(self, trick): self.tricks.append(trick)d1 = Dog("Buddy")d2 = Dog("Charlie")d1.add_trick("roll over")d2.add_trick("play dead")print(d1.tricks)print(d2.tricks)
选项:
•A. ['roll over'] 和 ['play dead']•B. ['roll over', 'play dead'] 和 ['roll over', 'play dead']•C. ['roll over'] 和 ['roll over', 'play dead']•D. [] 和 []
参考答案:B
解析:
•tricks 是类属性,所有实例共享同一份列表。•append 是修改对象本身,未创建实例属性,因此所有实例看到的结果一致。
第 12 题(继承与 super() 的 MRO 顺序)
题目:
class A: def show(self): print("A", end=" ")class B(A): def show(self): print("B", end=" ") super().show()class C(A): def show(self): print("C", end=" ") super().show()class D(B, C): def show(self): print("D", end=" ") super().show()d = D()d.show()
选项:
•A. D B C A•B. D B A C A•C. D B C•D. D C B A
参考答案:A
解析:
•D.__mro__ 顺序为 (D, B, C, A, object)。•super() 按 MRO 顺序调用下一个类的方法,而不是简单的“父类”。•流程:D → B → C → A。
第 13 题(异常处理与 finally 的执行时机)
题目:
def test(): try: return 1 except: return 2 finally: print("finally", end=" ")print(test())
选项:
•A. 1•B. finally 1•C. 1 finally•D. finally 2
参考答案:B
解析:
•return 1 先计算并暂存返回值。•执行 finally 块(打印 finally),然后返回暂存的 1。•核心:finally 在 return 之前执行,但通常不覆盖返回值(除非 finally 里有 return)。
第 14 题(闭包与变量捕获)
题目:
funcs = []for i in range(3): def func(): return i * i funcs.append(func)for f in funcs: print(f(), end=" ")
选项:
•A. 0 1 4•B. 4 4 4•C. 0 0 0•D. 报错(变量未定义)
参考答案:B
解析:
•闭包捕获的是变量 i 的引用,而非值。•循环结束后 i 变为 2,三个函数调用时都取最终的 2,平方得 4。
第 15 题(装饰器基础)
题目:
def my_decorator(func): def wrapper(): print("Before", end=" ") func() print("After", end=" ") return wrapper@my_decoratordef say_hello(): print("Hello", end=" ")say_hello()
选项:
•A. Hello•B. Before After•C. Before Hello After•D. 报错(语法错误)
参考答案:C
解析:
•@my_decorator 等价于 say_hello = my_decorator(say_hello)。•调用时实际执行的是 wrapper,按顺序打印 Before、Hello、After。
第三阶段:高级特性(第 16 - 20 题)
第 16 题(生成器与 yield 流程)
题目:
def my_gen(): for i in range(2): yield i print("A", end=" ")g = my_gen()print(next(g), end=" ")print(next(g), end=" ")
选项:
•A. 0 1•B. 0 A 1•C. 0 A 1 A•D. A 0 A 1
参考答案:B
解析:
•第一次 next:执行到 yield 0 暂停,打印 0。•第二次 next:从暂停处恢复,先打印 A,再循环到 yield 1 暂停,打印 1。
第 17 题(@property 与 Setter)
题目:
class Person: def __init__(self, age): self._age = age @property def age(self): return self._age @age.setter def age(self, value): if value < 0: self._age = 0 else: self._age = valuep = Person(20)p.age = -5print(p.age)
选项:
•A. -5•B. 20•C. 0•D. 报错(属性不能赋值)
参考答案:C
解析:
•p.age = -5 触发 setter,负数被转为 0 存入 _age。•getter 返回 _age,最终输出 0。
第 18 题(@classmethod 与 @staticmethod)
题目:
class Math: @staticmethod def add(a, b): return a + b @classmethod def multiply(cls, a, b): return a * bm = Math()print(m.add(2, 3), end=" ")print(Math.multiply(2, 3))
选项:
•A. 5 6•B. 2 3 6•C. 5 5•D. 报错(multiply 缺少参数)
参考答案:A
解析:
•静态方法不传 self/cls,接收 2,3 返回 5。•类方法自动接收 cls,但调用时只需传入业务参数 2,3,返回 6。
第 19 题(上下文管理器与异常抑制)
题目:
class MyContext: def __enter__(self): print("Enter", end=" ") return self def __exit__(self, exc_type, exc_val, exc_tb): print("Exit", end=" ") return Truewith MyContext() as obj: print("Inside", end=" ") raise ValueError("Oops")
选项:
•A. Enter Inside•B. Enter Inside Exit•C. Enter Exit Inside•D. 报错(异常未被捕获)
参考答案:B
解析:
•执行顺序:__enter__ → 代码块 → 异常触发 → __exit__ 依然执行。•__exit__ 返回 True,表示异常已被处理,不会向上抛出,程序正常结束。
第 20 题(参数解包 **)
题目:
def func(a, b, c): return a + b + cdata = {'a': 1, 'b': 2, 'c': 3}result = func(**data)print(result)
选项:
•A. 6•B. 1 2 3•C. 报错(字典解包失败)•D. 报错(参数顺序错误)
参考答案:A
解析:
•**data 将字典解包为关键字参数,等价于 func(a=1, b=2, c=3),求和得 6。
好了,到这里就结束了,你做对了几道呢?