Python3.9新特性
介绍
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新特性相关推荐
- Python3.8 新特性:仅位置参数
这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟了解什么是仅位置参数(Positional-Only Arguments) 函数传递参数的方式繁多,有位置参数.默认参数. ...
- python 3.8 新特性 video_1分钟了解:Python3.8 新特性:仅位置参数
这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟了解什么是仅位置参数(Positional-Only Arguments) 插播一条:我自己是一名从事了多年开发的Pyth ...
- Python3.8 新特性:f-strings调试
f-strings调试 这是Python3.8新特性的第三篇,第一篇介绍了Python3.8 新特性:赋值表达式,第二篇是Python3.8 新特性:仅位置参数.这篇文章介绍f-strings调试功能 ...
- Python3.10新特性初体验
Python3.10新特性初体验 注:图片来源 目录 结构模式匹配 [PEP 635] union类型允许X | Y [PEP 604] 带圆括号的上下文管理器 一.结构模式匹配(新增PEP 635) ...
- python3.8新特性 逻辑表达式_Python3.8新特性
人生天地间,忽如远行客 昨日Python3.8稳定版发布,官网发布了一篇介绍新特性的文章,在此记录一下. 新增赋值操作符 := 作用:把较大表达式中的某部分值赋给变量,因为看起来像海象的眼睛和牙齿,: ...
- Python3.8 新特性:赋值表达式
Python3.8 正式版本已经发布,喜欢尝鲜的同学可以下载下来体验一下,我并没有打算升级到最新版本,因为性能上并没有显著提升.但还是有必要了解其中的新特性. 赋值表达式的语法是:" nam ...
- python3.8新特性 逻辑表达式_Python3.8正式发布!新特性解析在这里
Python3.8正式发布!新特性解析在这里 诗书塞外 Python程序员 10月14日,Python 3.8 正式版发布.这也意味着一个Python开发周期的结束,和另一个开发周期的开始.Pytho ...
- Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
"Python学习开发",一个值得加星标的公众号. 正文共:4946 字 1 图 预计阅读时间:13 分钟 作者:陈祥安 原文有删改:https://docs.python.org ...
- Python3.0 新特性
这篇文章主要介绍了相比于python 2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动 ...
- python3.9新特性_Python3.9又更新了:dict内置新功能
Python3.8 的热乎劲还没过去,Python 就又双叒叕要更新了.近日,3.9 版本的第四个 alpha 版已经开源.从文档中,我们可以看到官方透露的对 dict.math 等组件增加的新特性, ...
最新文章
- 浏览器加载、解析、渲染的过程
- 融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
- Go语言基础语法--注释、基础结构2
- More Effective C++: 01基础议题
- 201671010140. 2016-2017-2 《Java程序设计》java学习第一周
- 【学习笔记】33、具有Python特色的循环
- Face++ 论文解读:一种新的行人重识别度量学习方法 | PaperDaily #20
- Teams Meeting App的 task 弹出框
- Some Principles
- “根本就不需要 Kafka 这样的大型分布式系统!”
- 结构模式--之--享元模式
- 百度系无人车创业公司领骏科技完成新一轮融资
- java获取每月最后一天
- 重学React基础知识整理——组件间的另类通信“插槽”(五)
- 你可能没听过的11个Python库
- 「数据结构 | 链表」单链表、双向链表节点操作演示动画
- IC 后端仿真: process corner 和 PVT
- HTML基础---01
- java 正则拼音_匹配中文普通话汉字拼音正则表达式
- Google的云计算
热门文章
- 游戏服务器框架php,golang -Pitaya 游戏服务器框架中文API教程
- 液晶显示屏常用的极性变换方式
- 分贝dB与倍数的转换关系
- 安卓之父鲁宾:被乔布斯羡慕嫉妒的天才
- 百家号自媒体视频,视频消重软件,批量自动去水印加水印软件 哔哩哔哩 秒拍 爱拍百度视频...
- 【Angular】Angular从入门到实战视频教程第八章
- 概率统计Python计算:单因素试验参数的区间估计
- linux open_namei,刚学Linux 想问问这个程序写的什么 有大佬帮帮吗
- 计算机设计校园的简要教案,人教版初中七年级美术下册《校园艺术节》教案设计...
- 亲历Intel CPU漏洞的正面袭击