炼数成金 门户 大数据 Python 查看内容

Python3.8正式发布!新特性解析在这里

2019-10-18 10:38| 发布者: 炼数成金_小数| 查看: 20108| 评论: 0|原作者: 诗书塞外|来自: Python程序员

摘要: 10月14日,Python 3.8 正式版发布。这也意味着一个Python开发周期的结束,和另一个开发周期的开始。Python 3.9 预计在2020年10月份发布。Python项目中一个常见的麻烦就是清理git代码库中的__pycache__文件,这些文件 ...

Python 语法

10月14日,Python 3.8 正式版发布。这也意味着一个Python开发周期的结束,和另一个开发周期的开始。Python 3.9 预计在2020年10月份发布。

那么Python 3.8都带来了什么新特性和什么新改动呢?让我们来盘点一下。

新特性
1、赋值表达式
顾名思义,就是在表达式中进行赋值。这个特性总体来说是一个语法糖,让代码看起来更简洁了一点点。比如,下面这段代码:
n = len(a)
if (n) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
在Python 3.8中可以写为:
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

如果n这个变量只有在if语句及子句中使用,那么明显Python 3.8的写法更为简洁。其中Python 3.8中用到的操作符:=被称为海象操作符(因为这个操作符看起来像海象的眼睛和一对儿长牙)。

嗯,你看,像不像?

这个特性的另外两个典型例子是在while语句,以及列表推导中,像这样:
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]

2、限定位置参数
这个特性允许你通过在函数参数列表中加一个"/",来表示"/"之前的参数只能够当作位置参数使用。下面我们看一个例子:
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
这个例子中,a、b只能当作位置参数使用,e、f只能当作关键字参数使用(如果你不知道为什么,请复习*和**的用法),而c、d即可以用作位置参数,也可以用作关键字参数。

这个特性主要是库或者基础代码的作者使用,它让基础代码的作者不必为参数起一个固定的名字,参数名字调整也不会破坏调用者的代码。没有这个特性之前,有的调用者会对每个参数都以关键字参数的形式调用,这就导致了库作者一改参数名,调用代码就崩溃。

另外,还有的库函数根本不适合用名字传参,比如我们常见的add函数,add(1, 2)明显表意性要好于add(a=1, b=2),add的参数无论起什么名字,都感觉是多余的。

3、支持将编译字节码文件输出到其他位置
Python项目中一个常见的麻烦就是清理git代码库中的__pycache__文件,这些文件往往是你一不小心就添加进去了,清理起来却颇为麻烦。Python 3.8支持通过设置环境变量 PYTHONPYCACHEPREFIX ,让__pycache__生成到其他位置,而不跟.py文件混在一起。你在代码中可以通过 sys.pycache_prefix 查看生成的位置。

4、F字符串内的'='表达式
在调试的时候,你是否经常会写这样的代码?
>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'user={user} member_since={member_since}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
其中user={user},member_since={member_since}就是典型的样板代码。在Python 3.8中,你可以简写为:
>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
一个等号,f字符串就知道你需要在等号后面继续把等号前面变量的值显示出来。对于调试来说,这确实更加简洁了。

5、pickle协议5,独立处理内存中的数据缓存。
Python进程之间传输数据时,pickle是经常用到的。对于数据量大的情况,妥善管理并优化内存使用是非常重要的。Python3.8 中对pickle的数据传输做了优化,提高了性能和效率。

其他改动
1、finally语句中可以有continue子句了,以前是不行的。
2、函数调用时,f((keyword)=arg) 这种写法不再允许了。
3、新增模块importlib.metadata,用以读取第三方包的信息。

声明:本文版权归原作者所有,文章收集于网络,为传播信息而发,如有侵权,请联系小编及时处理,谢谢!

欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708

Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967 

鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

 

GMT+8, 2019-11-19 00:14 , Processed in 0.176720 second(s), 25 queries .