系统性全面的讲解python语法,以及列出详细的步骤和分析和包含内容和要点和案例
下午3:52
下面是一份系统性、全面的 Python 语法讲解纲要与详解,涵盖核心语法、关键概念、常见模式、注意要点,并配有示例与练习建议。内容按照“从零到进阶”的学习路径组织,适合自学与查阅。
目录
- 0. 学习准备与环境
- 基础语法
- 数据类型与数据结构
- 运算符与表达式
- 流程控制
- 函数与作用域
- 模块、包与标准库
- 面向对象编程(OOP)
- 异常与错误处理
- 迭代器、生成器与可迭代协议
- 文件与上下文管理器
- 装饰器与闭包
- 注解与类型提示
- 常用内置函数与惯用法
- 并发与异步
- 测试与调试
- 虚拟环境与依赖管理
- 性能与内存
- 实用案例与练习
——
- 学习准备与环境
- 版本:推荐 Python 3.10+(模式匹配 match 支持更好,类型提示更强)。
- 安装:从 python.org 或使用包管理器(Windows: winget/choco;macOS: brew;Linux: apt/yum/pacman)。
- 运行方式:
- 交互式 REPL:python 或 ipython
- 脚本:python your_script.py
- 笔记本:Jupyter/VS Code + Python 插件
- 基础工具:
- 代码格式化:black
- 静态检查:ruff/flake8 + mypy/pyright
- 虚拟环境:venv/conda/uv
——
- 基础语法
- 缩进与代码块
- 使用 4 空格缩进;缩进决定代码块结构(无花括号)。
- 混用 Tab/空格会报错;建议统一空格。
- 标识符与命名
- 变量、函数:snake_case;类名:PascalCase;常量:UPPER_SNAKE_CASE。
- 合法字符:字母、数字、下划线,不能以数字开头,大小写敏感。
- 语句与表达式
- 语句以换行结束;多语句同一行用分号不推荐。
- 行续接:括号内自动续行;必要时用反斜杠 \。
- 注释
- 单行:#;文档字符串:"""三引号"""。
- 打印与输入
- print("hello", name, sep=", ", end="!\n")
- input() 返回字符串,需要转换类型。
示例:
name = input("Your name: ")
print(f"Hello, {name}!")
——
- 数据类型与数据结构
- 基本类型
- int(任意精度),float(双精度),bool(True/False),None
- 字符串 str:不可变、支持切片与编码解码
- 容器类型
- list 可变有序;tuple 不可变有序;range 惰性序列
- dict 映射;set/ frozenset 集合
- 不变性与可变性
- 不可变:int/float/bool/str/tuple/frozenset
- 可变:list/dict/set
- 切片与步长
- s[start:stop:step];省略则取默认;负步长倒序
- 拷贝
- 浅拷贝:list(x)、x[:]、copy.copy
- 深拷贝:copy.deepcopy
示例与要点:
s = "abcdef"
print(s[1:4]) # bcd
print(s[::-1]) # 倒序
nums = [1, 2, 3]
nums.append(4)
t = (1, [2, 3]) # tuple 内部含可变对象时整体不可变但内部可变
d = {"a": 1, "b": 2}
d.get("c", 0) # 默认值
d.setdefault("k", []).append(1)
——
- 运算符与表达式
- 算术:+ - * / // % **;注意 / 返回 float;// 地板除。
- 比较:== != < <= > >=;链式比较:0 < x < 10
- 逻辑:and or not(短路)
- 赋值:=,增强赋值:+=、-= 等;海象运算符 :=(表达式内赋值)
- 成员与身份:in / not in;is / is not(对象身份,非值相等)
- 位运算:& | ^ ~ << >>
- 优先级:合理使用括号,避免误解。
示例:
if (n := len(items)) > 0:
print(n)
——
- 流程控制
- 条件分支
- if/elif/else;三元表达式 x if cond else y
- 循环
- for item in iterable: ...
- while cond: ...
- break/continue/else(循环无 break 时执行 else)
- 枚举与并行迭代
- enumerate(iterable, start=0)
- zip(a, b, strict=False)
示例:
for i, x in enumerate([10, 20, 30], start=1):
print(i, x)
primes = []
n = 2
while n < 20:
for p in primes:
if n % p == 0:
break
else:
primes.append(n)
n += 1
——
- 函数与作用域
- 定义
- def name(params) -> return_type: ...
- 参数类型:位置参数、关键字参数、默认值、可变参数 *args、**kwargs
- 仅限关键字参数:def f(a, *, b)
- 仅限位置参数:def f(a, /, b)
- 返回值
- return 可返回多个值(本质 tuple)
- 作用域 LEGB
- Local、Enclosing、Global、Built-in;读取自由变量按链查找
- 修改外层需 nonlocal 或 global
- 可变默认参数陷阱
- 默认参数只在函数定义时评估
示例与要点:
def append_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
def area(radius: float, *, pi: float = 3.14159) -> float:
return pi * radius ** 2
——
- 模块、包与标准库
- 模块:.py 文件;包:含 init.py 的目录(3.3+ 隐式命名空间包也可无 init)
- 导入
- import m;from m import x as y;from pkg import sub
- 相对导入:from . import helper
- 常用标准库
- sys/os/pathlib;datetime/time;math/statistics
- collections(Counter、deque、defaultdict、namedtuple)
- itertools/functools;re;json/pickle
- argparse;logging;subprocess;uuid
- typing(类型提示)
- 脚本入口
- if name == "main": main()
示例:
from collections import Counter
print(Counter("mississippi"))
——
- 面向对象编程(OOP)
- 类与对象
- class Name: def init(self, ...): ...
- 实例属性/类属性;方法(实例方法、类方法 @classmethod、静态方法 @staticmethod)
- 数据类
- from dataclasses import dataclass, field
- 自动生成 init/repr/eq 等
- 继承与多态
- class B(A): override 方法;super() 调用父类
- 封装与属性
- 属性访问控制:约定 _private;name mangling:__attr
- @property 定义只读/计算属性
- 特殊方法
- str/repr/len/iter/getitem/enter/exit/call 等
- 协议与抽象基类(ABC)
- from abc import ABC, abstractmethod
示例:
from dataclasses import dataclass
@dataclass(frozen=True)
class Point:
x: float
y: float
class Vector:
def init(self, x, y): self.x, self.y = x, y
def add(self, other): return Vector(self.x + other.x, self.y + other.y)
def repr(self): return f"Vector({self.x}, {self.y})"
——
- 异常与错误处理
- try/except/else/finally;多 except;异常链 raise ... from ...
- 常见异常:ValueError、TypeError、KeyError、IndexError、IOError、ZeroDivisionError
- 自定义异常:继承 Exception
- 上下文保证释放资源:try/finally 或 with
示例:
try:
x = int(input("num: "))
except ValueError as e:
print("请输入整数:", e)
else:
print("OK")
finally:
print("done")
——
- 迭代器、生成器与可迭代协议
- 可迭代对象需实现 iter 返回迭代器;迭代器实现 iter 与 next
- 生成器函数:含 yield;生成器表达式:(x*x for x in range(10))
- send/throw/close 高级用法;yield from 代理子生成器
- 惰性与内存友好:适合大数据流
示例:
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
for x in fib():
if x > 100: break
print(x)
——
- 文件与上下文管理器
- with open(path, mode, encoding="utf-8") as f: 安全读写
- 文本/二进制模式:r/w/a/x + b
- 自定义上下文管理器:实现 enter/exit 或使用 contextlib.contextmanager
示例:
from contextlib import contextmanager
@contextmanager
def temp_change_dir(p):
import os
old = os.getcwd()
os.chdir(p)
try:
yield
finally:
os.chdir(old)
——
- 装饰器与闭包
- 闭包:内部函数捕获自由变量
- 装饰器:接收函数返回新函数;保留元数据用 functools.wraps
- 常见场景:缓存 lru_cache、鉴权、日志、重试
示例:
from functools import wraps, lru_cache
def log_calls(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
print(f"calling {fn.name}")
return fn(*args, **kwargs)
return wrapper
@log_calls
@lru_cache(maxsize=None)
def fib(n: int) -> int:
return n if n < 2 else fib(n-1) + fib(n-2)
——
- 注解与类型提示
- 基础:x: int;def f(x: int) -> str:
- 可选与联合:Optional[int] 或 int | None(3.10+)
- 泛型:list[int]、dict[str, float]、TypeVar、Generic
- 协议:typing.Protocol 描述结构化类型
- 静态检查:mypy/pyright;运行时不强制
示例:
from typing import Iterable, TypeVar
T = TypeVar("T")
def first(it: Iterable[T]) -> T | None:
for x in it:
return x
return None
——
- 常用内置函数与惯用法
- 列表生成式/字典生成式/集合生成式
- [x*x for x in xs if x % 2 == 0]
- {k: v for k, v in pairs if cond}
- any/all/sum/min/max/sorted/reversed
- map/filter,但更推荐生成式与内置
- 解包:a, *rest, b = seq;字典合并:{**a, **b} 或 a | b
- 上下划线惯例:
- tmp 表示内部使用;变量名尾随下划线避免关键字冲突,如 class。
示例:
records = [{"name":"A","age":20},{"name":"B","age":18}]
adults = [r for r in records if r["age"] >= 18]
by_age = sorted(records, key=lambda r: r["age"])
——
- 并发与异步
- 线程 threading
- I/O 密集型可提升吞吐;需注意 GIL 对 CPU 密集型限制
- 进程 multiprocessing
- CPU 密集型使用多进程;注意可序列化与启动方式(spawn/fork)
- 异步 asyncio
- async def、await;事件循环;Task 并发 gather
- 并发工具
- concurrent.futures(ThreadPoolExecutor、ProcessPoolExecutor)
- 队列 queue/asyncio.Queue;同步原语 Lock/Event/Semaphore
示例(异步):
import asyncio
import aiohttp # 第三方库示例
async def fetch(session, url):
async with session.get(url) as r:
return await r.text()
async def main(urls):
async with aiohttp.ClientSession() as s:
texts = await asyncio.gather(*(fetch(s, u) for u in urls))
return texts
asyncio.run(main(urls))
——
- 测试与调试
- 断言:assert condition, "message"
- 调试:pdb / ipdb / VS Code 调试器;print 调试要谨慎
- 单元测试:pytest(推荐)/unittest
- 命名:test_*.py;fixture;参数化;断言
- 覆盖率:coverage.py
- 日志:logging 基本用法与级别(DEBUG/INFO/WARNING/ERROR/CRITICAL)
示例(pytest):
import pytest
def add(a, b): return a + b
@pytest.mark.parametrize("a,b,ans", [(1,2,3),(0,0,0)])
def test_add(a, b, ans):
assert add(a, b) == ans
——
- 虚拟环境与依赖管理
- venv
- python -m venv .venv;激活:Windows .venv\Scripts\activate,Unix source .venv/bin/activate
- pip install -U pip setuptools wheel
- 依赖锁定
- requirements.txt 或 pip-tools;poetry/pdm;uv/pixi 等新工具
- 包发布
- pyproject.toml + build + twine
——
- 性能与内存
- 算法优先:时间复杂度与数据结构选择
- 性能分析:timeit、cProfile、line_profiler
- 内存:sys.getsizeof、tracemalloc;生成器替代列表
- C 扩展与向量化:numpy、numba、cython
- I/O:批量读写、缓冲、异步 I/O
示例:
import timeit
print(timeit.timeit("sum(range(10_000))", number=1000))
——
- 实用案例与练习
- 案例1:日志分析(文件读写+正则+Counter)
import re
from collections import Counter
from pathlib import Path
def top_ips(logfile: str, k: int = 10):
p = re.compile(r"^(\d+.\d+.\d+.\d+)")
cnt = Counter()
with open(logfile, encoding="utf-8", errors="ignore") as f:
for line in f:
m = p.match(line)
if m: cnt[m.group(1)] += 1
return cnt.most_common(k)
print(top_ips("access.log"))
- 案例2:配置读取(json/yaml + dataclass + 校验)
from dataclasses import dataclass
from typing import Optional
import json
@dataclass
class AppConfig:
host: str
port: int
debug: bool = False
token: Optional[str] = None
def load_config(path: str) -> AppConfig:
data = json.loads(Path(path).read_text(encoding="utf-8"))
return AppConfig(**data)
cfg = load_config("config.json")
- 案例3:异步抓取(asyncio + 限速)
import asyncio
import aiohttp
from asyncio import Semaphore
async def bounded_fetch(session, url, sem):
async with sem:
async with session.get(url, timeout=10) as r:
return url, r.status
async def main(urls, limit=5):
sem = Semaphore(limit)
async with aiohttp.ClientSession() as s:
tasks = [bounded_fetch(s, u, sem) for u in urls]
return await asyncio.gather(*tasks)
asyncio.run(main(urls))
- 案例4:数据处理管道(生成器管道)
from pathlib import Path
def read_lines(path):
with open(path, encoding="utf-8") as f:
for line in f:
yield line.strip()
def filter_nonempty(lines):
for line in lines:
if line: yield line
def to_ints(lines):
for line in lines:
try: yield int(line)
except ValueError: continue
def pipeline(path):
return to_ints(filter_nonempty(read_lines(path)))
total = sum(x for x in pipeline("numbers.txt"))
- 练习建议
- 基础:实现 FizzBuzz、回文判断、文件去重
- 数据结构:实现 LRU 缓存、并查集、堆
- OOP:实现一个简单的 ORM 模拟(Model.save/query)
- 并发:对比同步/线程/异步爬取性能
- 工具:做一个 CLI 工具(argparse + logging + 单元测试)
——
易错点与最佳实践速记
- 可变默认参数用 None 替代
- 字符串拼接优先 join 或 f-string;大量拼接用 io.StringIO
- 捕获异常尽量精确到具体类型,避免裸 except
- 迭代修改列表请使用新列表或从后向前
- 使用 pathlib 代替 os.path,with 语句管理资源
- 类型提示提升可读性与 IDE 体验,但不强制运行时类型
- 复杂条件提取为具名变量或函数,提升可读性
- 优先使用标准库与内置函数,少造轮子
- 写可测试的代码,主逻辑与 I/O 分离
如果你希望,我可以:
- 根据你的背景定制学习路线与练习清单
- 把每一章展开成讲义+习题
- 结合具体项目目标(如数据分析/后端/自动化/爬虫)给出专项语法与案例集

5931

被折叠的 条评论
为什么被折叠?



