博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
__future__
阅读量:5075 次
发布时间:2019-06-12

本文共 1744 字,大约阅读时间需要 5 分钟。

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

从python2.7到python3.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__模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。举例说明如下:

为了适应python3.x的新的字符串的表示方法,在2.7版本的代码中,可以通过unicode_literals来使用python3.x的新的语法

# still running on Python 2.7from __future__ import unicode_literalsprint '\'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)

注意到上面代码仍然在python2.7下运行,但结果显示去掉前缀u的‘a string’仍是一个unicode,而加上前缀b的b'a string才变成了str

$ python task.py'xxx' is unicode? Trueu'xxx' is unicode? True'xxx' is str? Falseb'xxx' is str? True

类似的情况还有除法运算,在python2.x中,对于除法有两种情况,如果是整数相除,结果仍是整数,余数会被扔掉,这种除法叫地板除

>>> 10 / 33

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

>>> 10.0 / 33.3333333333333335

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

$ python3Python 3.3.2 (default, Jan 22 2014, 09:54:40) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> 10 / 33.3333333333333335>>> 10 // 33

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

from __future__ import divisionprint '10 / 3 =', 10 / 3print '10.0 / 3 =', 10.0 / 3print '10 // 3 =', 10 // 3

结果如下:

10 / 3 = 3.3333333333310.0 / 3 = 3.3333333333310 // 3 = 3

小结

由于python是由社区推动的开源并且免费的开发语言,不受商业公司控制,因此,python的改进往往比较激进,不兼容的情况时有发生。python为了确保你能顺利过渡到新版本,特别提供了__future__模块,让你在旧的版本中体验新版本的一些特性

转载于:https://www.cnblogs.com/z-x-y/p/9212321.html

你可能感兴趣的文章
oracle plsql 统计
查看>>
Nginx + uWSGI 部署Django 项目,并实现负载均衡
查看>>
迭代器和生成器
查看>>
GestureDetector
查看>>
hdu3111解数独。简单深搜不带剪枝
查看>>
CodeFirst写界面——自己写客户端UI库
查看>>
给图片、表格、公式自编号
查看>>
Qt计算器开发(二):信号槽实现数学表达式合法性检查
查看>>
lucene
查看>>
ajax-jq
查看>>
poj2773 容斥原理
查看>>
poj3061 尺取法
查看>>
RMAN-08137: 警告: 因为仍需要归档日志, 所以未删除 问题解决
查看>>
Facebook的Libra “区块链”到底是如何运作的?
查看>>
Mysql数据库备份和还原常用的命令
查看>>
关于String s = new String("xyz");创建了几个字符串对象?的问题
查看>>
学习搭建S3C6410开发板的测试环境心得
查看>>
表单重复提交与解决
查看>>
HOJ---12500 Faculty Dividing Powers[数论]
查看>>
【例题 6-11 UVA-297】Quadtrees
查看>>