(windows) Python 2.7 学习笔记 三十二 使用 __future__

使用 __futre__

Python 的每个新版本会增加一些新的功能,或者对原来的功能做一些改动。有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了。

Python 2.7Python 3.x 就有不兼容的一些改动,比如 2.x 里的字符串用 ‘xxx’ 表示 strUnicode 字符串用 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,而加上前缀 bb’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__ 模块,让你在旧版本中试验新版本的一些特性。

发表评论

zh_CNChinese
zh_CNChinese