Python3新特性总结 -- 持续更新
一、Python3.6新特性
1、格式化字符串:f-string
f-string(formatted string literals):格式化字符串常量,是Python3.6新引入的一种字符串格式化方法,使格式化字符串的操作更加简便。
新的格式化字符串方式,即在普通字符串前添加 f 或 F 前缀,其效果类似于str.format()
1. 语法 f'xxx' 或 F'xxx' 且以大括号 {} 表明被替换的字段,{}里面可以是字符串或者表达式 2. 简单替换字符串:{'字符串'} name = '小白' msg = f'我叫{name},今年{18}岁,性别{"男"}' print(msg) # 我叫小白,今年18岁,性别男 注意:若f使用的是单引号,那么里面的{}若是字符串则应该用双引号,反之一样 3. 计算表达式:{表达式} ret = f"1 add 2 is {1+2}" print(ret) # 1 add 2 is 3 4. lambda表达式:{(lambda表达式) (参数)} 注意: lambda表达式的 : 会被f-string误认为是表达式与格式描述符之间的分隔符, 为避免歧义,需要将lambda表达式置于括号 () 内: func = f"my_add result:{(lambda x,y:x+y) (1,2)}" print(func) # my_add result:3 若不加括号则报错: func = f"my_add result:{lambda x,y:x+y (1,2)}" print(func) File "<fstring>", line 1 (lambda x,y) ^ SyntaxError: unexpected EOF while parsing 5. f-string用法很强大,这里只是写出了一些常用的方法,感兴趣可以自己去研究其他用法
2、变量声明语法
语法:
参数: 类型[子元素类型...]
from typing import List, Dict, Set, AnyStr """ 注意: 实例化列表和字典的是内置参数,小写的 list, dict, set 变量声明的列表和字典的是typing导入的参数,大写的 List, Dict, Set """ my_list_1: List # 声明了一个列表 my_list_2: List[int] = [1, 2, 3] # 声明了一个列表且list里面的元素为 int 并初始化 myDict: Dict[str, int] = {} # 声明了一个字典,key为字符串,值为int 并初始化 myStr: AnyStr # 声明此参数为字符串 my_list_1 = [] my_list_1.append(1) # 元素为int,正常,无高亮提示 my_list_1.append("a") # 元素为字符串,正常,无高亮提示 print(my_list_1) my_list_2.append(4) # 元素为int,正常插入数据 my_list_2.append("a") # 元素为字符串,跟声明不一致,会高亮提示,但是一样能正常插入数据 print(my_list_2) myDict["x"] = 123 # key为字符串,值为int 正常,无高亮提示 myDict[111] = "aa" # key为int,值为字符串 跟声明不一致,会高亮提示,但是一样能正常插入数据 print(myDict) myStr = "hello world" # 元素为字符串,正常,无高亮提示 print(myStr)
3、数字的下划线写法
# 允许在数字中使用下划线,以提高多位数字的可读性 a = 9_999_000_000_000_000 # 9999000000000000 b = 0x_BB_CC_FF_FF # 3150774271 # 数字字符串格式化也支持 _ c = '{:_}'.format(9990000) # 9_990_000 d = '{:_}'.format(0xBBCCFFFF) # 3_150_774_271 e = '{:_x}'.format(0xBBCCFFFF) # bbcc_ffff
4、异步生成器
在Python3.5中,引入了新的语法 async 和 await 来实现协同程序。
但是不能在同一个函数体内同时使用 yield 和 await。
Python3.6中,则没有这个限制,允许定义异步生成器。
允许在列表list、集合set 和字典dict 解析器中使用 async 或 await 语法。
待我研究下async 和 await...
5、新增加模块
标准库(The Standard Library)中增加了一个新的模块:secrets
该模块用来生成一些安全性更高的随机数,用于管理passwords, account authentication, security tokens, 以及related secrets等数据。
更多新特性请查看官网:https://docs.python.org/3.6/whatsnew/3.6.html
二、Python3.7新特性
三、Python3.8新特性
1、海象表达式
在Python3.8中新添加了赋值表达式 := ,它被亲切地称为“海象操作员”,因为它与海象的眼睛和象牙相似。
官方推荐使用“海象表达式”来降低代码的复杂性和可读性。
我的理解是,海象表达式能够在赋值的同时使用这个参数,简化了代码。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 如果我们想要判断一个列表的长度是否大于10, 如果大于10我们就提示并打印列表长度,一般我们可以这么写: if len(a) > 10: print("列表过长,一共有{}个元素".format(len(a))) # 在这里我们调用了两个 len() 函数,有人肯定会说,我先定义变量,也可以只调用一次啊,那么我们换个写法: n1 = len(a) if n1 > 10: print("列表过长,一共有{}个元素".format(n1)) # 这么说也对,只调用一次len,但是增加了一行代码,在程序员的角度来说,代码越简洁越好 # 那么可以试试海象表达式 if (n := len(a)) > 10: print(f"列表过长,一共有{n}个元素") # 在比较 len(a) 与 10 的同时,将 len(a) 的值赋给 n # 在下面打印的时候使用 n 就可以了,这样即避免调用两次 len(),代码量也减少。 # 比如在实际中我们可以这样简化代码: # 查找long>10的长度 peoples = [ {"name": "张三", "age": 17, "long": 7}, {"name": "李四", "age": 18, "long": 15}, {"name": "王五", "age": 50, "long": 18}, ] # 平常的写法 result = [] for person in peoples: long = person["long"] if long > 10: result.append(long) # 海象表达式 result = [long for person in peoples if (long := person["long"]) > 10]