介绍

2020 年 10 月 5 日 Python 3.9 已经发布了正式版,新增了一大波新特性,快来上手尝试一下吧。

知识点

  • 字典合并与更新运算符
  • 放宽装饰器的语法
  • 移除前缀后缀的字符串方法
  • datetime 模块
  • math 模块

安装 Python3.9

要想使用 Python3.9,首先需要添加 deadsnakes 软件源。

在终端运行下面命令:

sudo add-apt-repository ppa:deadsnakes/ppa

sudo apt-get update

之后根据提醒按下回车键,就会自动安装完成。

运行结果如下:

然后就可以安装 Python3.9 了,后面输入y同意执行

sudo apt install python3.9-full

运行结果如下:

顺便给 Python3.9 安装 pip ,方便安装需要的模块

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" && python3.9 get-pip.py

运行结果如下:

安装之后我们可以进入 Python3.9 交互环境

python3.9

运行结果如下:

字典合并与更新运算符

合并 (|) 与更新 (|=) 运算符已被加入内置的 dict 类。 它们为现有的 dict.update 和 {**d1, **d2} 字典合并方法提供了补充。

在之前版本中,我们要想将 y 合并到 x ,通常会使用 x.update(y) 这样操作有个需要注意的情况,就是它没有返回值,而是直接改变 x 的值,也就是说,其本质就像字面意思那样,是在更新,而不是合并。

x = {"key1": "value1 from x", "key2": "value2 from x"}

y = {"key2": "value2 from y", "key3": "value3 from y"}

x.update(y)

x

运行结果如下:

另外也可以使用字典解包的方式来合并字典,这种方法虽然用起来很方便,很简单就达到了目的,但背后逻辑往往让人难以参透。

x = {"key1": "value1 from x", "key2": "value2 from x"}

y = {"key2": "value2 from y", "key3": "value3 from y"}

{**x,**y}

{**y,**x}

运行结果如下:

接下来,我们尝试一下 Python3.9 中新的方法,注意观察字典的先后顺序。

x = {"key1": "value1 from x", "key2": "value2 from x"}

y = {"key2": "value2 from y", "key3": "value3 from y"}

x | y

y | x

运行结果如下:

可以看到,新方法合并运算符的使用让你合并变得很方便,而且它是有返回值且不改变原来的值。我们要想像原来 update 方法那样把 y 更新到 x ,还可以使用更新运算符 |= 。

x = {"key1": "value1 from x", "key2": "value2 from x"}

y = {"key2": "value2 from y", "key3": "value3 from y"}

x |=y

x

运行结果如下:

放宽对装饰器的语法限制

在之前版本的 Python 中对于装饰器的语法是有所限制的,Python 3.9 终于将这一限制放宽任意,任何表达式都可以用在装饰器中。

之前的装饰器语法如下:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE

Python3.9 版本的装饰器语法:

decorator: '@' namedexpr_test NEWLINE

我们来简单写一个装饰器,感受一下。

首先我们写一个常规的装饰器,来实现自动将函数返回值变成大写。

def upper(func):

def wrapper(*args):

return func(*args).upper()

return wrapper

@upper

def hello(name):

return f'hello {name}'

hello('johnson')

运行结果如下:

然后来感受一下 Python3.9 的新特性,也就是什么叫任何表达式都可以?

@lambda func:(lambda *args:func(*args).upper())

def hello(name):

return f'hello {name}'

hello('johnson')

运行结果如下:

可以看到,我们直接使用 lambda 表达式就实现了装饰器,且没有单独去定义,而是随用随写。至于更多好玩的用法,大家还可以继续去探索。

新增用于移除前缀和后缀的字符串方法

增加了 str.removeprefix(prefix) 和 str.removesuffix(suffix) 用于方便地从字符串移除不需要的前缀或后缀。另外也增加了 bytes 和 bytearray 以及 collections.UserString 的对应方法,大家可以自行实验。

首先我们实验一下 str.removeprefix(prefix) 的使用:

url="https://www.psdn.icu"

url.removeprefix('https://')

运行结果如下:

然后再实验一下 str.removesuffix(suffix) 的使用:

url="https://psdn.icu/python3中的print函数/"

url.removesuffix('python3中的print函数/')

运行结果如下:

标准多项集中的类型标注泛型

在类型标注中现在你可以使用内置多项集类型例如 list 和 dict 作为通用类型而不必从 typing 导入对应的大写形式类型名 (例如 List 和 Dict)。 标准库中的其他一些类型现在同样也是通用的,例如 queue.Queue。

def greet_all(names: list[str]) -> None:

for name in names:

print("Hello", name)

__file__ 属性将是一个绝对路径

首先,我们在当前目录下新建一个 test.py文件,然后在其中写入下面内容

#test.py

print(__file__)

然后分别尝试使用 Python3.8 和 Python3.9 去运行

python3.8 test.py

python3.9 test.py

运行结果如下:

可以看到,Python3.8 中是相对路径,而 Python3.9 成了绝对路径,很显然,绝对路径更加可靠。

datetime 模块的改进

isocalendar() 方法现在返回 namedtuple (具名元组),通过下面的例子,你将一目了然到底变化了什么。

import datetime

datetime.date.today().isocalendar()

我们先在 Python3.8 中运行上面的代码,结果如下:

然后我们在 Python3.9 中运行上面的代码,结果如下:

我们可以进一步发现具名元组的优点,那就是可以直接通过属性名访问,不止之前的索引访问。

