简要说明Python 3.x 与 Python 2.x 主要不同点
Python初学者经常会问,应该学习哪个版本的Python。对于这个问题,从发展来说,应该学习 Python 3.x,但从历史来说,Python 2.x拥有广泛的优秀的第三方库,而且大部分Python库都同时支持Python 2.7.x和3.x版本的。有必要了解一下Python 2.x与Python 3.x 两个版本之间的主要区别。
python 2.x:
>>> print 'Hello World!'
Hello World!
>>>
python 3.x:
>>> print('Hello World!')
Hello World!
>>>
Python 2中的print语句后跟随字符串,而Python 3中是通过print()函数,将需要输出的对象作为函数的参数。在Python 2中使用print()也是可以的,但反过来在Python 3中想以Python2的形式不带括号调用print语句时,会触发SyntaxError。不过在Python 2的圆括号中同时输出多个对象时,就会创建一个元组,这是因为在Python 2中,print是一个语句,而不是函数调用。print('a', 'b')
输出('a', 'b')
python 2的print 不换行使用","即可:
my = 'abc'
print my,
python 3的print 不换行使用end="":
my = 'abc'
print(my,end="")
在Python 2中,input()接收数字(int/float等)类型,并返回输入的内容,会自动识别类型。为了避免读取非字符串类型会发生的一些危险行为,使用raw_input()代替input(),raw_input()接收字符串(str)类型,并返回str类型。
>>> my_number = input('请输入一个数字: ')
请输入一个数字: 567
>>> type(my_number)
<type 'int'>
>>> my_string = raw_input('请输入一个字符串: ')
请输入一个字符串: hello
>>> type(my_string)
<type 'str'>
Python 3 改进了input()函数,该函数总是将用户的输入存储为 str对象。
>>> my_number = input('请输入一个数字: ')
请输入一个数字: 567
>>> type(my_number)
<type 'str'>
在Python 2.x中,函数range(N)
的意义在于生成一个0到N-1的数字列表。也可以得到其它的数字范围,range(N,M)
的范围是从N到M-1。如果用for
做循环,需要利用range()
函数构造一个列表,从这个角度看用for … in …range()
做单纯循环的效率相比while来说是比较低的。为解决这个问题,Python 2.x对单纯的循环可以使用xrange()
函数。
>>> for i in xrange(1,100):
... print i
...
xrange(1,100)
产生一个1到99的循环范围,而并不产生列表,这样就提高了效率,所以若只需要产生循环范围就应该用for…in… xrange()
循环。
在Python 3.x中,range()
的实现方式与xrange()
函数相同,所以就不存在专用的xrange()
。range()
函数在Python 3 中返回的是可迭代对象,而不像在Python 2 中返回列表。对象只遍历一次会节省很多内存,如果通过生成器多次迭代这些对象,效率就不高了。此时如果需要列表对象,可以通过Python 3的list()函数简单地将可迭代对象转成列表。另一个值得一提的是,在Python 3.x中,range有了一个新的__contains__
方法。__contains__
方法可以有效的加快Python 3.x中整数和布尔型的查找
速度。
在Python 2.x中,没有字符类型,也没有字节类型,字符串以 8-bit 字符串存储,有基于ASCII编码的str类型,可通过单独的unicode()
函数转成unicode编码的字符串类型。Python 2.x程序默认使用ASCII编码,如果需要使用中文,最简单的方法是在程序的第一行以注释的方式作以下标注:
# -*- coding:utf-8 -*-
或
#coding=utf-8
其含义是:本文件使用utf-8编码
,utf-8支持多种文字,包括中文。要注意的是,即使使用了#coding=utf-8
标记,程序代码中的所有非中文的部分也必须都用英文输入法输入。
Python 2.x使用一对反引号(位于键盘Tab键的上方、1键的左方),可以将数字类型的变量转换为字符串类型。str函数也可以将数字类型转换为字符串类型:
>>> a = 5
>>> h = 3
>>> print "Area is " + `area`
Area is 7.5
>>> print "面积是 " + str(area)
面积是 7.5
>>>
而在Python 3.x中,终于有了Unicode(utf-8)
字符串,默认使用Unicode(utf-8)
编码。Python 3.x已经不支持反引号了!
在Python 2.x中,算术运算的对象必须是数值,但是有一个规则,即同型数据的计算只能获得同型的结果
,例如1/2
是两个整型数据计算,其结果就是0
,不同数据类型进行算数运算,结果类型会跟随更复杂
的数据类型。例如1.0/2
的结果就是0.5
。
>>> print '3 / 2 =', 3 / 2
3 / 2 = 1
>>> print '3 // 2 =', 3 // 2
3 // 2 = 1
>>> print '3 / 2.0 =', 3 / 2.0
3 / 2.0 = 1.5
>>> print '3 // 2.0 =', 3 // 2.0
3 // 2.0 = 1.0
>>>
Python 3.x做了优化,整数相除的结果可以为小数,比如10/4
的结果就为2.5
而不是Python 2.x中的2
。Python 3.x中若想整数相除得出整数的结果需要使用//
运算符。
>>> print('3 / 2 =', 3 / 2)
3 / 2 = 1.5
>>> print('3 // 2 =', 3 // 2)
3 // 2 = 1
>>> print('3 / 2.0 =', 3 / 2.0)
3 / 2.0 = 1.5
>>> print('3 // 2.0 =', 3 // 2.0)
3 // 2.0 = 1.0
>>>
python 2.x中,cmp(x,y)
函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。
>>> x,y = 1,2
>>> cmp(x,y)
-1
>>> x,y = 1,1
>>> cmp(x,y)
0
>>> x,y = 2,1
>>> cmp(x,y)
1
>>>
在python3.x中,cmp()
已经不存在了,如果需要实现比较功能,需要引入operator
模块,适合任何对象。
>>> import operator
>>> operator.eq('hello', 'abc')
False
>>> operator.eq('hello', 'hello');
True
>>>
Python 2 支持新旧两种异常触发语法:
>>> raise IOError, "file error"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: file error
>>> raise IOError("file error")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: file error
>>>
Python 3只接受带括号的的语法:
>>> raise IOError("file error")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: file error
>>>
Python 3中的异常处理有了一点变化。在except语句中必须使用“as”
关键字。
Python 2:
>>> try:
... myname
... except NameError, err:
... print err, '--> error message'
...
name 'myname' is not defined --> error message
>>>
python 3:
>>> try:
... my-name
... except NameError as err:
... print(err, '--> error message')
...
name 'myname' is not defined --> error message
>>>
(1) Python 完整的异常处理语法结构如下:
try:
<语句> # 运行代码
except NameError as e: # python 2 : except NameError, e:
<语句> # 异常处理代码块1
except Exception as e: # python 2 : except Exception, e:
<语句> # 异常处理代码块2
... # 还可以有更多个 except
else:
<语句> # 没有异常发生时的正常处理代码块
finally:
<语句> # 资源回收代码块
(2) 流程
整个异常处理结构的执行过程:
BaseException # 所有异常的基类
SystemExit # 解释器请求退出
KeyboardInterrupt # 用户中断执行(通常是输入^C)
Exception # 常规异常的基类
StopIteration # 迭代器没有更多的值
GeneratorExit # 生成器(generator)发生异常来通知退出
StandardError # 所有的内建标准异常的基类
ArithmeticError # 所有数值计算错误的基类
FloatingPointError # 浮点计算错误
OverflowError # 数值运算超出最大限制
ZeroDivisionError # 除(或取模)零 (所有数据类型)
AssertionError # 断言语句失败
AttributeError # 对象没有这个属性
EOFError # 没有内建输入,到达EOF 标记
EnvironmentError # 操作系统错误的基类
IOError # 输入/输出操作失败
OSError # 操作系统错误
WindowsError # 系统调用失败
ImportError # 导入模块/对象失败
LookupError # 无效数据查询的基类
IndexError # 序列中没有此索引(index)
KeyError # 映射中没有这个键
MemoryError # 内存溢出错误
NameError # 未声明/初始化对象 (没有属性)
UnboundLocalError # 访问未初始化的本地变量
ReferenceError # 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError # 一般的运行时错误
NotImplementedError # 尚未实现的方法
SyntaxError # Python 语法错误
IndentationError # 缩进错误
TabError # Tab和空格混用
SystemError # 一般的解释器系统错误
TypeError # 对类型无效的操作
ValueError # 传入无效的参数
UnicodeError # Unicode相关的错误
UnicodeDecodeError # Unicode解码时的错误
UnicodeEncodeError # Unicode编码时错误
UnicodeTranslateError # Unicode转换时错误
Warning # 警告的基类
DeprecationWarning # 关于被弃用的特征的警告
FutureWarning # 关于构造将来语义会有改变的警告
OverflowWarning # 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning # 关于特性将会被废弃的警告
RuntimeWarning # 可疑的运行时行为的警告
SyntaxWarning # 可疑的语法的警告
UserWarning # 用户代码生成的警告
博文最后更新时间: