python 两个版本的比较 2018-11-24
2018-11-24 本文已影响0人
11的雾
python 两个版本的比较
python 3.4.1和python 2.4.1
版本升到3之后print后要加括号() 而且raw_input也取消了,只能用input了
上课
Python的新版本会引入新的功能,但是,实际上这些功能在上一个老版本中就已经存在了。要“试用”某一新的特性,就可以通过导入future模块的某些功能来实现。
例如,Python 2.7的整数除法运算结果仍是整数:
>>> 10 / 3
3
但是,Python 3.x已经改进了整数的除法运算,“/”除将得到浮点数,“//”除才仍是整数:
>>> 10 / 3
3.3333333333333335
>>> 10 // 3
3
要在Python 2.7中引入3.x的除法规则,导入future的division:
>>> from __future__ import division
>>> print 10 / 3
3.3333333333333335
当新版本的一个特性与旧版本不兼容时,该特性将会在旧版本中添加到future中,以便旧的代码能在旧版本中测试新特性。
from __future__ import unicode_literals
s = 'am I an unicode?'
print isinstance(s, unicode)
(1)部分返回值用view和Iterator取代了list
- dict的有些方法不再返回list,以前dict的dict.keys(),dict.items(),dict.values()是返回list的,现在变为返回views。比如以前用k=d.keys();k.sort(),现在改用:k=sorted(d)
- 去掉了dict的部分方法,dict.iterkeys(),dict.iteritems(),dict.itervalues()
- map()和filter()返回迭代器了
- range()变成以前的xrange()
- zip()返回迭代器了
(2)带排序的比较 - 简化了待排序的比较
- builtin.sorted()和list.sort()不再支持cmp作为参数,而改为key
- 取消了cmp()和cmp(),改用it(),以及用带hash()的eq()实现更加复杂的比较
(3)整型变量 - long改为int
- 类似于1/2这样的表达式返回float变量
- 去掉了sys.maxint
- represent()返回的值不再包含L后缀
- 八进制数值,不再是0720的形式,而变成0o720
(4)Unicode和8位字节的区别变为文本和数据的区别 - 从之前的Unicode字符串(unicode)和8位的字符串(str)变为文本的(str)和二进制的数据(bytes)
- 不能再用u"...",且对于二进制数据用b"..."
- 文本字符串和二进制数据之间不能再支持混用,需要转换时,可以用对用的str.encode()和bytes.decode(),或者bytes(s,encoding=...)和str(b,encoding=...)
- 反斜杠在原始字符串中就是字面意思,没有转义的含义。
- 去除了内置的抽象类型变量basestring而改用str
- 打开文件后返回的是解码后的Unicode字符串,加上b前缀后返回的是字节数组,所以也无需再用之前的codecs模块了。
- sys.stdin,sys.stdout和sys.stderr的初始值从io.TextIOBase改为仅支持Unicode字符串,如果想要这些字符流的字节数据,可以使用io.TextIOBase.buffer
- 文件名当做参数传递进入和返回时也都是Unicode字符串。
- 部分系统相关的API,比如os.environ和sys.argv,当系统用默认编码无法解析相关的字节时,可能会存在一些问题
- 字符串的repr()不再返回转义后的非ASCII字符,但仍会转义那些控制字符和非打印符。
- 默认字符串编码为UTF-8
- 非ASCII字符不允许用于标识符
- 去掉了StringIO和cStringIO模块,改为先导入io模块后在引用对应的io.StringIO或io.BytesIO
更多细节可以参考官网:http://docs.python.org/3/whatsnew/3.0.html#overview-of-syntax-changes