python最新功能_Python在2020的新增功能:第1部分
自从很久以前改用了python3,语言层面的特征变化就相对较小了,然而对于每一个版本,Python都会添加一些新函数。
随着Python3.8于2019年10月发布,我发现自己使用的是这种语言的一些特性,关于Python每个版本新增的特性,有如下
3.5-类型注解
3.6-异步
3.7-数据类
3.8-海象算子
3.9-字典联合运算符和泛型类型提示
以上所有的这些,我都会在代码库中使用到。
oapbox演讲:如果你仍在工作或项目中使用旧版本的Python,不要害怕升级!你的旧代码仍然可以工作,而且你将从Python的新特性中获益!
免责声明:如果你仍然使用Python2.7,在这种情况下,我知道你很有可能不会升级。
下面我将回顾(快速)我最喜欢的一些特性,我希望你可以在你的代码中使用。
它们是:类型注解、数据类、字典联合运算符、海象算子。
在这第一部分,我主要介绍:类型注解,海象算子。
Python 3.5
从Python 3开始,Typing就成为了一个特性。因为我们是开发人员,而不是历史学家,所以Typing将提供类型注解和类型提示。
Python不需要为变量指定类型,这是我如此热爱这门语言的部分原因。清晰易读的语法,可以用20多种不同的方法编写一个解决方案,但仍能得到相同的结果。
但后来随着应用程序的增长,或者回头看看你几个月或几年没碰过的代码,或者去阅读别人写的代码。
这种情况下,你就会意识到变量不指定类型对你来说没有啥好处。
Typing 可以帮助你解决这个问题,这也是TypeScript如此流行的原因。
from typing import List
def print_cats(cats: List[str]) -> None:
for cat in cats:
print(f"{cat} has a name with {len(cat)} letters.")
class Cat(object):
def init(self, name: str, age: int, **attrs):
self.cattributes = {
"name": name,
"age": age,
**attrs
}
cats = "this still works w/o type annotation!"
cats: List[str] = ["Meowie", "Fluffy", "Deathspawn"]
不是字符串列表,Python不会检查
cats2: List[str] = [Cat("Meowie", 2), Cat("Deathspawn", 8)]
print_cats(cats)
print_cats(cats2) # 失败
这将返回:
Meowie has a name with 6 letters.
Fluffy has a name with 6 letters.
Deathspawn has a name with 10 letters.
...
TypeError: object of type 'Cat' has no len()
类型注解在这里并没有起到任何作用,那为什么要使用它们呢?因为在创建变量cats并用List[str]时,很明显分配的数据应该与该结构相匹配,因此对于具有复杂类型的可维护代码来说,这将变得更加有用。
from typing import List
class Cat(object):
def init(self, name: str, age: int, **attrs):
self.cattributes = {
"name": name,
"age": age,
**attrs
}
创建类型变量
Cats: type = List[Cat]
def print_cats(cats: Cats) -> None:
for cat in cats:
name: str = cat.cattributes.get("name")
print(f"{name} has a name with {len(name)} letters.")
cats = [Cat("Meowie", 2), Cat("Deathspawn", 8)]
print_cats(cats)
输出:
Meowie has a name with 6 letters.
Deathspawn has a name with 10 letters.
在函数/方法定义中键入参数称为类型暗示,而且类型甚至不必是Python数据类型或来自typing模块。例如最后一行提示性字符串是完全合法的:
import pandas as pd
cols = ["name", "age", "gender"]
data = [["Meowie", 2, "female"],
["Fluffy", 5, "male"],
["Deathspawn", 8, "rather not say"]]
df: pd.DataFrame = pd.DataFrame()
df: "name (string), age (integer), gender (string)" =
pd.DataFrame(data, columns=cols)
在数据处理管道中,如果有很多复杂类型的变量,那这样的操作可能会很有用,因为你可能搞不清楚读取的数据是什么结构,你会试图把它们弄清楚。在IDE上鼠标悬停在变量上会有类型提示的信息,而不是一个简单的pandas.DataFrame提示。
额外的好处是:在python4中,前向引用可以开箱即用,这意味着你可以对尚未定义的类型进行注解。我们现在仍然可以利用这种优势,在文件顶部编写from future import annotations,然后执行以下操作:
from future import annotations
class Food:
"""
Food是合法的,即使没有类别的定义。
"""
def init(self, ingred_1: Food, ingred_2: Food) -> None:
self.ingred_1 = ingred_1
self.ingred_2 = ingred_2
原生类型注解-3.9
内置泛型类型是3.9中的一个特性,我们不需要从typing中导入以向泛型数据类型添加参数。从3.7版开始,使用from futures import annotations就可以使用这种方法,但这是因为它阻止了在运行时计算类型引用。
这个功能让我很兴奋。在3.8中我将typing导入每个模块,或者导入在公共模块中。
示例(信贷:PEP 585):
l = liststr
[]
list is list[str]
False
list == list[str]
False
list[str] == list[str]
True
list[str] == list[int]
False
isinstance([1, 2, 3], list[str])
TypeError: isinstance() arg 2 cannot be a parameterized generic
issubclass(list, list[str])
TypeError: issubclass() arg 2 cannot be a parameterized generic
isinstance(list[str], types.GenericAlias)
True
def find(haystack: dict[str, list[int]]) -> int:
...
海象算子-3.8
海象有眼睛:,然后有牙齿=。
:=是Python3.8中新增的赋值表达式。
complicated = {
"data": {
"list": [1,2,3],
"other": "stuff"
}
}
if (nums := complicated.get('data').get('list')):
print(nums)
结果:
1
2
3
如果没有海象,会有更多的代码行。
...
nums = complicated.get('data').get('list')
if nums:
print(nums)
由于控制流语句在编程中经常使用,使用海象算子可以简化代码。
来自PEP 572:
这样的命名表达式的值与合并表达式的值的结果是相同的,但附加的作用是目标被赋给了该值
换言之,用一个表达式表达了两个语句。
在我复制/粘贴PEP指南的同时,这里还有一些规范中的示例,我认为它们是很好的示例。迫不及待地想尝试一下海象算子来理解列表。
#处理匹配正则表达式
if (match := pattern.search(data)) is not None:
# 匹配后...
一个更直观易写的循环
while chunk := file.read(8192):
process(chunk)
重用一个计算成本很高的值
[y := f(x), y2, y3]
在理解filter语句及其输出之间共享子表达式
filtered_data = [y for x in data if (y := f(x)) is not None]
python最新功能_Python在2020的新增功能:第1部分相关推荐
- 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能...
原文:与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 [源码下载] 与众不同 windows phone (40 ...
- 会声会影2020软件新增功能详情
一.全新高光時刻 将记忆变成影片从未如此简单!使用会声会影全新的智能影片创建器"高光時刻"制作影片,展示您最新的奇遇集锦.只需导入您的照片和视频,"高光時刻"就 ...
- Python在2020的新增功能:第1部分
自从很久以前改用了python3,语言层面的特征变化就相对较小了,然而对于每一个版本,Python都会添加一些新函数. 随着Python3.8于2019年10月发布,我发现自己使用的是这种语言的一些特 ...
- python实现日历功能_Python方法完成农历日历功能代码
Python方法完成农历日历功能代码 #coding=utf-8 #****************************************************************** ...
- python生日提醒_Python实现农历生日提醒功能
前言: 某天突发奇想,想要实现一个农历生日提醒.这个时候有了如下的大概思路: 获取农历 ――> 匹配 ――> 提醒 发现实现这个需求最主要的在获取农历这一块,后边两 ...
- python表达式计算器_Python正则表达式实现简易计算器功能示例
本文实例讲述了Python正则表达式实现简易计算器功能.分享给大家供大家参考,具体如下: 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:1*2*((1+2)/(2+3)+ ...
- python sftp模块_python实现ssh及sftp功能(实例代码)
1.在Linux上我们通过scp命令实现主机间的文件传送,通过ssh实现远程登录 ,比如 我们经常使用的xshell远程登录工具,就是基础ssh协议实现window主机远程登录Linux主机 下面简单 ...
- python adb模块_python中adb有什么功能
ADB是Android SDK中的一个工具, 使用ADB可以直接操作管理Android模拟器或者真实的Andriod设备. ADB主要功能有: 1.在Android设备上运行Shell(命令行) 2. ...
- python离线语音识别_Python实现语音识别和语音合成功能
声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移. 通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布, ...
最新文章
- iphone通讯录批量删除_iPhone通讯录删除了如何恢复?用对方法快速找回,亲测有效!_...
- CVPR2020 | 反传统的无监督人脸旋转方案:旋转-渲染
- 为什么神经网络会把乌龟识别成步枪?现在的 AI 值得信任吗?
- Go 语言 Slice
- Nginx源码分析:核心模块剖析及常见问题
- oracle合并查询
- 各编程语言的国内镜像源切换
- 科大星云诗社动态20210520
- 面向全球用户的Teams app之Culture计量单位和禁忌篇
- C#回调函数应用示例,形象比喻方法助理解
- MyBatis 自定义 typeHandler
- python中os模块详解_Python OS模块(常见文件操作示例)
- 使用 header函数实现文件下载
- react新特性实例详解(memo、lazy、suspense、hooks)
- public/protected/private简介
- 3.2 Tensorflow基础运算
- 学成在线(一)项目介绍
- java显示一个钟表_java实现时钟效果
- 【竞赛篇-国创(大创)结题】国创(大创)立项后的基本流程、需要用什么结题、如何快速结题
- 使用腾讯云文字识别提取图片中的文字内容