说真的,一提到Python版本,很多人还在纠结2还是3。这个事情都过去这么多年了,真没必要再耗精力。Python 2在2020年就停止维护,再抱着它不放,等于给自己挖坑。
很多老项目还在用Python 2,这个能理解。但新项目还选Python 2,说不过去。Python 3从3.6开始就非常稳定了。关键是,新版本里加了不少好东西,用上真能省不少事。
f-string 格式化,告别 % 和 .format()
以前写字符串拼接,要么用 %s 占位,要么用 .format()。代码一多,参数位置对不上,眼都花了。f-string 直接在字符串里写变量,简单粗暴。
name = '张三'; print(f'你好,{name}') 这么写,一眼就明白。还能在花括号里做运算,print(f'结果:{a + b}'),不用再搞一堆临时变量。
类型提示 type hints,让代码更好懂
Python是动态语言,写起来快,但看代码容易发懵。一个函数返回什么,参数是什么类型,光看名字猜不准。类型提示 不是强制约束,是给人看的。
def add(x: int, y: int) -> int: return x + y 这么写,后来的人一看就知道x和y是整数,返回也是整数。配合编辑器,写代码还能自动补全,错误少很多。
数据结构增强,字典保持有序
在Python 3.6之前,字典里的键值对顺序是不固定的。你插入的顺序和取出来的顺序可能不一样,这招很坑人。从Python 3.7开始,字典默认保持插入顺序。这在处理配置文件,解析JSON数据时特别有用。
还有 dataclass,写数据类不用再手写__init__。一行装饰器搞定。差不多就是 @dataclass class Person: name: str; age: int 这样。省去大量重复代码。
异步编程 asyncio,处理I/O不再卡
搞爬虫或者Web服务的时候,网络请求经常卡住。以前的解决办法是多线程,但线程多了容易出问题。Python 3.5以后,asyncio 成了内置库。它用单线程处理并发,特别适合I/O密集型的任务。
写代码的时候用 async def 定义函数,用 await 调用。看起来像同步代码,实际在等网络回复时会切到其他任务,不浪费CPU。以前用多线程的代码,换成这个,资源消耗小多了。
海象运算符 := 赋值又取值
有时候需要先赋值,再用这个值做判断。以前得写两行,比如 value = get_data(); if value... 现在用 := 一行搞定。不仅能用在if里,还能在while循环中用。比如 while chunk := file.read(1024): process(chunk),这样读文件就不用先读再检查长度了。
回头看看,这些特性都在Python 3.6到3.10之间加入的。马上Python 3.12都来了,还停留在2.x版本,确实有点说不过去。迁移过来,把这些语法用上,代码能短一大截,可读性也提升。
刚上手不妨从f-string和类型提示开始,这两个最直观。慢慢再试试dataclass和asyncio。用习惯之后,回头再看老代码,会发现到处都是可以改进的地方。