A sentence A picture A day!

Python2&3差别

  在电脑上试运行GitHub上用python3.4编的一段代码【GitHub链接-github.com/xiaff/dbc-downloader】,功能是将豆瓣读书上的书与短评存成markdown或者html形式。本机使用的是python2.7,改代码过程顺便总结2与3的一些区别。

具体参照python2to3

  1. print与print()
  2. Python 2有两种字符串类型:Unicode字符串和非Unicode字符串。Python 3只有Unicode一种类型
  3. Python 2有两个全局函数可以把对象强制转换成字符串:unicode()把对象转换成Unicode字符串,还有str()把对象转换为非Unicode字符串。Python 3只有一种字符串类型,所以str()函数即可完成所有的功能。
  4. long长整型
  5. 字典类方法has_key()==>in运算符

    Notes Python2 Python3
    1 a_dictionary.has_key(‘PapayaWhip’) ‘PapayaWhip’ in a_dictionary
    2 x + a_dictionary.has_key(y) x + (y in a_dictionary)

    in的优先级大于运算符+,运算符or的优先级高于运算符in

  6. 返回列表的字典类方法

    Notes Python2 Python3
    1 a_dictionary.keys() list(a_dictionary.keys())
    2 a_dictionary.items() list(a_dictionary.items())
    3 a_dictionary.iterkeys() iter(a_dictionary.keys())
    4 [i for i in a_dictionary.iterkeys()] [i for i in a_dictionary.keys()]
    5 min(a_dictionary.keys()) 没变化
    • 使用list()函数将keys()的返回值转换为一个静态列表
    • 这是另外一种视图(关于items()方法的)到列表的转换。2to3对values()方法返回值的转换也是一样
    • Python 3里不再支持iterkeys()了。如果必要,使用iter()将keys()的返回值转换成为一个迭代器。
    • 2to3也能识别出keys()方法的返回值被立即传给另外一个会遍历整个序列的函数,所以也就没有必要先把keys()的返回值转换到一个列表。相反的,min()函数会很乐意遍历视图。这个过程对min(),max(),sum(),list(),tuple(),set(),sorted(),any()和all()同样有效
  7. 被重命名或者重新组织的模块

    http

    Notes Python2 Python3
    1 import httplib import http.client
    2 import Cookie import http.cookies
    3 import cookielib import http.cookiejar
    4 import BaseHTTPServer import http.server
    import SimpleHTTPServer
    import CGIHttpServer
    • http.client模块实现了一个底层的库,可以用来请求http资源,解析http响应。
    • http.cookies模块提供一个蟒样的(Pythonic)接口来获取通过http头部(http header)Set-Cookie发送的cookies。
    • 常用的流行的浏览器会把cookies以文件形式存放在磁盘上,http.cookiejar模块可以操作这些文件。
    • http.server模块实现了一个基本的http服务器

    urllib

    Python 2有一些用来分析,编码和获取URL的模块,但是这些模块就相互重叠。在Python 3里,这些模块被重构、组合成了一个单独的包

    Notes Python2 Python3
    1 import urllib import urllib.request, urllib.parse, urllib.error
    2 import urllib2 import urllib.request, urllib.error
    3 import urlparse import urllib.parse
    4 import robotparser import urllib.robotparser
    5 from urllib import FancyURLopener from urllib.request import FancyURLopener
    from urllib import urlencode from urllib.parse import urlencode
    6 from urllib2 import Request from urllib.request import Request
    from urllib2 import HTTPError from urllib.error import HTTPError
  8. 全局函数raw_input()和input()

    Notes Python2 Python3
    1 raw_input() input()
    2 raw_input(‘prompt’) input(‘prompt’)
    3 input() eval(input())

几点:

  • input问题:在python2中使用,若使用input函数输入时需要加双引号,否则不是str类型。input和raw_input的区别

  • utf8 编码问题: open(file,‘w’,encoding=‘utf-8’)在python2中的不可用性 解决办法是去掉encoding=‘utf-8’,在代码开头加入

    import sys

    reload(sys)

    sys.setdefaultencoding('utf8')

  • urllib2的调用使用urllib2发请求时注意R要大写,是urllib2.Request