查看原文
其他

Python3.10几个牛批新特性!

点击上方 "Python人工智能技术关注,星标或者置顶
22点24分准时推送,第一时间送达
后台回复“大礼包”,送你特别福利

编辑:乐乐 | 来自juejin.cn/post/7015590447745613854

Pythn人工智能技术(ID:coder_experience)第712期推文

上一篇:三面阿里无理由挂了,被HR一句话噎死,网友:这可是阿里啊。。。


正文


大家好,我是Python人工智能技术

Python 3.10正式发布,你尝鲜了吗?

本文参考自 Python官方文档 :Python Release Python 3.10.0 | Python.org[1]

在正值国庆假期人山人海的2021年10月4号,Python官方正式发布了Python3.10.0[2]。作为一只假期期间宅着不动的coding人,自然是第一时间体验了一波。相较于之前的版本,该版本有以下主要变更。

新的 Union Type表达

新版本简化了 Union Type 的使用 ,改为更为简洁的|

旧版:

from typing import Union
a: Union[int, str] = 1

新的版本:

a: str | int = 1

二者完全等价:

Union[int, str] == int | str # True

这类变化在其他地方也相似:

# 旧版:
# def f(list: List[Union[int, str]], param: Optional[int]) -> Union[float, str]
def f(list: List[int | str], param: int | None) -> float | str:
    pass

f([1"abc"], None)

# 旧版: 
# typing.List[typing.Union[str, int]]
typing.List[str | int]
list[str | int]

# 旧版: 
# typing.Dict[str, typing.Union[int, float]]
typing.Dict[str, int | float]
dict[str, int | float]

该特性也可用于 isinstanceissubclass

# True
isinstance("FunnySaltyFish", int|str)

# True 
issubclass(str, str|int)

zip 可选严格模式

zip新增可选参数strict, 当该选项为True时,传入zip的两个可迭代项长度必须相等,否则将抛出 ValueError

旧版(及不加此参数),当二者长度不等时,以长度较小的为准

names = ["a","b","c","d"]
numbers = [1,2,3]
z = zip(names,numbers)
for each in z:
    print(each)
    
# ('a', 1)
# ('b', 2)
# ('c', 3)

设置strict为True

# ...
z = zip(names,numbers,strict=True)
# ...

d:\projects\python\learn\Py310探索.py in <module>
      3 numbers = [1,2,3]
      4 z = zip(names,numbers,strict=True)
----> 5 for each in z:
      6     print(each)

ValueError: zip() argument 2 is shorter than argument 1

带括号的上下文管理器

with可以加括号了

with (CtxManager() as example):
    ...

with (
    CtxManager1(),
    CtxManager2()
):
    ...

with (CtxManager1() as example,
      CtxManager2()):
    ...

with (CtxManager1(),
      CtxManager2() as example):
    ...

with (
    CtxManager1() as example1,
    CtxManager2() as example2
):
    ...

