# 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
# Python 3 中
0o1000  # → 512
01000  # 报错, SyntaxError
1
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

# 不等于

Python 2 中不等于有 2 种写法: !=<>

Python 3 中去掉了<>, 只有!=这一种写法

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

# range 函数

  • 在 Python 2 中, 用 xrange() 创建迭代对象的用法非常流行. 比如, 用在 for 循环、列表、集合、字典
  • 在 Python 3 中, range() 的功能完全替代了 xrange(), 所以 xrange() 这个专门函数被取消. 如果在 Python 3 中使用 xrange()会抛出命名异常

# 异常

  1. 在 Python 3 中使用 as 作为关键词. 捕获异常的语法从 except exc var 改为 except exc as var. 且 except (exc1, exc2) as var 可以同时捕获多种类别的异常. Python 2.6 支持这两种语法
  2. 在 Python 2 中, 所有类型的对象都是可以被直接抛出的. 在 Python 3 中, 只有继承自 BaseException 的对象才可以被抛出
  3. Python 2 中 raise 语句使用逗号将抛出对象类型和参数分开, Python 3 取消了这种奇葩的写法, 直接调用构造函数抛出对象即可
  4. 在 Python 2 中, 异常在代码中除了表示程序错误, 还经常做一些普通控制结构应该做的事情. 在 Python 3 中可以看出, 设计者让异常变的更加专一, 只有在错误发生的情况才能用异常捕获语句来处理