以下为个人学习笔记整理

# python2 对比 python3 差异

​ print 不再是一个关键字,而是作为一个函数被使用。

Old: print "The answer is", 2*2
New: print("The answer is", 2*2)

# Views And Iterators Instead Of Lists

​ 部分函数的返回不再是 「list」 而是 「view」 或者 「iterators」

Old: list = dict.keys() 
New: iterator = dict.keys()

​ 不再支持部分接口

.iterkeys()
.iteritems()
.itervalues()

​ 部分函数的返回值修改为 iterator

zip()
map()
filter()

​ range 功能和 xrange 保持一致,xrange 不再被使用。

##Ordering Comparisons

​ 不同类型的对象之间进行比较会抛出 TypeError 异常

Old: 1 < ""
True
New: 1 < ""
TypeError: '<' not supported between instances of 'int' and 'str'

​ 部分函数被废弃

cmp()
__cmp__()

builtin.sorted() and list.sort() 不再支持 cmp 参数

# Integers

​ long 类型更名为 int。int 类型将具备 long 类型的特性。

Old: long(123)
123L
New: long(123)
NameError: name 'long' is not defined

​ 八进制函数表示差异

Old: 0666
New: 0o666

​ 删除了 sys.maxint 常量,int 类型大小和平台挂钩,不再依赖类型本身

# Text Vs. Data Instead Of Unicode Vs. 8-bit

  • 废除了 8 位字符串和 Unicode 取而代之使用文本和数据加以区分。

  • Unicode 文本不在需要用 u 来进行修饰,但二进制需要 b 进行修饰。

    Old: u"123"
    u'123'
    New: u"123"
    '123'
    Old: b"123"
    '123'
    New: b"123"
    b'123'
  • StringIO 和 cStringIO 放入 io 模块了。

  • basestring 抽象类已被删除,使用 str 代替

  • io.TextIOBase 只支持读取 Unicode Text,读取字节流请使用 io.TestIOBase.buffer

# 新语法

  • 支持通过 __annotations__ 获取函数参数和返回值(PEP 3107

    In: def foobar(a: int, b: "it's b", c: str = 5) -> tuple:
        return a, b, c
    foobar.__annotations__
    Out: {'a': int, 'b': "it's b", 'c': str, 'return': tuple}
  • 支持再可变参数后追加常规参数(PEP 3102

    def test(*arg, defalut=false):
    	pass
  • 加入 nonlocal 关键字用于显示的绑定非局部变量,避免在一些不必要的情况下自动从局部变量开始进行绑定。(PEP 3104

  • 扩展的可迭代拆包(PEP 3132

    Old: a, *rest, b = range(5)
    SyntaxError: invalid syntax
    New: a, *rest, b = range(5)
    In: rest
    Out: [1, 2, 3]

# 修改的语法

  • 新的 raise 语句语法(PEP 3109PEP 3134

    In: raise ZeroDivisionError,"test error"
    Out: SyntaxError: invalid syntax
    In: raise ZeroDivisionError("test error")
    Out: ZeroDivisionError: test error
  • 新的元类语法(PEP 3115

    Old: class C:
        	__metaclass__ = M
        
    New: class C(metaclass=M):
  • 加入 ... 代表 Ellipsis

    Old: ...
    SyntaxError: invalid syntax
    New: ...
    Ellipsis

# 移除的语法

  • 删除了元组参数拆包(PEP 3113

    Old: def foo(a, (b, c)):
        pass
    SyntaxError: invalid syntax
    New: def foo(a, combine):
        b, c = combine
  • 反引号 「` 」不能再代码中使用,取而代之用 repr

  • 删除 <> 用法,改为 !=

  • 整数不再支持后缀 Ll

  • 字符串不再支持前缀 Uu

  • from xxx import * 不再支持用于函数内

  • 不以 . 作为开头的导入都被视为绝对导入(PEP 328

    form .[module] import name(相对导入)