# Python 3 与 Python 2 的区别
Python 3 在设计时, 为了不带上太多历史包袱, 所以没有考虑完全的向下兼容. 因此, 早期的 Python 代码无法在 Python 3 上运行.
为了平稳过渡, 官方将 Python 2.6 作为过渡版本, 沿用 Python 2 的语法和库的同时, 允许 2.6 版本使用部分的 Python 3 语法与函数.
- 对于新程序, 建议使用 Python 3
- 对于旧程序, 建议按照下面的规则改写成 Python 3
- 如果暂时无法使用 3, 建议使用 Python 2.6, 编写兼容于 Python 3 的程序
# 默认编码
Python 2 默认编码是 ASCII.
因为中文版的 Windows 操作系统使用的是 GBK 编码, 所以 Python 2 程序中的中文在 Windows 终端中会显示乱码. 如果需要使用中文字符串:
- 需要在开头声明 UTF-8 编码:
#coding:utf-8
, 等于告诉操作系统"不要使用系统默认的编码表, 而是使用 UTF-8 编码表来解码" - 如果碰到中文字符串, 则使用
decode('utf-8')
解码成 Unicode 万国码
Python3 已经将默认编码改为 Unicode, 所以不存在乱码问题, 可以方便地使用中文字符串, 不需要转化.
# 数据类型
Python 3 去除了 long 类型, 现在只有一种整型 -- int, 其实它的行为就像 Python 2 版本的 long 类型.
# 八进制
Python 3 中, 表示八进制字面量的方式只有一种, 就是0o1000
, 原来 Python 2 支持的 01000
形式不能用了.
0o1000 中的 o = octal / 八进制
# Python 2 中
0o1000 # → 512
01000 # → 512
1
2
3
2
3
# Python 3 中
0o1000 # → 512
01000 # 报错, SyntaxError
1
2
3
2
3
# 除法
Python 中的除法有 2 个运算符: /
和 //
- 在 Python 2 中
/
除法跟我们熟悉的大多数语言一样 (比如 Java 和 C):- 整数相除的结果是一个整数, 把小数部分完全忽略掉
- 浮点数地除法会保留小数点的部分, 得到一个浮点数的结果
- 在 Python 3 中
/
除法不再这么做了, 对于整数之间的相除, 结果也会是浮点数
# 在 Python 2 中
1 / 2 # → 0
1.0 / 2.0 # → 0.5
# 在 Python 3 中
1 / 2 # → 0.5
1.0 / 2.0 # → 0.5
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 不等于
Python 2 中不等于有 2 种写法: !=
和 <>
Python 3 中去掉了<>
, 只有!=
这一种写法
# print 函数
print
语句没有了, 取而代之的是 print()
函数
# 在 Python 2.6 中, 以下 2 种形式是等价的
# 注意,如果没有导入 __future__ 包, 这里的 print() 函数不能使用其他参数
print "Hello" #语句
print ("Hello") #函数
# 如果导入 __future__ 包, 就可以使用 3.x 完整的函数语法, 但是 print 语句被禁止使用
from __future__ import print_function
print("Hello", "World", sep=', ') # → Hello, World
print "Hello" # 报错
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# range 函数
- 在 Python 2 中, 用
xrange()
创建迭代对象的用法非常流行. 比如, 用在 for 循环、列表、集合、字典 - 在 Python 3 中,
range()
的功能完全替代了xrange()
, 所以 xrange() 这个专门函数被取消. 如果在 Python 3 中使用xrange()
会抛出命名异常
# 异常
- 在 Python 3 中使用 as 作为关键词. 捕获异常的语法从 except exc var 改为 except exc as var. 且
except (exc1, exc2) as var
可以同时捕获多种类别的异常. Python 2.6 支持这两种语法 - 在 Python 2 中, 所有类型的对象都是可以被直接抛出的. 在 Python 3 中, 只有继承自 BaseException 的对象才可以被抛出
- Python 2 中 raise 语句使用逗号将抛出对象类型和参数分开, Python 3 取消了这种奇葩的写法, 直接调用构造函数抛出对象即可
- 在 Python 2 中, 异常在代码中除了表示程序错误, 还经常做一些普通控制结构应该做的事情. 在 Python 3 中可以看出, 设计者让异常变的更加专一, 只有在错误发生的情况才能用异常捕获语句来处理