Python 3.10 已经在 10 月 4 日发布了, 要不要更新呢?
3.10 版没有添加新的模块, 但是引入了很多新的并且有用的特性. 让我们来一起看看吧.
更详细语法错误提示信息
在调试代码时, 能够提供更多的错误新信息和提示了, 报告可以指出错误的语法, 而不仅仅是提供 "Syntax Error".
这是个新的特性简直是太好了, 不仅对于刚开始学习 python 的人来说对于所有人都是一个好消息, 再也不需要去一个字一个字的看了. python 3.10 会提示我们错误的位置, 再也不需要 Stack Overflow 了, 哈.
结构模式匹配
结构模式匹配以 match 语句和 case 语句的形式使用. 模式可以是序列, 映射, python 原始数据类型和类实例. 我们可以把它看作 switch 语句的加强版, 一个简单的例子:-
- numbers = [1,2,3,4]
- for n in numbers:
- match n:
- case 1:
- print("Number is 1")
- case 2:
- print("Number is 2")
- case 3:
- print("Number is 3")
- case _:
- print("Number is not 1,2 or 3")
关键字 match 后跟变量名称. 如果匹配, 则将执行 case 块内的语句.
如果没有匹配, 则执行 case _ 块内的语句.
上面的程序结果如下所示:
- Number is 1
- Number is 2
- Number is 3
- Number is not 1,2 or 3
这种结构模式匹配还适用于复杂模式.
- def human_age(person): # person = (name, age, gender)
- match person:
- case (name, _, "male"):
- print(f"{name} is man.")
- case (name, _, "female"):
- print(f"{name} is woman.")
- case (name, age, gender):
- print(f"{name} is {age} old.")
结果是这样的:
- human_age(("Carol", 25, "female"))
- Carol is woman.
很像 Scala 啊, 使用 3.10 的 Pyspark 应该会简单很多, 这里贴个 Scala 代码, 看看是不是很像
- import scala.util.Random
- val x: Int = Random.nextInt(10)
- x match {
- case 0 => "zero"
- case 1 => "one"
- case 2 => "two"
- case _ => "other"
- }
新型联合运算符
以 X|Y 的形式引入了新的类型联合运算符. 这提供了表达 X 型或 Y 型的清晰形式.
- def square(number: int|float):
- return number ** 2
结果:
square(2.5)
6.25
新的运算符也可以用作 isinstance() 和 issubclass() 的第二个参数.
- isinstance("3",int|str)
- Trueisinstance("GoodBye",int|str)
- True
现有模块的一些改进
pprint() 添加了一个新的关键字参数 - underscore_numbers.
- >>> pprint.pformat(int(1e9),underscore_numbers=True)
- '1_000_000_000'
我们可以使用 int.bit_count() 来计算整数的二进制表示中的位数.
- value = 50
- print(bin(value))
- 0b101010
- print(value.bit_count())
- 3
有点像 numpy 的 bincount 啊
Statistics 增加了协方差函数
- >>> import statistics
- >>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
- >>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
- >>> statistics.covariance(x,y)
- 0.75
statistics.correlation() 还能计算 Pearson.
这俩我没想明白为什么要加, 可能我作为 AI 开发, np,scipy 和 pandas 都是必装, web 开发也用不到这些吧, 实在没懂加这个是为什么.
statistics.linear_regression() 这个就好玩了, 虽然也没什么用, 但是 statistics 可以计算线性回归了.
根据此线性函数描述自变量 x 和因变量 y 之间的关系:-
y = 斜率 * x + 截距 + 噪声
其中斜率和截距是估计的回归参数, 噪声表示数据的可变性.
- >>> years = [2001,2005,2010]
- >>> houses_built = [5,8,14]
- >>> slope, intercept = statistics.linear_regression(years, houses_built)
- >>> round(slope * 2017 + intercept)
- 21
下一步加个梯度的反向传播, statistics 模块就可以训练 MLP 了, 哈
总结
其他的像 Cpython 之类的我觉得关系不大的就不细说了, 3.10 的语法提示真是太香了, 绝对可以节省不少的开发调试时间, 模式匹配也是个好东西, 用过 Scala 的都知道.
最后就是我们到底要不要升级呢? 对于我来说, 我的 python 版本是根据 Pytorch 走的, Pytorch 支持哪版我就用那版. 虽然有 Conda 可以管理版本, 但是还有很多其他的 Python 包还不知道支持不支持 3.10, 所以我的建议是再等等看吧, 毕竟我们是拿来用的自己用的舒服才好. 但是要是不考虑其他包兼容的问题 3.10 我肯定优先升级.
来源: http://developer.51cto.com/art/202110/684849.htm