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]

 

posted @ 2021-11-14 21:05  我用python写Bug  阅读(645)  评论(0编辑  收藏  举报