python2升级python3遇到的问题记录

python2.7升级python3.5时,遇到的一些问题记录如下:

1. 字符串编码是最大的差别,py2的str为utf8编码,有单独的unicode类型,py3的str本身就是unicode编码,utf8则使用bytes类型。所以在py3里面没有unicode这种类型。以下是升级中遇到最蛋疼的麻烦:


>>> d = {'name': '张三'}

>>> b'name' in d
>>> False

2. s = 'abc',则s[0]为字符串'a';s = b'abc',则s[0]为整数97。

3. 在python2中是python -m SimpleHTTPServer,在python3里是python -m http.server

4. py3里没有xrange,只有range,而且返回为可用于迭代的对象。

5. map() zip() filter()也都返回迭代器对象,而不是列表,要得到列表需要写成list(zip(a,b)),包括dict.keys() dict.values() dict.items(),遍历不再需要写iteritems()了。所以map(lambda x : do_sth(x), [...])是不会依次全部执行的。

6. print支持f'{variable}xxx'写法 (py3.6才添加)

7. py2里的dict有clear()操作,但是list是没有的,如果要清空list,写法是del v[:],而在py3里list也添加了clear()方法。

8. py3里,Exception不能直接用索引取值了,需要使用使用args获利参数元组。即:


a = Exception(errno, errstr)
#py2
errno, errstr = a
#py3
errno, errstr = a.args

9. py3里dict没有has_key()方法,统一使用in表达式。

10. 在py2里有混乱的urllib、urllib2、urllib3,而在py3里全统一到urllib里了:


from urllib.parse import urlencode, parse_qs, urlsplit, quote, unquote

11. 整数除法有很大变化,py2整数相除得到还是整数,就像c/c++里一样,而py3则为小数,跟js类似,如果相除还想得到整数,就需要改成//相除。

12. 原来在py2里,4字节以内的整数类型为int,超过就是long,而py3里没有long类型,只有int,其实就是做了简化统一,而带来的问题是,大量整数计算时,py3要比py2占用更多内存,计算也明显更慢。

13. 在py3里,list的sort()没有cmp参数,而是通过key传入一个函数,为每个item生成一个key,再排序,每个key只生成一次。

发表于 08-30 16:38   修改于 09-17 00:30   评论:0   阅读:193  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo