(windows) Python 2.7 学习笔记 三十二 使用 __future__
使用 __futre__
Python 的每个新版本会增加一些新的功能,或者对原来的功能做一些改动。有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了。
从 Python 2.7 到 Python 3.x 就有不兼容的一些改动,比如 2.x 里的字符串用 ‘xxx’ 表示 str,Unicode 字符串用 u’xxx’ 表示 Unicode,而在 3.x 中,所有字符串都被视为 Unicode,因此,写 u’xxx’ 和 ‘xxx’ 是完全一致的,而在 2.x 中以 ‘xxx’ 表示的 str 就必须写成 b’xxx’,以此表示“二进制字符串”。
要直接把代码升级成 3.x 是比较冒进的,因为有大量的改动需要测试。相反,可以在 2.7 版本中先在一部分代码中测试一些 3.x 的特性,如果没有问题,在移植到 3.x 不迟。
Python 提供了 __future__ 模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。举例说明如下:
为了适应 Python 3.x 的新的字符串的表示方法,在 2.7 版本的代码中,可以通过 unicode_literals 来使用 Python 3.x 的新的语法:
# still running on Python 2.7
from __future__ import unicode_literals
print '\'xxx\' is unicode?', isinstance('xxx', unicode)
print 'u\'xxx\' is unicode?', isinstance(u'xxx', unicode)
print '\'xxx\' is str?', isinstance('xxx', str)
print 'b\'xxx\' is str?', isinstance(b'xxx', str)
上面的代码在 Python 2.7 下运行,但结果显示去掉前缀 u 的 ‘a string’ 仍是一个 unicode,而加上前缀 b 的 b’a string’ 才变成了str:
D:\PythonBash>python task.py
'xxx' is unicode? True
u'xxx' is unicode? True
'xxx' is str? False
b'xxx' is str? True
D:\PythonBash>
类似的情况还有除法运算。在 Python 2.x 中,对于除法有两种情况,如果是整数相除,结果仍是整数,余数会被扔掉,这种除法叫“地板除”:
>>> 10 / 3
3
要做精确除法,必须把其中一个数变成浮点数:
>>> 10.0 / 3
3.3333333333333335
>>>
而在 Python 3.x 中,所有的除法都是精确除法,地板除用 // 表示:
安装 Python 3.7.2 报错:
无法启动此程序,因为计算机中丢失 api-ms-win-crt-runtime-ll-l-0.dll。
尝试重新安装程序以解决此问题。
参考资料:https://blog.csdn.net/fuchaosz/article/details/78996544
需要安装的文件:py372andfixfile
D:\python37>python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit
(AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 10 / 3
3.3333333333333335
>>> 10 // 3
3
>>>
如果你想在 Python 2.7 的代码中直接使用 Python 3.x 的除法,可以通过 __future__ 模块的 division 实现:
from __future__ import division
print '10 / 3 =', 10 / 3
print '10.0 / 3 =', 10.0 / 3
print '10 // 3 =', 10 // 3
结果如下:
D:\PythonBash>python calculate.py
10 / 3 = 3.33333333333
10.0 / 3 = 3.33333333333
10 // 3 = 3
由于 Python 是有社区推动的开源并且免费的开发语言,不受商业公司控制,因此,Python 的改进往往比较激进,不兼容的情况时有发生。Python 为了确保你能顺利过渡到新的版本,特别提供了 __future__ 模块,让你在旧版本中试验新版本的一些特性。