logo

Python核心语法与常用代码自测清单

作者:Nicky2026.11.07 01:52浏览量:0

简介:本文整理了一套Python核心语法与常用代码自测清单,涵盖数据类型、流程控制、函数、面向对象、文件操作、异常处理、常用标准库与并发等关键知识点。每部分配有示例代码与要点解析,帮助读者快速定位薄弱环节,夯实基础并提升工程实践能力。

Python核心语法与常用代码自测清单

Python 以简洁、易读和强大的生态著称,但“会用”和“用得好”之间往往隔着大量细节。很多开发者能写出可运行的代码,却在边界条件、类型行为、作用域规则、并发模型等地方反复踩坑。本文整理了一套覆盖核心语法与常用实践的代码自测清单,每个知识点都配有示例与要点解析。你可以把它当作一次系统性的“语法体检”,也可以作为面试前的快速复习材料。

一、数据类型与运算:别在小地方翻车

1. 可变类型与不可变类型

Python 中一切皆对象,但对象分可变与不可变。不可变类型包括 int、float、str、tuple、frozenset;可变类型包括 list、dict、set、自定义对象。

  1. a = [1, 2, 3]
  2. b = a
  3. b.append(4)
  4. print(a) # [1, 2, 3, 4]
  5. x = "hello"
  6. y = x
  7. y += " world"
  8. print(x) # hello

要点:赋值传递的是对象引用。对可变对象的“修改”会影响所有引用方;对不可变对象的“修改”实际是创建新对象。函数默认参数使用可变对象是经典陷阱:

  1. def add_item(item, bucket=[]):
  2. bucket.append(item)
  3. return bucket
  4. print(add_item(1)) # [1]
  5. print(add_item(2)) # [1, 2],而非 [2]

正确做法是使用 None 作为默认值,在函数体内初始化。

2. 深浅拷贝

  1. import copy
  2. origin = [[1, 2], [3, 4]]
  3. shallow = copy.copy(origin)
  4. deep = copy.deepcopy(origin)
  5. shallow[0].append(99)
  6. print(origin) # [[1, 2, 99], [3, 4]]
  7. print(deep) # [[1, 2], [3, 4]]

要点:浅拷贝只复制最外层容器,内部嵌套对象仍共享引用;深拷贝递归复制所有层级。处理嵌套结构时优先考虑深拷贝,但要注意循环引用与性能开销。

3. 数值与精度

  1. print(0.1 + 0.2 == 0.3) # False
  2. from decimal import Decimal
  3. print(Decimal("0.1") + Decimal("0.2") == Decimal("0.3")) # True

要点:浮点数遵循二进制浮点表示,涉及金额、精确比较时应使用 decimal 模块或整数运算。

二、流程控制与推导式

1. for-else 与 while-else

  1. for i in range(5):
  2. if i == 10:
  3. break
  4. else:
  5. print("未触发 break") # 会执行

要点:else 块在循环正常结束(未 break)时执行,常用于“查找失败”的兜底逻辑。

2. 推导式的可读性边界

  1. matrix = [[1, 2], [3, 4]]
  2. flat = [n for row in matrix for n in row]
  3. squares = {x: x * x for x in range(5)}
  4. evens = {x for x in range(10) if x % 2 == 0}

要点:推导式适合简单映射与过滤。嵌套超过两层或条件复杂时,应改回普通循环,避免可读性下降。

三、函数与作用域

1. 位置参数、关键字参数与仅关键字参数

  1. def func(a, b, /, c, *, d):
  2. return a + b + c + d
  3. func(1, 2, 3, d=4) # 正确
  4. func(1, 2, c=3, d=4) # 正确
  5. func(a=1, b=2, c=3, d=4) # 错误,a、b 为仅位置参数

要点:/ 之前的参数只能按位置传递,* 之后的参数只能按关键字传递。合理使用可以提升接口的清晰度与兼容性。

2. 闭包与 nonlocal

  1. def counter():
  2. count = 0
  3. def inner():
  4. nonlocal count
  5. count += 1
  6. return count
  7. return inner
  8. c = counter()
  9. print(c(), c(), c()) # 1 2 3

