以下为个人学习笔记整理
# python2 对比 python3 差异
# print is a Function
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 3109 和 PEP 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