3 比 2 要慢不少, 囧rz.
int 和 long 统一为 int, 表现为 long
真正的除法 1/2 => 0.5, 原语法退化为 1//2
可用 nonlocal 声明非局部变量, 介于 global 和 local 之间
去除元组参数解包, 不能再定义 def foo( (a, (b, c)) ): 了
八进制语法变化: 0755 => 0o755
比较不同时只支持!=, 不再支持<>
比较时若类型不匹配, 抛出 TypeError, 而不是返回 False
raw_input() 更改为 input(), 原input()应用eval(input())
print 变成函数 print() 了
exec 变成函数 exec() 了
execfile() 取消, 需用 exec() 和 compile()
apply() 取消, 需用 * 和 ** 展开参数
callable() 取消, 应用 hasattr(func, '__call__')
`x` 取消, 需用 repr(x), 避免反引号的嵌套
捕获异常语法的变化:
except ImportError, e
=> except ImportError as e
except (RuntimeError, ImportError), e
=> except (RuntimeError,ImportError) as e
抛出自定义异常语法变化:
raise MyException, 'msg'
=> raise MyException('msg')
元祖的列表解析:
[i for i in 1, 2]
=> [i for i in (1, 2)]
set 可以用大括号来标记了, 但 {} 表示空字典:
set([1, 2, 3])
=> {1, 2, 3}
set 的展开式:
set([i for i in a_sequence])
=> {i for i in a_sequence}
取消file类, 只能用 open 打开文件, 添加打开文件的 t 和 b 模式, 添加自动关闭文件的 with open(...) as f:语法
字符串统一为 unicode 的str ,而 bytes 只能存储 0 到 127 的不可修改的整数序列或纯粹的 ASCII 字符, bytes 到 str 要 decode(), 反之 encode()
取消 unicode(), 用 str() 即可
使用format()或字符串的同名函数替代 % 格式化
ord(), chr() 可用于 unicode 的 str 了
几乎所有返回列表的方法都返回迭代器(或者动态视图)了
字典没有has_key()了, 只能用in运算符, 字典中返回列表的方法现在返回动态视图, 可用作迭代器, 可进行 in 测试
迭代器的函数next()变为__next__(), 增加了全局函数next()
range()的行为现在是xrange()
zip(), map(), filter()不再返回列表而是迭代器, itertools 中 izip(), imap(), ifilter() 取消
reduce() 转入 functools 模块里了
引入当前目录下的包必须指定相对路径:
from . import mypkg
from .mypkg import subpkg
from .. import fatherpkg
( 扩展的可迭代解包, 新的metaclass语法, class decorator, 增加抽象基类支持 )
httplib, Cookie, cookielib, BaseHTTPServer, SimpleHTTPServer, CGIHttpServer 合并为 http
urllib 和 urllib2 合并为 urllib
cStringIO, StringIO 可直接引入 io, 优先检测c实现
cPickle, pickle 可直接引入 pickle, 优先检测c实现
模块更名列表 from six:
| Python 2 name | Python 3 name |
|---|---|
| _builtin_ | builtins |
| ConfigParser | configparser |
| copy_reg | copyreg |
| cPickle | pickle |
| cStringIO.StringIO() | io.StringIO |
| itertools.ifilter() | filter() |
| cookielib | http.cookiejar |
| Cookie | http.cookies |
| htmlentitydefs | html.entities |
| HTMLParser | html.parser |
| httplib | http.client |
| BaseHTTPServer | http.server |
| CGIHTTPServer | http.server |
| SimpleHTTPServer | http.server |
| itertools.imap | map |
| Queue | queue |
| reduce() | functools.reduce() |
| reload() | imp.reload() |
| repr | reprlib |
| SocketServer | socketserver |
| Tkinter | tkinter |
| Dialog | tkinter.dialog |
| FileDialog | tkinter.FileDialog |
| ScrolledText | tkinter.scolledtext |
| SimpleDialog | tkinter.simpledialog |
| Tix | tkinter.tix |
| Tkconstants | tkinter.constants |
| Tkdnd | tkinter.dnd |
| tkColorChooser | tkinter.colorchooser |
| tkCommonDialog | tkinter.commondialog |
| tkFileDialog | tkinter.filedialog |
| tkFont | tkinter.font |
| tkMessageBox | tkinter.messagebox |
| tkSimpleDialog | tkinter.simpledialog |
| robotparser | urllib.robotparser |
| _winreg | winreg |
| xrange() | range() |
| itertools.izip() | zip() |
每次把代码从python2改成python3,都有一种蛋碎的感觉,谢谢分享