新版本python3.8已经发布
作为一个放弃java转投 python 很多年的数据开发者,已经好久没有更新python了,也很久没有关注python的一些新功能新特性了,去年把自己做的几个小项目更新到了python3.6,然后就一直没把精力放到这一块了。
今天因为安装一个第三方库失败,打算去官网看下 Python 的更新情况,发现已经更新至python3.8.2了,那么就当机立断下载安装,顺便学习一下python3.8的新特性吧。
安装python3.8.2
- windows下的安装很简单,直接下载msi安装文件双击就可以了,然后稍微配置一下环境变量。
- Linux下稍微复杂一点,主要是因为没有合适的yum安装包,具体步骤如下:
# 下载源码
wget
# 解压
tar zxf Python-3.8.2.tgz Python-3.8.2/
# 进入文件夹
cd Python-3.8.2/
# 编译前准备
yum update -y
yum groupinstall -y 'Development Tools'
yum install -y gcc openssl-devel bzip2-devel libffi-devel
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
# 编译安装
./configure prefix=/usr/local/python3.8 --enable-optimizations
make && make install
# 添加环境变量
export PATH=$PATH:/usr/local/python3.8/bin/
主要的新特性
Assignment expressions 海象 运算符
Python 3.8.0 有一个新的语法:=,它将值赋给一个更大的表达式中的变量。它被亲切地称为 “海象运算符”(walrus operator) ,因为它长得像海象的眼睛和象牙。
之前学了一直很自GOLANG,感觉python这次在想GOLANG学习,就像JAVA在学习python一样。
现在让我们看看下面的代码段:
a = range(15)
if (len(a)) > 10:
print(f"List is too long ({len(a)} elements, expected <= 10)")
在这个代码段中,我们将调用函数 len()两次。有什么方法可以避免重新调用以提高可读性吗?是的,在改进代码之后,我们得到了以下结果:
a = range(15)
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
请尽量将海象运算符的使用限制在清晰的场合中,以降低复杂性并提升可读性。
Positional-only parameters 仅限位置形参
新增了一个函数形参语法 / 用来指明某些函数形参必须使用仅限位置而非关键字参数的形式。 这种标记语法与通过 help() 所显示的使用 Larry Hastings 的 Argument Clinic 工具标记的 C 函数相同。。
# 在下面的例子中,形参 a 和 b 为仅限位置形参,c 或 d 可以是位置形参或关键字形参,而 e 或 f 要求为关键字形参:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
# 合法的
f(10, 20, 30, d=40, e=50, f=60)
# 不合法的
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
这种标记形式的一个用例是它允许纯 Python 函数完整模拟现有的用 C 代码编写的函数的行为。 例如,内置的 divmod() 函数不接受关键字参数:
def divmod(a, b, /):
"Emulate the built in divmod() function"
return (a // b, a % b)
Python 初始化配置(改进的嵌入)
新增的 PYTHONPYCACHEPREFIX 设置 (也可使用 -X pycache_prefix) 可将隐式的字节码缓存配置为使用单独的并行文件系统树,而不是默认的每个源代码目录下的 pycache 子目录。
缓存的位置会在 sys.pycache_prefix 中报告 (None 表示默认位置即 pycache 子目录)。
f – 字符串 支持 = 用于自动记录表达式和调试文档
增加 = 说明符用于 f-string。 形式为 f'{expr=}’ 的 f – 字符串将扩展表示为表达式文本,加一个等于号,再加表达式的求值结果。 例如:
>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
通常的 f 字符串格式说明符 允许更细致地控制所要显示的表达式结果:
>>> delta = date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'user=eric_idle delta.days=16,075'
= 说明符将输出整个表达式,以便详细演示计算过程:
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')
theta=30 cos(radians(theta))=0.866
其他新特性
- 正则表达式添加对 \N{name} 专业词汇的支持
>>> notice = 'Copyright © 2019'
>>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s(\d{4})')
>>> int(copyright_year_pattern.search(notice).group(1))
- Dict and dictviews are now iterable in reversed insertion order using reversed()
- 剩下的特性就比较偏僻了,就不一一介绍了,感兴趣的同学可以直接参考官方文档,python3.8更新内容。