一.性能
python3.x的性能低于Python2.x,但是python3.x有极大的优化空间,正在追赶.
二.基本语法差异
一).核心语法差异
1.Python3对Unicode字符的原生支持
Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str和unicode,Python3只支持unicode的string。python2和python3字节和字符对应关系为:
img
2.Python3采用的是绝对路径的方式进行import。
Python2中相对路径的import会导致标准库导入变得困难(想象一下,同一目录下有file.py,如何同时导入这个文件和标准库file)。Python3中这一点将被修改,如果还需要导入同一目录的文件必须使用绝对路径,否则只能使用相关导入的方式来进行导入。
3.Python2中存在老式类和新式类的区别,Python3统一采用新式类。新式类声明要求继承object,必须用新式类应用多重继承。
4.Python3使用更加严格的缩进。Python2的缩进机制中,1个tab和8个space是等价的,所以在缩进中可以同时允许tab和space在代码中共存。
这种等价机制会导致部分IDE使用存在问题。Python3中1个tab只能找另外一个tab替代,因此tab和space共存会导致报错:TabError: inconsistent use of tabs and spaces in indentation.
二).废弃类差异
1.print语句被python3废弃,统一使用print函数
2.exec语句被python3废弃,统一使用exec函数
3.execfile语句被Python3废弃,推荐使用exec(open("./filename").read())
4.不相等操作符"<>"被Python3废弃,统一使用"!="
5.long整数类型被Python3废弃,统一使用int
6.xrange函数被Python3废弃,统一使用range,Python3中range的机制也进行修改并提高了大数据集生成效率
7.Python3中这些方法再不再返回list对象:dictionary关联的keys()、values()、items(),zip(),map(),filter(),但是可以通过list强行转换:
mydict={"a":1,"b":2,"c":3}
mydict.keys() #<built-in method keys of dict object at 0x000000000040B4C8>
list(mydict.keys()) #['a', 'c', 'b']
8.迭代器iterator的next()函数被Python3废弃,统一使用next(iterator)
9.raw_input函数被Python3废弃,统一使用input函数
10.字典变量的has_key函数被Python废弃,统一使用in关键词
11.file函数被Python3废弃,统一使用open来处理文件,可以通过io.IOBase检查文件类型
12.apply函数被Python3废弃
13.异常StandardError 被Python3废弃,统一使用Exception
三).修改类差异
1.浮点数除法操作符/和//区别
- Python2:/是整数除法,//是小数除法
运行 "5/3"得出结果为1, 如果想得出小数部分, 则需要把代码改成:"float(5)/float(3)", 即加上类型. - Python3:/是小数除法,//是整数除法。
运行"5/3"得出结果为1.666666, 如果只得到整数部分,则需要修改代码为:"5//3", 即使用整除.
2.异常抛出和捕捉机制区别
所有异常都从BaseException继承, 并且删除了StandardError
- Python2
try:
...
except Exception, e:
raise IOError, "file error" #抛出异常
except NameError, err: #捕捉异常
- Python3
try:
...
except Exception as e:
raise IOError("file error") #抛出异常
except NameError as err: #捕捉异常
3.for循环中变量值区别
- Python2,for循环会修改外部相同名称变量的值
i = 1
print ('comprehension: ', [i for i in range(5)])
print ('after: i =', i ) #i=4
- Python3,for循环不会修改外部相同名称变量的值
i = 1
print ('comprehension: ', [i for i in range(5)])
print ('after: i =', i ) #i=1
4.round函数返回值区别
- Python2,round函数返回float类型值
isinstance(round(15.5),int) #True
- Python3中只有同一数据类型的对象可以比较
isinstance(round(15.5),float) #True
5.比较操作符区别
- Python2中任意两个对象都可以比较
11 < 'test' #True
- Python3中只有同一数据类型的对象可以比较
11 < 'test' # TypeError: unorderable types: int() < str()
6.map、filter 和 reduce的差异
- 这三个函数号称是函数式编程的代表。在 Python3.x 和 Python2.x 中也有了很大的差异。
首先我们先简单的在 Python2.x 的交互下输入 map 和 filter,看到它们两者的类型是 built-in function(内置函数):
>>> map
<built-in function map>
>>> filter
<built-in function filter>
>>>
它们输出的结果类型都是列表:
>>> map(lambda x:x *2, [1,2,3])
[2, 4, 6]
>>> filter(lambda x:x %2 ==0,range(10))
[0, 2, 4, 6, 8]
>>>
但是在Python 3.x中它们却不是这个样子了:
>>> map
<class 'map'>
>>> map(print,[1,2,3])
<map object at 0x10d8bd400>
>>> filter
<class 'filter'>
>>> filter(lambda x:x % 2 == 0, range(10))
<filter object at 0x10d8bd3c8>
>>>
首先它们从函数变成了类,其次,它们的返回结果也从当初的列表成了一个可迭代的对象, 我们尝试用 next 函数来进行手工迭代:
>>> f =filter(lambda x:x %2 ==0, range(10))
>>> next(f)
0
>>> next(f)
2
>>> next(f)
4
>>> next(f)
6
>>>
对于比较高端的 reduce 函数,它在 Python 3.x 中已经不属于 built-in 了,被挪到 functools 模块当中。
7.打开文件
- python2中
file( ..... )
或
open(.....)
- Python3中
加入了"as"和"with"关键字, 用于打开文件
open with(.....) as :
8.chr( K ) 与 ord( c )
- python 2
chr( K ) 将编码K 转为字符,K的范围是 0 ~ 255
ord( c ) 取单个字符的编码, 返回值的范围: 0 ~ 255 - python 3
chr( K ) 将编码K 转为字符,K的范围是 0 ~ 65535
ord( c ) 取单个字符的编码, 返回值的范围: 0 ~ 65535
四).新增类差异
- python3.x中加入了nonlocal语句
python引用变量的顺序- 1.当前作用域局部变量
- 2.外层作用域变量
- 3.当前模块中的全局变量
- python内置变量
与global相似
- python内置变量
nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量
示例1
def sub():
n = 100 # 局部变量
print(n)
def sub2():
nonlocal n # 非本地的(非全局的)外部变量
n -= 10
print(n)
return sub2
s = sub()
s()
s()
输出:
100
90
80
示例2
def main():
def local_n():
n = 200
def nonlocal_n():
nonlocal n
n = 300
def global_n():
global n # 声明为全局变量
n = 400
n = 10
local_n()
print(n)
nonlocal_n()
print(n)
global_n()
print('global_n() After:{0}'.format(n)) # 显示的局部变量
main()
print('n = {0}'.format(n))
--------------------------------------------------------
10
300
global_n() After:300
n = 400
2.dict字典变动
python3.x 去除了dict.iterkeys(),dict.itervalues(),dict.iteritems(), dict.has_key()方法
新增: dict.keys(),dict.values(),dict.items()
3.面向对象
引入抽象基类(Abstraact Base Classes,ABCs)
import abc
@abc.abstractmethod
4.模块变动
旧的名字 | 新的名字 |
---|---|
_winreg | winreg |
COngigParser | configpaeser |
copy_reg | copyreg |
Queue | queue |
SocketServer | sockerserver |
repr | reprlib |
网友评论