例如如下代码:

s=datetime.date.today().isocalendar()

s[0]

s.week

s.weekday

代码运行结果如下:

math 模块的改进

math.gcd(*integers)

有时候,我们需要求几个数字的最大公约数,在 Python 中可以直接使用 math 模块的 gcd 函数。在之前的版本,gcd 函数只允许最多两个参数,这在需要求一堆数字的最大公约数的时候实在是不方便,好在 Python3.9 终于有了改进,可以使用多个参数了。

import math

math.gcd(10,15,25,55)

运行效果如下:

math.lcm(*integers)

新增了计算最小公倍数的函数 math.lcm() 。

import math

math.lcm(2,3,5)

运行效果如下:

总结

Python3.9 相较于之前的版本,主要是新增了字典的合并运算符、放宽了装饰器的语法限制、对于字符串新增了去除前缀后缀的方法、以及 math 模块和 datetime 模块的一些改进,更多的改变,大家可以查看官方文档。

Python3.9新特性相关推荐

  1. Python3.8 新特性:仅位置参数

    这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟了解什么是仅位置参数(Positional-Only Arguments) 函数传递参数的方式繁多,有位置参数.默认参数. ...

  2. python 3.8 新特性 video_1分钟了解:Python3.8 新特性:仅位置参数

    这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟了解什么是仅位置参数(Positional-Only Arguments) 插播一条:我自己是一名从事了多年开发的Pyth ...

  3. Python3.8 新特性:f-strings调试

    f-strings调试 这是Python3.8新特性的第三篇,第一篇介绍了Python3.8 新特性:赋值表达式,第二篇是Python3.8 新特性:仅位置参数.这篇文章介绍f-strings调试功能 ...

  4. Python3.10新特性初体验

    Python3.10新特性初体验 注:图片来源 目录 结构模式匹配 [PEP 635] union类型允许X | Y [PEP 604] 带圆括号的上下文管理器 一.结构模式匹配(新增PEP 635) ...

  5. python3.8新特性 逻辑表达式_Python3.8新特性

    人生天地间,忽如远行客 昨日Python3.8稳定版发布,官网发布了一篇介绍新特性的文章,在此记录一下. 新增赋值操作符 := 作用:把较大表达式中的某部分值赋给变量,因为看起来像海象的眼睛和牙齿,: ...

  6. Python3.8 新特性:赋值表达式

    Python3.8 正式版本已经发布,喜欢尝鲜的同学可以下载下来体验一下,我并没有打算升级到最新版本,因为性能上并没有显著提升.但还是有必要了解其中的新特性. 赋值表达式的语法是:" nam ...

  7. python3.8新特性 逻辑表达式_Python3.8正式发布!新特性解析在这里

    Python3.8正式发布!新特性解析在这里 诗书塞外 Python程序员 10月14日,Python 3.8 正式版发布.这也意味着一个Python开发周期的结束,和另一个开发周期的开始.Pytho ...

  8. Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!

    "Python学习开发",一个值得加星标的公众号. 正文共:4946 字 1 图 预计阅读时间:13 分钟 作者:陈祥安 原文有删改:https://docs.python.org ...

  9. Python3.0 新特性

    这篇文章主要介绍了相比于python 2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动 ...

  10. python3.9新特性_Python3.9又更新了:dict内置新功能

    Python3.8 的热乎劲还没过去,Python 就又双叒叕要更新了.近日,3.9 版本的第四个 alpha 版已经开源.从文档中,我们可以看到官方透露的对 dict.math 等组件增加的新特性, ...

最新文章

  1. 浏览器加载、解析、渲染的过程
  2. 融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
  3. Go语言基础语法--注释、基础结构2
  4. More Effective C++: 01基础议题
  5. 201671010140. 2016-2017-2 《Java程序设计》java学习第一周
  6. 【学习笔记】33、具有Python特色的循环
  7. Face++ 论文解读:一种新的行人重识别度量学习方法 | PaperDaily #20
  8. Teams Meeting App的 task 弹出框
  9. Some Principles
  10. “根本就不需要 Kafka 这样的大型分布式系统!”
  11. 结构模式--之--享元模式
  12. 百度系无人车创业公司领骏科技完成新一轮融资
  13. java获取每月最后一天
  14. 重学React基础知识整理——组件间的另类通信“插槽”(五)
  15. 你可能没听过的11个Python库
  16. 「数据结构 | 链表」单链表、双向链表节点操作演示动画
  17. IC 后端仿真: process corner 和 PVT
  18. HTML基础---01
  19. java 正则拼音_匹配中文普通话汉字拼音正则表达式
  20. Google的云计算

热门文章

  1. 游戏服务器框架php,golang -Pitaya 游戏服务器框架中文API教程
  2. 液晶显示屏常用的极性变换方式
  3. 分贝dB与倍数的转换关系
  4. 安卓之父鲁宾:被乔布斯羡慕嫉妒的天才
  5. 百家号自媒体视频,视频消重软件,批量自动去水印加水印软件 哔哩哔哩 秒拍 爱拍百度视频...
  6. 【Angular】Angular从入门到实战视频教程第八章
  7. 概率统计Python计算:单因素试验参数的区间估计
  8. linux open_namei,刚学Linux 想问问这个程序写的什么 有大佬帮帮吗
  9. 计算机设计校园的简要教案,人教版初中七年级美术下册《校园艺术节》教案设计...
  10. 亲历Intel CPU漏洞的正面袭击