一、关于选择Python2还是Python3
开始时我选用的教材是《A Byte of Python》,Python则选择了2.7.9,使用过程中一直没有什么问题。直到在一次重装系统后,忽发奇想,为什么不试试最新的版本呢?于是安装了刚刚推出的Python3.5.0。当时我只是小打小闹地用用,没感觉到太多不适应。不过,每次print都要加括号还是让人有些小小地不习惯,但是写中文注释时不需要添加“-*- coding=utf-8 -*-”确实也让我感到3.x的进步。
第一次比较大的问题出现在安装一个新的package的过程中,按照官方文档试了多次均不成功,反反复复找不到问题在哪。临睡前突然灵光一现——是不是Python的版本太新了?第二天卸了3.5,改装3.4.3——pip install一次通过。
总结:个人感觉,对于初学者而言,选Python2还是Python3都可以,2.x相对成熟稳定,教材较多;3.x可以选一个相对旧一点的版本,以避免遇到配套package更新不及时而造成的不兼容问题。
二、如何从Python2转向Python3
我个人的体会是,如果你真的决定用Python3了,就把之前的Python2卸载,安装一个3.4.3版本,然后把你之前用Python2写的程序再跑一遍,报错了?恭喜,正好可以从这些报错入手,自行分析,查阅官方文档或者上Google/Baidu。每解决一个问题,你对Python3的理解就提升一步,当把之前所有程序都成功跑通之后,你也就完成了2.x到3.x的转换。
三、转换中可能遇到的典型问题
以下列出在2.x到3.x的过程中可能会遇到的问题,供参考(这里仅是我对自己遇到的问题和对策的总结,抛砖引玉,献丑了):
1. 一些包、函数的位置发生变化
例子:如对于urlopen(),在2.x版本中用import urllib来引入,但是3.x版本中需要用import urllib.request来引入
对策:运行时会提示找不到object或module,好在问题比较典型,通过Google/Baidu一般都可以得到解决
2. 对于字符串处理的一些调整。
例子:对于urlopen().readlines()的返回值,在3.x中得到的可能是 b'××××××\n'的表达(即二进制),需要对b和\n等符号单独处理
对策:比较典型的方法是先把得到的字符串str1处理一下——str1.decode('utf8')
3. 在3.x中很多函数都不再返回list,而是返回Generator
例子:对于zip()函数,在2.x中,直接返回一个list,但在3.x就会报错
对策:这是3.x中为了减少内存使用普遍采用的一种策略,影响很多函数。一般而言,直接再包一层,如:tuple(zip()), list(zip()), map(zip())即可解决。