鱼C论坛

 找回密码
 立即注册
查看: 1492|回复: 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的新的语法:

  1. # still running on Python 2.7

  2. from __future__ import unicode_literals

  3. print '\'xxx\' is unicode?', isinstance('xxx', unicode)
  4. print 'u\'xxx\' is unicode?', isinstance(u'xxx', unicode)
  5. print '\'xxx\' is str?', isinstance('xxx', str)
  6. 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 中,对于除法有两种情况,如果是整数相除,结果仍是整数,余数会被扔掉,这种除法叫 “地板除”:

  1. >>> 10 / 3
  2. 3
复制代码


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

  1. >>> 10.0 / 3
  2. 3.3333333333333335
复制代码


而在Python 3.x中,所有的除法都是精确除法,地板除用//表示:

  1. $ python3
  2. Python 3.3.2 (default, Jan 22 2014, 09:54:40)
  3. [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> 10 / 3
  6. 3.3333333333333335
  7. >>> 10 // 3
  8. 3
复制代码


如果你想在 Python 2.7 的代码中直接使用 Python 3.x 的除法,可以通过 __future__ 模块的 division 实现:

  1. from __future__ import division

  2. print '10 / 3 =', 10 / 3
  3. print '10.0 / 3 =', 10.0 / 3
  4. print '10 // 3 =', 10 // 3
复制代码


结果如下:

  1. 10 / 3 = 3.33333333333
  2. 10.0 / 3 = 3.33333333333
  3. 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-5-18 22:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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