Python3.8新特性摸索总结
发布时间:2020-12-15
浏览量: 1233
文章分类: python
python3.8出了已经一段时间了,之前大部分时间用的都是python3.6,并没有关注python3.8的特性,刚好看到了别人整理的文章有说到了3个点,我就一起试了试,顺带整理这篇文章。先说结论吧,并没有太多惊喜。可能在日常开发中也只有限制传参形式有一些帮助。
本次的三个新特性分别是 + 海象运算符 + 限制传参形式 + f-string 增强
那么接下来废话不多,直接开始。
海象运算符 :=
需求:假设有一个列表,我们需要统计列表的长度,判断如果长度超过x,则输入长度。 之前的方式
a = [2,1,6,3,5,4,9,7,8]
# 这个方法不太好,多了一次len()计算
if (len(a)) > 5:
print(len(a))
#有经验的人可能会这样
# 这个方法是多了一行变量存储的代码,但是节省了一次运算
len_a = len(a)
if len_a > 5:
print(len_a)
# 新的方法
if ( len_a := len(a) > 5):
print(len_a)
其实新的方法也就是在判断赋值的时候,直接判断条件,然后赋值。
在举个例子:比如我想在列表中取出2 >10的数,在2放在一个新列表中,这个时候一般大家都会用列表推导式
# 之前的方式是
a = [2,1,6,3,5,4,9,7,8]
b = [i * 2 for i in a if i * 2 > 10] # 这样就可以快速生成一个新的列表了。在列表中直接计算,但是缺点就是计算了2次
# 使用海象运算符可以如下优化
b = [j for i in a if (j := i *2) > 10] # 同样有个问题,就是多了一个变量存储
在比如操作文件读取,如果文件较小,可以直接读取,但是如果文件较大,一般我们都是逐行读取
# 原方法
with open('1.txt' , mode='r' ,encoding='utf-8') as f:
while True:
line = f.readline()
if not line:
break
print(line)
# 使用海象运算符简化
with open('1.txt' , mode='r' ,encoding='utf-8') as f:
while line := f.readline():
print(line)
限制传参形式
这个我觉得还是有一点用的,而且理解也不难
def test(a ,b):
print(a ,b)
# 一个常规的参数,我们用下面的方法调用都是可以的
test(1,2)
test(a=3,b=4)
test(b=5,a=6)
# 下面我们改进一下
def test(a ,b , /):
print(a ,b)
# ‘/’这个的意思就是只允许位置传参
test(1, 2) # 没有问题
test(a=3,b=4) # 报错 TypeError: test() got some positional-only arguments passed as keyword arguments: 'a, b'
# ‘*’这个的意思就是只允许关键词传参
def test(* , a ,b ):
print(a ,b
test(a=3,b=4) # 没有问题
test(b=5,a=6) # 打乱顺序也是可以的
test(1, 2) # SyntaxError: named arguments must follow bare *
# 混合使用(有点乱,不建议使用)
def test(a,b,/,e,f,*,c,d):
print(a,b,c,d,e,f)
test(1,2,5,6,c=3,d=4)
f-string 格式化字符串增强
额。这个没什么好说的,之前的其实已经满足了我的需求,直接丢下来,大家自己看看吧
user = 'endpein'
words = '欢迎来到我的博客~'
print('%s:%s'%(user,words))
print('{user}:{words}'.format(user=user,words=words))
print(f'{user}:{words}')
print(f'{user=}:{words=}') # 增强了,输出key、value