Python3.8的三个重要新功能


Python3.8官方文档

1. 海象运算符(:=)

Python3.8新推出了海象运算符,可以在表达式内部为变量赋值,在一定程度上可以提高程序的效率,减少代码量,让代码更加简洁。

用法:a := b

示例1:多次调用其他函数

a = [1,2,3,4,5,6,7,8,9,10]
if len(a) > 5:
    print(len(a))

在这个例子中,我们调用了两次len()函数。在以前,我们可以先将len(a)赋给一个变量len_a,然后再使用两次len_a,这样就可以实现只调用一次len()函数。这样虽然提升了效率,但代码却更为复杂了。在Python3.8中,我们可以用海象运算符来解决。

if (len_a := len(a)) > 5:
    print(len_a)

这样不仅使程序的效率得到了提升,代码也更加简洁。

类似的益处还可出现在正则表达式中,因博主还未学习过正则表达式,下面仅作官方文档的搬运:

类似的益处还可出现在正则表达式匹配中需要使用两次匹配对象的情况中,一次检测用于匹配是否发生,另一次用于提取子分组:

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
 discount = float(mo.group(1)) / 100.0

示例2:列表推导式

a = [1,2,3,4,5,6,7,8,9]
b = [i * 2 for i in a if i * 2 > 10]
print(b)

同样,我们使用了两次i * 2。下面我们来看看怎样用海象表达式对代码进行简化:

a = [1,2,3,4,5,6,7,8,9]
b = [j for i in a if (j := i * 2) > 10]
print(b)

在这里,我们对变量j是先出现,再定义,但实际上却是先执行了赋值操作。在可读性方面有所不足,但也有有利的一面。

示例3:大文件读取

with open('test.txt', mode='r', encoding='utf-8') as f:
    for line in f.readlines():
        print(line)

直接读取整个文件,文件小了无所谓,但对于大文件来说,占用的内存就太大了。通常的解决方法是不直接读取整个文件,而是逐行读取:

with open('test.txt', mode='r', encoding='utf-8') as f:
    while True:
        line = f.readline()
        if not line:
            break
        print(line)

我们也可以看到,效率虽然提升了,但是简洁性却变差了。下面,我们来看一下海象运算符如何处理。

with open('test.txt', mode='r', encoding='utf-8') as f:
    while line := f.readline():
        print(line)

我们可以直接在while判断语句里面使用海象运算符,这样既有了效率,又有了间接性。

2. 限制传参形式

Python有两种常见传参形式:位置传参和关键字传参。

def f(a, b):
    print(a, b)

f(1, 2)#位置传参,输出 ‘1 2’
f(b=4, a=3)#关键字传参,输出 ‘3 4’(传参时的顺序不影响)

2.1 仅限位置传参(’/‘)

def f(a, b, /):
    print(a, b)
   
f(1, 2) #Right
f(b=1, a=5) #ERROR!

在’/前面的参数必须使用位置传参,不能使用关键字传参,否则会报错。

2.2 仅限关键字传参

def f(*, a, b):
    print(a, b)
    
f(a=1, b=2) #Right
f(1, 2) #ERROR!

在’*‘后面的参数必须使用关键字传参,不能使用位置传参,否则会报错。

2.3 /*同时使用

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
    
test(1, 2, 3, 4, f=6, e=5) #1 2 3 4

/*可以一起使用,只要主意好位置顺序即可。

3. f-string支持:用于自动记录表达式和调试文档

在Python3.6之后,就有了format,具体形式如下:

user1 = '大头儿子'
user2 = '小头爸爸'
words1 = '老师说肺炎严重不要出门!'
words2 = '我在家都快要憋疯了!'

#使用format
print('{user1}说:{words1}\n{user2}说:{words2}'.format(user1=user1, user2=user2, words1=words1, words2=words2))
#大头儿子说:老师说肺炎严重不要出门!
#小头爸爸说:我在家都快要憋疯了!

可以看到,format()函数中需要输入大量数据,在实际操作时既复杂又容易出错。

在Python3.8中,使用f-string,具体形式如下:

print(f'{user1}说:{words1}\n{user2}说:{words2}')

只需要在字符串前面加上一个字母f,就可以省去原来的format()函数了,但是{}内的字符串必须和变量名一致。

以上就是Python3.8中三个个人认为最有用的新功能。完整更新内容可以查看Python3.8官方文档


文章作者: 恰醋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 恰醋 !
评论
  目录