要点:闭包捕获的是变量本身而非值,nonlocal 用于在内部函数中修改外层函数变量。若只需读取,可省略声明。

3. 装饰器

  1. import functools
  2. def log(func):
  3. @functools.wraps(func)
  4. def wrapper(*args, **kwargs):
  5. print(f"调用 {func.__name__}")
  6. return func(*args, **kwargs)
  7. return wrapper
  8. @log
  9. def greet(name):
  10. return f"Hello, {name}"

要点:装饰器本质是高阶函数,用于横切关注点(日志、缓存、鉴权、重试)。务必使用 functools.wraps 保留原函数元信息。

四、面向对象:从语法到设计

1. 类属性与实例属性

  1. class User:
  2. category = "person"
  3. def __init__(self, name):
  4. self.name = name
  5. u1 = User("A")
  6. u2 = User("B")
  7. u1.category = "vip"
  8. print(User.category, u2.category) # person person

要点:类属性被所有实例共享;通过实例赋值会在实例上创建同名属性,遮蔽类属性。修改共享状态时应通过类名操作。

2. 魔术方法

  1. class Vector:
  2. def __init__(self, x, y):
  3. self.x, self.y = x, y
  4. def __add__(self, other):
  5. return Vector(self.x + other.x, self.y + other.y)
  6. def __repr__(self):
  7. return f"Vector({self.x}, {self.y})"
  8. def __eq__(self, other):
  9. return (self.x, self.y) == (other.x, other.y)

要点:__repr__ 面向开发者,__str__ 面向用户;实现 __eq__ 时通常也要考虑 __hash__ 的一致性。

3. 继承与 MRO

  1. class A:
  2. def hello(self):
  3. print("A")
  4. class B(A):
  5. def hello(self):
  6. print("B")
  7. super().hello()
  8. B().hello() # B A

要点:super() 按 MRO 顺序调用下一个类的方法,而非简单调用父类。多重继承时应理解 C3 线性化规则,避免菱形继承带来的意外行为。

五、文件、异常与上下文管理

1. 上下文管理器

  1. with open("data.txt", "w", encoding="utf-8") as f:
  2. f.write("hello")

要点:with 保证资源在异常情况下也能正确释放。自定义上下文管理器可实现 __enter__ 与 __exit__,或使用 contextlib.contextmanager 装饰生成器。

2. 异常处理原则

  1. try:
  2. value = int("abc")
  3. except ValueError as e:
  4. print(f"转换失败: {e}")
  5. else:
  6. print("成功")
  7. finally:
  8. print("清理")

要点:捕获具体异常而非裸 except;避免用异常控制正常流程;else 在无异常时执行,finally 始终执行。

六、常用标准库与并发模型

1. 常用标准库速览

  • collections:defaultdict、Counter、deque、namedtuple
  • itertools:chain、groupby、product、islice
  • functools:lru_cache、partial、reduce
  • pathlib:面向对象的路径操作
  • json / csv / sqlite3:常见数据交换与本地存储
  1. from collections import Counter
  2. print(Counter("abracadabra").most_common(2))

2. 并发与并行

  1. from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
  2. def task(n):
  3. return n * n
  4. with ThreadPoolExecutor(max_workers=4) as ex:
  5. print(list(ex.map(task, range(5))))

要点:I/O 密集型任务适合多线程或异步 I/O;CPU 密集型任务应使用多进程以绕过全局解释器锁。异步编程使用 async / await,适合高并发网络场景。

七、自测建议与学习路径

  1. 按模块自测:逐个模块写出示例并运行,观察输出是否符合预期。
  2. 制造边界:空列表、None、超大数值、循环引用、异常路径都要覆盖。
  3. 阅读源码:标准库实现是极佳的学习材料,理解其设计取舍。
  4. 工程化实践:类型注解、单元测试、日志、代码格式化与静态检查应尽早纳入日常。

Python 的深度不在于语法复杂度,而在于对对象模型、作用域、并发与生态的准确理解。把上述清单逐条跑通、改错、再解释清楚,你对 Python 的掌握就会从“能写”进阶到“写得对、写得稳”。

发表评论

活动