鱼C论坛

 找回密码
 立即注册
查看: 1837|回复: 3

[技术交流] Python2.x 使用 __future__

[复制链接]
发表于 2020-3-6 12:18:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一个账号 于 2020-3-6 16:35 编辑

Python2.x 使用 __future__


本文转载于 廖雪峰的官方网站。


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:

$ python task.py
'xxx' is unicode? True
u'xxx' is unicode? True
'xxx' is str? False
b'xxx' is str? True

类似的情况还有除法运算。在 Python 2.x 中,对于除法有两种情况,如果是整数相除,结果仍是整数,余数会被扔掉,这种除法叫 “地板除”:
>>> 10 / 3
3

要做精确除法,必须把其中一个数变成浮点数:
>>> 10.0 / 3
3.3333333333333335

而在Python 3.x中,所有的除法都是精确除法,地板除用//表示:
$ python3
Python 3.3.2 (default, Jan 22 2014, 09:54:40)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
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

结果如下:
10 / 3 = 3.33333333333
10.0 / 3 = 3.33333333333
10 // 3 = 3

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-6 16:33:58 | 显示全部楼层
这是基于 Python 2 的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 16:34:51 | 显示全部楼层
zltzlt 发表于 2020-3-6 16:33
这是基于 Python 2 的

我知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 16:35:41 | 显示全部楼层
zltzlt 发表于 2020-3-6 16:33
这是基于 Python 2 的

帖子又进入审核了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 11:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表