概述
随着Python在机器学习和数据科学领域的应用越来越广泛,相关的Python库也增长的非常快。但是Python本身存在一个非常要命的问题,就是Python2和Python3,两个版本互不兼容,而且Github上Python2的开源库有很多不兼容Python3,导致大量的Python2的用户不愿意迁移到Python3。 Python3在很多方面都做出了改变,优化了Python2的很多不足,标准库也扩充了很多内容,例如协程相关的库。现在列举一些Python3里提供的功能,跟你更好的从Python2迁移到Python3的理由。
系统文件路径处理库:pathlib
使用Python2的同学,应该都用过os.path这个库,来处理各种各样的路径问题,比如拼接文件路径的函数:,用Python3,你可以使用pathlib很方便的完成这个功能:
相比与函数,pathlib更加安全、方便、可读。pathlib还有很多其他的功能。
类型提醒: Type hinting
在Pycharm中,类型提醒是这个样子的:
类型提醒在复杂的项目中可以很好的帮助我们规避一些手误或者类型错误,Python2的时候是靠IDE来识别,格式IDE识别方法不一致,并且只是识别,并不具备严格限定。例如有下面的代码,参数可以是numpy.array , astropy.Table and astropy.Column, bcolz, cupy, mxnet.ndarray等等。
同样上面的代码,传入pandas.Series类型的参数也是可以,但是运行时会出错。
这还只是一个函数,对于大型的项目,会有好多这样的函数,代码很容易就跑飞了。所以确定的参数类型对于大型项目来说非常重要,而Python2没有这样的能力,Python3可以。
目前,比如JetBrains家的PyCharm已经支持Type Hint语法检查功能,如果你使用了这个IDE,可以通过IDE功能进行实现。如果你像我一样,使用了SublimeText编辑器,那么第三方工具mypy可以帮助到你。 PS:目前类型提醒对ndarrays/tensors支持不是很好。
运行时类型检查:
正常情况下,函数的注释处理理解代码用,其他没什么用。你可以是用来强制运行时检查类型。
使用@特殊字符表示矩阵乘法
如下代码:
使用@符号,整个代码变得更可读和方便移植到其他如等库。
**特殊字符来递归文件路径
在Python2中,递归查找文件不是件容易的事情,即使使用glob库,但是python3中,可以通过通配符简单的实现。
和之前提到的一起使用,效果更好:
Print函数
打印到指定文件
不使用join函数拼接字符串
重写print函数
再比如下面的代码
虽然上面这段代码也能达到重写print函数的目的,但是不推荐使用。
字符串格式化
python2提供的字符串格式化系统还是不够好,太冗长麻烦,通常我们会写这样一段代码来输出日志信息:
输出的结果是:
python3.6的f-strings功能实现起来就简单多了。
而且,在编写查询或生成代码片段时非常方便:
严格排序
下面这些比较操作在python3里是非法的
不同类型的数据无法排序
NLP Unicode问题
下面这段代码在Python2里运行失败但是Python3会成功运行,Python3的字符串都是Unicode编码,所以这样对NLP来说很方便,再比如:
字典
CPython3.6+里的dict默认的行为和orderdict很类似
同样的,**kwargs字典内容的数据和传入参数的顺序是一致的。
Iterable unpacking
更高性能的默认pickle engine
缩短到Python2时间的1/3
更安全的列表推导
更简易的super()
Multiple unpacking
合并两个Dict
Python3.5+不仅仅合并dict很方便,合并list等也很方便
整数类型
python2提供了两个整数类型:int和long,python3只提供有个整数类型:int,如下的代码:
总结
python3提供了很多新的特性,方便我们编码的同时,也带来了更好的安全性和较高的性能。而且官方也一直推荐尽快迁移到python3。当然,迁移的代价因系统而异,希望这篇文章能对你迁移python2到python3有些帮助。
延伸推荐
领取专属 10元无门槛券
私享最新 技术干货