Python 居然开始抄作业了,这次抄的是Rust

开发 后端
众所周知,Rust有两样镇山之宝,一是安全的内存模型,二是模式匹配。在内存管理上,Python使用了传统的垃圾回收的内存模型,和Rust没有多少可比性。随着Python3.10的发布,模式匹配被引入到Python中,而且几乎是完全照搬了Rust的概念。

[[431840]]

整个九月份,我都在忙一个js的项目。因为好多年不写js,动手之前特地找了一些js的资料恶补半天,结果发现js越来越像Python了。且不说js从基于原型的面向对象转向了基于类的面向对象,单是类型化数组(Typed Arrays)的引入,就让用惯了NumPy的我喜出望外。另外,js的数组推导式和装饰器,也几乎是完全照抄了Python的作业。

进入十月,Python社区指导委员会正式推出了Python3.10,距离上一个版本发布,正好过去了一年。记得Python3.9发布之后没几天,我写过一篇名为《危险的转变:Python正在从简明转向臃肿,从实用转向媚俗》的博文,着实吐槽了一番,正所谓爱之也深恨之也切。这次新版本发布,我自然不会放过尝鲜的机会,赶紧安装尝试了一下,却发现,一向特立独行的Python居然开始抄作业了,这次抄的是Rust。

众所周知,Rust有两样镇山之宝,一是安全的内存模型,二是模式匹配。在内存管理上,Python使用了传统的垃圾回收的内存模型,和Rust没有多少可比性。随着Python3.10的发布,模式匹配被引入到Python中,而且几乎是完全照搬了Rust的概念。Rust支持模式匹配中的变量绑定、结构体/元组解构、守卫条件判断、数值范围匹配等特性,Python照单全收,连下划线 _ 匹配任意情形也原封不动地继承了过来。

让我们一起来揭开Pyhton3.10最重要的升级——模式匹配的盖头。

类似C语言的switch case, Python的模式匹配最简单的应用就是对字面值进行匹配:

  1. >>> a = 3 
  2. >>> match(a): 
  3.     case 1: 
  4.         print("a == 1"
  5.     case 2: 
  6.         print("a == 2"
  7.     case _:        # default 
  8.         print("other"
  9.  
  10. other 

case语句中,支持或操作:

  1. >>> import datetime 
  2. >>> n = datetime.datetime.now() 
  3. >>> match(n.weekday()): 
  4.     case 0|1|2|3|4: print("工作日"
  5.     case 5|6: print("周末"
  6.  
  7. 工作日 

除了字面值外,case语句,支持对上面提到的模式进行解构,如对元组:

  1. >>> a = (0, 1) 
  2. >>> match(a): 
  3.     case (0, y):  # 匹配所有第0个元素是0的元组 
  4.         print(f"a[0]==0, a[1]=={y}"
  5.     case (x, 0):  # 匹配所有第1个元素是0的元组 
  6.         print(f"a[1]==0, a[0]=={x}"
  7.  
  8. a[0]==0, a[1]==1 

对列表:

  1. >>> cmd = "ls test" 
  2. >>> match(cmd.split()): 
  3.     case ["ls", path]: print(f"显示{path}中的文件和目录"
  4.     case ["rm", path]: print(f"删除{path}中的文件和目录"
  5.     case ["cp", src, dest]: print(f"将{src}复制到{dest}"
  6.  
  7. 显示test中的文件和目录 

对字典:

  1. >>> a = {"name""xxx""age": 40, "job""程序员"
  2. >>> match(a): 
  3.     case {"name"name"age": age, "job""程序员"}: 
  4.         print(f"他是一名程序员,名字叫{name}, {age}岁了"
  5.     case {"name"name"age": age, "job""教师"}: 
  6.         print(f"他是一名人民教师,名字叫{name}, {age}岁了"
  7.  
  8. 他是一名程序员,名字叫xxx, 40岁了 

对于类对象,match case照样可以使用如:

  1. >>> class Point(): 
  2.     def __init__(self,x,y): 
  3.         self.x = x 
  4.         self.y = y 
  5.  
  6. >>> a = Point(1, 2) 
  7. >>> match(a): 
  8.     case Point(x=1, y=y): print(f"这是一个X坐标为1的点,它的Y坐标为{y}"
  9.     case Point(x=x, y=2): print(f"这是一个Y坐标为2的点,它的X坐标为{x}"
  10.  
  11. 这是一个X坐标为1的点,它的Y坐标为2 

也可以用于多个类:

  1. >>> class Programmer: 
  2.     def __init__(self, lang): 
  3.         self.lang = lang 
  4.  
  5.  
  6. >>> class Teacher: 
  7.     def __init__(self, subject): 
  8.         self.subject = subject 
  9.  
  10. >>> a = Programmer("Python"
  11. >>> match(a): 
  12.     case Programmer(lang="Python"): print("咱们都是Pyhon程序员!"
  13.     case Programmer(): print("原来你也是一名程序员!"
  14.     case Teacher(): print("向人民教师致敬!"
  15.  
  16. 咱们都是Pyhon程序员! 

case 语句后,还支持添加一个if语句,进一步对匹配的条件进行限制,这个if语句,被称之为“守卫”。如:

  1. >>> class Point(): 
  2.     def __init__(self,x,y): 
  3.         self.x = x 
  4.         self.y = y 
  5.  
  6.  
  7. >>> a = Point(2,2) 
  8. >>> match(a): 
  9.     case Point(x=x, y=y) if x==y: print("这个点在斜率为1的直线上"
  10.     case Point(x=x, y=y) if x==-y: print("这个点在斜率为-1的直线上"
  11.  
  12. 这个点在斜率为1的直线上 

美中不足的是,我没有找到case语句中直接使用范围的方法,但这个可以用守卫来解决:

  1. >>> a = 5 
  2. >>> match(a): 
  3.     case x if 1 <= x < 10: print("数字在1和10之间"
  4.     case x if 10 <= x < 20: print("数字在10和20之间"
  5.  
  6. 数字在1和10之间 

 

责任编辑:武晓燕 来源: Python作业辅导员
相关推荐

2024-11-21 15:29:34

2012-01-13 16:00:05

爱国者冯军苹果

2013-01-15 09:58:11

谷歌移动应用苹果

2020-09-24 12:32:41

微软开发 AI

2021-10-21 06:39:41

限流熔断系统

2014-11-24 13:30:47

苹果设计

2011-04-15 09:14:03

抄袭巨头IT

2020-12-29 09:23:40

分库分表订单

2011-09-15 12:13:42

乔布斯苹果

2022-04-19 16:07:26

iOS苹果安卓

2014-07-16 09:15:44

Android LiOS 8WP8.1

2015-11-02 10:18:54

日志RedstoneWindows 10

2020-09-15 16:01:28

无线数传模块

2024-05-21 08:40:21

分库分表源码

2015-08-05 10:39:54

知乎整理腾讯

2022-12-28 11:44:19

用户画像互联网用户信息

2023-11-01 11:34:40

用户画像企业

2021-06-09 11:28:04

用户画像标签

2020-11-30 09:15:00

Windows 功能系统

2021-10-20 07:18:51

Go语言设计
点赞
收藏

51CTO技术栈公众号