本文是对官方文档的总结,主要比较对象是 Python 3.0 和 Python 2.6。原作者是 Python 创始人 Guido van Rossum。
在 Python 3 中,print 变成了一个内建函数,使用命名参数来实现旧版 print 的大多数功能,具体见 PEP 3105。
Old: print "The answer is", 2*2
New: print("The answer is", 2*2)
Old: print x, # 在行尾接上逗号以取消换行
New: print(x, end=" ") # 指定行尾接上空格为非换行
Old: print # 打印一段空行
New: print() # 这里必须当作函数来调用
Old: print >>sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)
Old: print (x, y) # 输出 repr((x, y))
New: print((x, y)) # 注意:参数应该是 (x, y) 元组
除了 end
外,你也可以指定分隔符 sep
:
print("There are <", 2**32, "> possibilities!", sep="")
>>> There are <4294967296> possibilities!
注意:
print "A\n", "B"
会输出 “A\nB\n”,而 Python 3 中 print("A\n", "B")
会输出 “A\n B\n”。Python 3 中很多常见的 API 的返回值都不再是列表了:
dict.keys, dict.items, dict.values
的返回值都是 view 而不再是列表,因此 k = d.keys(); k.sort()
这样的写法不再有效,你可以改为 k = sorted(d)
。list(map(...))
,不过这里更推荐使用列表解析(如果原来的代码中使用了 lambda 时尤其推荐),或者将代码修改为不依赖 list。特别要注意 map 可能会带来函数的副作用,这时候可以使用 for 循环(创建列表会非常浪费)。
如果输入的参数长度并不相等,map 会在较短的序列完成的时候中止。为了完全兼容 Python 2,你可以使用 itertools.zip_longest()
做一层封装:map(func, *sequences)
修改为 list(map(func, itertools.zip_longest(*sequences)))
Python 3 修改了一些比较规则:
<, <=, >=, >
这些“有序比较符”在操作符两端不具备有意义的排序规则时将会报 TypeError,因此 1 < ‘’
, 0 > None
, len <= len
, None < None
这样的表达式都不再合法,会报 TypeError 错误。buildin.sorted()
和 list.sort()
不再接受 cmp
参数,你可以使用使用 key
参数来替代。cmp()
函数,__cmp__
已经不再被支持。因此排序请使用 __lt__()
、__eq__
和 __hash__
这些更有意义的比较。(现有的 cmp()
函数使用可以修改为 (a > b) - (a < b)
,等价于 cmp(a, b)
。)long
更名为了 int
,也就是说内建的整数类型只有一种了,其使用和旧版的 long
基本相同。1/2
这样的表达式的运算结果将是 float 类型,需要整数返回值请使用 1//2
。(后面的语法从 Python 2.2 中就已经得到支持了。)sys.maxint
常量。不过,你可以使用 sys.maxsize
来定义一个超过所有列表和字符串索引大小的自然数,在这种情况下相当于之前的 sysl.maxint
。repr()
在处理长整形型数字时将不会添加 “L”,因此在写代码时注意不要删掉了最后一位数字。可以使用 str()
来替代。