保持学习的态度,学一门动态语言其实是很早以前的就准备要做的事情,当时还在纠结python与ruby。现在不单单是要学python,还在考虑用它做点什么,这些等后续再说吧,因为看的是python2.x的书籍。用的是python 3.7.所以先把两者的区别记录一下,仅限于基础。


python3.x 与2.x的区别

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:



python 3.x 与2.x的区别_八进制

>>> try:
1/0
except Exception , err:
print err

SyntaxError: invalid syntax
>>>
#正确的写法
>>> try:
1/0
except Exception as err:
print(err)


division by zero
>>>


python 3.x 与2.x的区别_八进制


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多了很多


python 3.x 与2.x的区别_迭代器_03 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()