Chow's Notes

python3中一些变化总结

1.Python 2 对于int[整型]long[长整型] 采用不同的数据类型。int 数据类型受到 sys.maxint 的限制,因平台该限制也会有所不同,但通常是 $2^32-1$。Python 3 只有一种整数类型,其行为方式很有点像 Python 2 的旧 long[长整数] 类型。

2.在 Python 2 中,运算符 / 通常表示整数除法,但是可以通过在代码中加入特殊指令,使其看起来像浮点除法。在 Python 3 中,/ 运算符总是表示浮点除法。

3.在Python 3,所有的字符串都是使用Unicode编码的字符序列。不再存在以UTF-8或者CP-1252编码的情况。也就是说,“这个字符串是以utf-8编码的吗?不再是一个有效问题。”utf-8是一种将字符编码成字节序列的方式。如果需要将字符串转换成特定编码的字节序列,Python 3可以为你做到。如果需要将一个字节序列转换成字符串,Python 3也能为你做到。字节即字节,并非字符。字符在计算机内只是一种抽象。字符串则是一种抽象的序列。

在Python 2中,字符串是一个字节数组,它的字符编码信息被分开记录着。如果想要Python 2跟踪字符编码,你得使用Unicode编码的字符串(u'')。但是在Python 3中,字符串永远都是Python 2中所谓的Unicode编码的字符串 — 即,Unicode字符数组(可能存在可变长字节)。

4.python3中print只能当函数使用

5.字节即字节;字符是一种抽象。一个不可变(immutable)的Unicode编码的字符序列叫做string。一串由0到255之间的数字组成的序列叫做bytes对象。

6.bytes对象有一个decode()方法,它使用某种字符编码作为参数,然后依照这种编码方式将bytes对象转换为字符串(解码),对应地,字符串有一个encode()方法,它也使用某种字符编码作为参数,然后依照它将串转换为bytes对象(编码)。

7.Python 2里,.py文件默认的编码方式为ascii。Python 3的源码的默认编码方式为utf-8

8.python2迭代器类实现的是next方法,python3实现的是next方法。iter(f) 调用 f.iter next(f) 调用 f.next

9.range(1,10)python2返回的是一个序列,py3返回的是一个视图,zip()函数类似

10.字符串的translate()方法,字符串翻译。在py2中需要一个由256个字符组成的字符串转换表(通常的做法是用string模块的maketrans方法生成一个转换表),在py3中,转换表就是一个将一个字符映射到另一个字符的字典。实际上,“字符” 是不正确的 — 转换表实际上是将一个 字节(byte)映射到另一个。,Python 3 中的字节是整形数。所以一个通常的转表如{ord(‘A’): ord(‘O’)}

11.with 代替try…finally..解决打开文件出现异常的情况。with语句创建了一个运行时环境(runtime context)

12.io.StringIO让你能够将一个字符串作为文本文件来看待。另外还有一个io.ByteIO类,它允许你将字节数组当做二进制文件来处理。py27中StringIO,只能接收unicode字符串

13.类定义中两个特殊的方法enter()在进入一个上下文环境时Python会调用它(,在with语句的开始处) exit()当离开一个上下文环境时(,在with语句的末尾)

14.用于和httpweb 服务交互的库:py33自带http.clienturllib.request(py33 urllib.request.urlopen ,py27 urllib.urlopen),py33中没有了urllib2,py27 没有http.client
http.client 是实现了rfc 2616, http 协议的底层库urllib.request 建立在http.client之上一个抽象层。 它为访问httpftp 服务器提供了一个标准的api,可以自动跟随http 重定向, 并且处理了一些常见形式的http 认证。

httplib2,一个第三方的开源库,它比http.client更完整的实现了http协议,同时比urllib.request提供了更好的抽象。httplib2对于Python 2.x 和 Python 3.x都有对应的版本

Python的http库不支持缓存,而httplib2支持。

Python的http 库不支持最后修改时间检查,而httplib2 支持。

Python的 http库不支持压缩,但httplib2支持

urllib.request模块在从http服务器收到对应的状态码的时候会自动“跟随”重定向, 但它不会告诉你它这么干了。你最后得到了你请求的数据,但是你永远也不会知道下层的库友好的帮助你跟随了重定向。结果是,你继续访问旧的地址,每一次你都会得到新地址的重定向,每一次urllib.request模块都会友好的帮你跟随重定向。换句话说,它将永久重定向当成临时重定向来处理。这意味着两个来回而不是一个,这对你和服务器都不好。

httplib2 帮你处理了永久重定向。它不仅会告诉你发生了永久重定向,而且它会在本地记录这些重定向,并且在发送请求前自动重写为重定向后的url

httplib2:http://woodpecker.org.cn/diveintopython3/http-web-services.html

15.Python 3自带了一个叫做2to3的实用脚本,它使用Python 2的源代码作为输入,然后尽其可能地将其转换到Python 3的规范。

16.在Python 3中相对导入的逻辑已经变了。在Python 2中,我们只需要import constants,然后它就会首先在chardet/目录中查找。在Python 3中,所有的导入语句默认使用绝对路径。如果想要在Python 3中使用相对导入,
你需要显式地说明 from .import constants

python2与python3的区别

http://woodpecker.org.cn/diveintopython3/porting-code-to-python-3-with-2to3.html