应该学习最新版本的 Python 3 还是旧版本的 Python 2?

看到最新Python版本是3.5,但是网上的资料,包括出版的书籍,都是最晚到13年左右,很多细节都不同,语法也过时了。 那此时应该直接学习3.X还是2.X?如果前者的话,有什么推荐的资料或者书么?最好中文。英文看起来效率会比较低。
关注者
2025
被浏览
341315

140 个回答

python 3 有很大改进,比 2 更容易理解。

如果题主决定学 2,建议当被 string bytes 搞晕时,了解一下 3,再做决定。

另外,3 的库已经比较全了,不支持 3 的,多数是不再维护的。
scrapy已经支持python3了 Python 3 is Coming to Scrapy
========== 20160512 分割线 ==========
用Python做爬虫的注意一下,scrapy不支持Python3。 Frequently Asked Questions
这里有篇文章讲scrapy的迁移工作:Scrapy on the Road to Python 3 Support

主要原因是Twisted还不完全支持Python3. 虽然Twisted大部分是可移植到python3的,但Twisted的http agent并不支持Python3.
scrapy团队两年前就开始了向python3的移植工作。现在scrapy每次提交都有一部分测试在python3下执行。

除了Twisted, 移植的另一个大问题是Request和Response对象。这个问题最近得到了解决。解决中遇到了如下一些问题:

  1. HTTP headers应该是byte还是unicode?key和value需要区别对待么?一些headers如cokies通常是UTF-8, HTTP Basic Auth通常是latin1编码。其他的headers却没有一个通用的编码。通常用bytes表示HTTP headers是合理的。但有一个问题:如果你将现有代码从Python2.x移植到3.x,一些以前运行正常的代码可能会悄悄的出错。比如一个HTTP response包含"content-type: application/json".如果headers用bytes表示,在Python2.x中,content_type == 'application/json'返回True, 但在Python3.x中就会返回False,因为你在拿Unicode字面量和bytes进行比较。
  2. 如何正确的进行百分比转义和反转义?正确转义依赖于网页的编码和该转义URL的哪部分。如果网页使用非ASCII编码就可能有问题。经过一些实验后我们发现浏览器在干一些很疯狂的事情:URL路径在转义之前进行了UTF-8编码,但query string在转义前却使用了网页里的编码。你不能依赖浏览器在界面上显示了什么来判断URL的编码,在OS X和Linux上,每个FireFox和Chromed发送给服务器的都是UTF-8编码的路径和网页编码的query string.但它们显示给用户的则依赖于浏览器和操作系统。
  3. URL相关的函数在Python2.x和3.x中有很大不同。Python2.x中这些函数只接受bytes,Python3.x中只接受Unicode. 这和疯狂的编码问题搞在一起让代码移植变得越发困难。
为什么?