保持学习的态度,学一门动态语言其实是很早以前的就准备要做的事情,当时还在纠结python与ruby。现在不单单是要学python,还在考虑用它做点什么,这些等后续再说吧,因为看的是python2.x的书籍。用的是python 3.7.所以先把两者的区别记录一下,仅限于基础。
1.print
print语句没有了,取而代之的是print()函数。
py 2.x:
print "wyl" #语句
print("wyl")
py 3.x:
>> print("wyl")
wyl
>>> print 'wyl'
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('wyl')?
2.Unicode
Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。
现在, 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。
由于 Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的:
py 2.x
>>> str='王延领那小子真帅'
>>> str
'xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
py 3.x
>>> str='王延领那小子真帅'
>>> str
'王延领那小子真帅'
>>>
3.除法运算
Python中的除法有两个运算符,/和//
首先来说/除法:
在python 2.x中/除法就跟我们熟悉的大多数语言,比如Java啊C#啊差不多,取整,把小数部分完全忽略掉。
在python 3.x中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。
py 2.x
>>> 1/2
0
>>>
py 3.x
>>> 1/2
0.5
>>>
第二种//除法:
这种除法叫做floor除法,py2.x与py3.x相同
py2.x py3.x
>>> 1//2
0
>>>
4.异常
在 py3.x 中我们现在使用 as 作为关键词,而非‘,’
所以异常都从 BaseException继承,并删除了StardardError
去除了异常类的序列行为和.message属性
用 raise Exception(args)代替 raise Exception, args语法
捕获异常的语法改变,引入了as关键字来标识异常实例
py3.0:
>>> try:
1/0
except Exception , err:
print err
SyntaxError: invalid syntax
>>>
#正确的写法
>>> try:
1/0
except Exception as err:
print(err)
division by zero
>>>
5.xrange
xrange() 改名为range(),要想使用range()获得一个list,必须显式调用:
py 2.x
>>> range(1,10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
py3.x
>>> range(10)
range(0, 10)
>>>
py3.x 如果想使用range(),可以结合list
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
6.八进制
python 八进制不能0开头而是以0o开头
py 3.x
>>> 0101
SyntaxError: invalid token
>>> 0o101
65
>>>
7.不等运算符
不等运算py3.x只有“!=”,“<>”已被移除
py3.x
>>> 1!=3
True
>>> 1<>3
SyntaxError: invalid syntax
>>>
8.去掉了repr表达式``
py3.x
>>> s=`wyl`
SyntaxError: invalid syntax
>>> s='wyl'
>>> repr(s)
"'wyl'"
9.多个模块被改名(根据PEP8)
旧的名字 | 新的名字 |
_winreg | winreg |
ConfigParser | configparser |
copy_reg | copyreg |
Queue | queue |
SocketServer | socketserver |
repr | reprlib |
StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。
Python 2.6已经支援新的io模组。
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。
取消了exec语句,只剩下exec()函数。 Python 2.6已经支援exec()函数。
10.数据类型
py 3.x
1>去掉了long
2>新增了bytes类型,对应于2.X版本的八位串
3>dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。
11.面向对象
1>引入抽象基类(Abstraact Base Classes,ABCs)
2>容器类和迭代器类被ABCs化,所以cellections模块里的类型比Py2.x多了很多
View Code
3>迭代器的next()方法改名为__next__(),并增加内置函数next(),用以调用迭代器的__next__()方法
4>增加了@abstractmethod和 @abstractproperty两个 decorator,编写抽象方法(属性)更加方便。
12.模块
1>移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块。
2>移除了imageop模块
3>移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块
4>移除了bsddb模块(单独发布,可以从http://www.jcea.es/programacion/pybsddb.htm获取
5>移除了new模块
6>os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下
7>tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是 tokenize.tokenize()