import pathlib
p = pathlib.Path()
p1 = p/"text1.txt" # 内容:文本1的内容
p2 = p/"text2.txt" # 内容:文本2的内容
with(
    p1.open(encoding="utf-8"as f1,
    p2.open(encoding="utf-8"as f2
):
    print(f1.read(), f2.read(), sep="\n"
    
    # 文本1的内容
 # 文本2的内容

显式类型别名

使用 TypeAlias 显式标注类型别名,提高可读性

旧的方式:

x = int
def plus_int(a:x,b:x) -> x:
    return a+b

可以看到,x很容易被搞混

新的方式:使用 TypeAlias表明这是个别名

from typing import TypeAlias
x : TypeAlias = int
def plus_int(a:x,b:x) -> x:
    return a+b

match...case语句

对,就是其他语言的switch-case,python终于提供了支持,还是加强版的

完整语法参见:PEP 634 -- Structural Pattern Matching: Specification | Python.org[3]

举几个例子:

基本的类型匹配:

day = 6
match day:
    case 1:
        print("星期一")
    case 6 | 7:
        print("周末")
    case _ : 
        print("其他情况")

subject:这在处理命令行参数的时候特别有用

另外搜索公众号顶级架构师后台回复“面试”,获取一份惊喜礼包。

"""
    @copyright : [FunnySaltyFish](https://funnysaltyfish.github.io)
    @date : 2021/10/05 21:08:42
"""

command = "save 1.txt"
# 试着把command改成 list / copy 1.txt 2.txt 看看效果
match command.split(" "):
    case ["list"]:
        print("列出文件~")
    case ["save", file_name]:
        print(f"保存文件到 {file_name}")
    case ["copy",source,target]:
        print(f"拷贝 {source} -> {target}")

也可以匹配对象:

class Person():
    pass

class Student(Person):
    def __init__(self, id: int) -> None:
        self.id = id

class Teacher(Person):
    def __init__(self, name: str) -> None:
        self.name = name

a = Student(1)
# a = Student(2)
# a = Teacher("FunnySaltyFish")
match a:
    case Student(id = 2):
        print(f"这是位学生,且id正好是2")
    case Student():
        print(f"这是学生,id为{a.id}")
    case Teacher():
        print(f"这是老师, 姓名为{a.name}")

当然也可以匹配字典:

d = {
    "name" : "李四"# 张三
    "age" : 18,
    "hobby" : "阅读"

match d:
    case {"name":"张三", **args}:
        # **收集其他参数
        print("这是张三", args) # 这是张三 {'age': 18, 'hobby': '阅读'}
    case {"name" : name , "age" : age, "hobby": hobby}:
        print(f"我叫{name}, 今年{age}岁, 喜欢{hobby}"#我叫李四,今年18岁,喜欢阅读

更复杂的还有结合Guard、匹配捕获等使用,具体可以参见:PEP 635 -- Structural Pattern Matching: Motivation and Rationale | Python.org[4] 和 PEP 636 -- Structural Pattern Matching: Tutorial | Python.org[5]

更友好的报错提示

现在,当你的括号、引号未闭合时,python会抛出更加清晰明了的错误

str = "未闭合的str

File "
d:\projects\python\learn\Py310探索.py", line 90
    str = "
未闭合的str
          ^
SyntaxError: unterminated string literal (detected at line 90)

 arr = [1223
    
  File "d:\projects\python\learn\Py310探索.py", line 91
    arr = [1223
          ^
SyntaxError: '[' was never closed

其他一些更新:

distutils 被弃用

推荐使用 setuptools

需要 OpenSSL 1.1.1 及以上版本
移除 Py_UNICODE编码API
PyUnicodeObject的wstr被弃用,并将在之后移除

完。摸鱼去了。

参考资料

[1]

https://www.python.org/downloads/release/python-3100/: https://link.juejin.cn?target=https%3A%2F%2Fwww.python.org%2Fdownloads%2Frelease%2Fpython-3100%2F

[2]

https://www.python.org/downloads/release/python-3100/: https://link.juejin.cn?target=https%3A%2F%2Fwww.python.org%2Fdownloads%2Frelease%2Fpython-3100%2F

[3]

https://www.python.org/dev/peps/pep-0634/#id25: https://link.juejin.cn?target=https%3A%2F%2Fwww.python.org%2Fdev%2Fpeps%2Fpep-0634%2F%23id25

[4]

https://www.python.org/dev/peps/pep-0635/#id15: https://link.juejin.cn?target=https%3A%2F%2Fwww.python.org%2Fdev%2Fpeps%2Fpep-0635%2F%23id15

你还有什么想要补充的吗?

免责声明:本文内容来源于网络,文章版权归原作者所有,意在传播相关技术知识&行业趋势,供大家学习交流,若涉及作品版权问题,请联系删除或授权事宜。


技术君个人微信


添加技术君个人微信即送一份惊喜大礼包


→ 技术资料共享

→ 技术交流社群



--END--


往日热文:

看看人家那物业管理系统,那叫一个优雅(附源码)

一款神仙接私活儿软件,吊到不行!

保姆级别!带你搭建一台服务器!

用Python爬取高颜值美女(爬虫+人脸检测+颜值检测)

Python 中有 3 个不可思议的返回功能

Python 强大的信号库 blinker 入门教程

17个常见的Python运行时错误,你中招了没?

警告!VPN翻墙被抓了!已大规模行政处罚!


Python程序员深度学习的“四大名著”:



这四本书着实很不错!我们都知道现在机器学习、深度学习的资料太多了,面对海量资源,往往陷入到“无从下手”的困惑出境。而且并非所有的书籍都是优质资源,浪费大量的时间是得不偿失的。给大家推荐这几本好书并做简单介绍。


获得方式:

1.扫码关注本公众号
2.后台回复关键词:名著

▲长按扫描关注,回复名著即可获取

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存