一、数据类型与可变性,一切bug的源头
字符串、列表、元组、字典、集合,各有各的脾气。最要命的是可变与不可变的区别。你把列表当参数传给函数,函数里改了它,外面也跟着变——这不是bug,是你没搞懂引用传递。默认参数千万别用可变对象,那是Python最经典的坑。def f(a=[])这种写法,你调用一百次,那个列表会累积一百次的结果。搞懂深浅拷贝和可变性,你的代码能少一半莫名其妙的错误。
二、推导式与生成器,优雅与性能兼得
列表推导式让代码短一半,读起来像英语句子。但数据量大时,列表推导式会一次性把所有结果塞进内存,生成器表达式则按需产出。能用生成器就别用列表,内存省下来的都是真金白银。处理一个G的文件,生成器逐行读,内存稳如泰山;列表一次性吞,机器直接卡死。yield这个关键字,是你从新手到熟手的第一个门槛。
三、装饰器与闭包,函数也是对象
Python里函数是一等公民,能赋值、能传参、能返回。装饰器就是拿函数当参数、返回新函数的高阶玩法。日志、计时、权限校验、缓存,都用它。不懂闭包,装饰器就是天书;懂了闭包,装饰器就是你的瑞士军刀。functools.wraps别忘了加,否则原函数的元信息全丢了。这一关过了,你才算真正理解了Python的函数式基因。
四、面向对象与魔术方法
类不是把函数塞进class就完事。__init__、__str__、__repr__、__eq__、__hash__,这些魔术方法决定你的对象怎么打印、怎么比较、能不能当字典的key。不写__repr__,调试时你看到的是一串内存地址;写了,你看到的是人话。继承、多态、MRO方法解析顺序,搞懂了才能设计出干净的类结构。django、pytest这些框架,底层全是面向对象。
五、异常处理与上下文管理器
try/except不是让你把所有异常都吞掉。捕获具体异常,别用裸的except:,那等于把火警器拆了。自定义异常让错误语义清晰。with语句背后是上下文管理器,__enter__和__exit__负责资源的获取和释放。文件、数据库连接、锁,全用它。自己实现一个上下文管理器,你就懂了Python资源管理的精髓。
六、并发编程:线程、进程、协程
IO密集用线程或协程,CPU密集用进程。GIL让多线程无法并行执行CPU任务,但IO等待时会释放。协程是Python并发的未来,asyncio配aiohttp,单线程扛住万级并发。async/await语法不难,难的是理解事件循环和任务调度。别一上来就多进程,进程间通信和内存开销能把你的机器吃干。
七、标准库与虚拟环境
os、sys、json、re、datetime、collections、itertools、pathlib,这些标准库比你想象的强大得多。很多人装了一堆第三方包,其实标准库就能搞定。虚拟环境用venv或conda,每个项目独立依赖,别把全局环境搞得一团糟。requirements.txt锁死版本,是对同事最基本的尊重。
这7个知识点,每一个都值得你花一周动手写代码验证。看会了不等于写会了,写会了不等于用对了。从今天起,挑一个你最不熟的,写三个demo,踩五个坑,你就离精通近了一步。Python不难,难的是你以为自己会了。