当前位置:首页>python>Python 核心语法与进阶特性 · 20 题

Python 核心语法与进阶特性 · 20 题

  • 2026-09-10 03:40:02
Python 核心语法与进阶特性 · 20 题

这份笔记涵盖变量引用、可变对象、闭包、面向对象(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。


好了,到这里就结束了,你做对了几道呢?

最新文章

随机文章