python2与python3的区别

(世界上最好的两种语言的区别

编码

统一了字符编码支持
Python2:
ASCII编码的字符串,unicode类型的字符串, 但是没有byte类型.
Python3:
unicode编码的字符串, 和byte 类型

内置函数

print函数

Python 2 跟3 最广为人知的区别就是print的变化
Python2 中的print语句在python3中被print()函数代替
这意味着我们必须把要print的对象放在括号里

1
2
3
4
#py2
print 'Hello, World!'
#py3
print('Hello, World!')

Xrange

python2:
rangexrange方法,
xrange是一个生成器
range给出一个list

1
2
3
4
5
6
>>> %timeit [i for i in range(1000)]
The slowest run took 4.72 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 45.3 µs per loop

>>> %timeit [i for i in xrange(1000)]
10000 loops, best of 3: 40.1 µs per loop

python3
range执行以前xrange的功能

1
2
3
4
5
>>> %timeit [i for i in range(1000)]
42.6 µs ± 1.23 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit [i for i in xrange(1000)]
NameError: name 'xrange' is not defined

next函数和next方法

Python2:
Python2中next()函数和.next()方法都可以使用

1
2
3
4
5
6
7
print 'Python', python_version()
my_generator = (letter for letter in 'abcdefg')
next(my_generator)
my_generator.next()
#out
Python 2.7.6
'b'

Python3:
Python3 中只使用next()函数(使用.next()方法会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
print('Python', python_version())

my_generator = (letter for letter in 'abcdefg')

next(my_generator)
#out
Python 3.4.1

'a'
--------------
my_generator.next()
#out
AttributeError: 'generator' object has no attribute 'next'

input

Python2:
使用 input()函数时,Python会根据你的输入动态转换数据类型。所以input()函数可以根据你的输入返回int,str,float,bool,list等任何东西。例如,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> val = input(“Enter any value: “)
Enter any value: 7
>>> type(val)
int

>>> val = input(“Enter any value: “)
Enter any value: 7.0
>>> type(val)
float

>>> val = input(“Enter any value: “)
Enter any value: ‘abc’
>>> type(val)
str

>>> val = input(“Enter any value: “)
Enter any value: True
>>> type(val)
bool

>>> val = input(“Enter any value: “)
Enter any value: [1,2,3,4,5]
>>> type(val)
list

当你使用raw_input()的时候, 不管输入的是什么类型他都只返回str类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> val = raw_input("Enter any value: ")
Enter any value: 7
>>> type(val)
str

>>> val = raw_input("Enter any value: ")
Enter any value: 7.0
>>> type(val)
str

>>> val = raw_input("Enter any value: ")
Enter any value: 'abc'
>>> type(val)
str

and so on..

Python3:
input()只会返回str类型

1
2
3
4
>>> val = input("Enter any value: ")
Enter any value: 7
>>> type(val)
str

feature模块

Python3 引入了一些python2 不支持的关键字和功能
可以通过python2 中的feature 模块进行导入
比如在python2中使用python3的整数除法

1
from __future__ import division

python2 doc future

整数除法

Python2:
如果两个操作数都是int类型,则执行floor division并返回int
如果任一操作数是浮点数,则执行经典除法并返回浮点数
Python3:
Division(/)总是返回一个float.
要丢弃小数结果可以使用//

1
2
3
4
5
6
7
8
9
10
print 'Python', python_version()
print '3 / 2 =', 3 / 2
print '3 // 2 =', 3 // 2
print '3 / 2.0 =', 3 / 2.0
print '3 // 2.0 =', 3 // 2.0
-------------
3 / 2 = 1
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

Python 3

1
2
3
4
5
6
7
8
9
10
11
print('Python', python_version())
print('3 / 2 =', 3 / 2)
print('3 // 2 =', 3 // 2)
print('3 / 2.0 =', 3 / 2.0)
print('3 // 2.0 =', 3 // 2.0)
-------------
Python 3.4.1
3 / 2 = 1.5
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

关键字

True 和 False

1
2
3
4
5
6
7
8
9
10
11
12
>>>True=False
>>>True
False
>>True is False
True
>>>False = “x”
>>> False
‘x’
>>>if False:
… print(“?”)


Python3 修正了这个缺陷,True 和 False 变为两个关键字,永远指向两个固定的对象,不允许再被重新赋值。

1
2
3
>>> True = 1
File “<stdin>”, line 1
SyntaxError: can’t assign to keyword

nonlocal

我们都知道在 Python2 中可以在函数里面可以用关键字 global 声明某个变量为全局变量,但是在嵌套函数中,想要给一个变量声明为非局部变量是没法实现的,在 Pyhon3,新增了关键字 nonlcoal,使得非局部变量成为可能。
7. Simple statements — Python 3.7.2 documentation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
x = 0
def outer():
x = 1
def inner():
x = 2
print("inner:", x)

inner()
print("outer:", x)

outer()
print("global:", x)

# inner: 2
# outer: 1
# global: 0

使用nonlocal以后inner()中的x也是outer里的x:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
x = 0
def outer():
x = 1
def inner():
nonlocal x
x = 2
print("inner:", x)

inner()
print("outer:", x)

outer()
print("global:", x)

# inner: 2
# outer: 2
# global: 0

如果使用global,它会将x绑定到正确的global值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
x = 0
def outer():
x = 1
def inner():
global x
x = 2
print("inner:", x)

inner()
print("outer:", x)

outer()
print("global:", x)

# inner: 2
# outer: 1
# global: 2

Python 3中range的contains方法

Python 3.x 中range增加了了一个contains方法
对于整数和布尔类型,该contains方法可以range显着加速Python 3.x中的“查找”。
python - What does contains do, what can call contains function - Stack Overflow

Python 2和3中的速度差异

有人指出了Python 3range()和Python2之间的速度差异xrange()。由于它们以相同的方式实现,因此可以预期相同的速度。然而,这里的差异只是因为Python 3通常比Python 2运行得慢。

1
2
3
4
5
def test_while():
i = 0
while i < 20000:
i += 1
return

1
2
print('Python', python_version())
%timeit test_while()
1
2
Python 3.4.1
100 loops, best of 3: 2.68 ms per loop
1
2
print 'Python', python_version()
%timeit test_while()
1
2
Python 2.7.6
1000 loops, best of 3: 1.72 ms per loop

报错

Python2:
支持两种报错写法

1
2
3
4
>>>raise IOError, “file error”
IOError: file error
>>>raise IOError(“file error”)
IOError: file error

Python3:
只能使用上面的第二种写法

1
raise IOError("file error")

如果使用第一种写法会提示SyntaxError: invalid syntax

异常处理

Python2:
语法跟python不同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try:
BlahBlah
except NameError, error:
print error, " => ERROR IS HERE!"

#output
name 'BlahBlah' is not defined => ERROR IS HERE!

try:
BlahBlah
except NameError as error:
print error, " => ERROR IS HERE!"

#output
name 'BlahBlah' is not defined => ERROR IS HERE!

Python3:
需要使用as关键字

1
2
3
4
5
6
7
try:
BlahBlah
except NameError as error:
print (error, " => ERROR IS HERE!")

#output
name 'BlahBlah' is not defined => ERROR IS HERE!

全局命名空间泄漏

Python2:

1
2
3
4
5
6
7
8
num = 7
print (num)
mylist = [num for num in range(100)]
print (num)

# output
7
99

Python3:

1
2
3
4
5
6
7
8
num = 7
print (num)
mylist = [num for num in range(100)]
print (num)

# output
7
99

比较不可对比的类型

Python2:
像js一样不可靠

1
2
>>>2 < '2'
True

Python3:
对不可排序类型做比较的时候,会抛出一个类型错误。

1
2
3
4
>>> 2 < '2'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()

返回可迭代对象而不是列表

在Python3中不再返回list的函数和方法

1
2
3
4
5
6
zip()
map()
filter()
dictionary’s .keys() method
dictionary’s .values() method
dictionary’s .items() method

列表生成式

Python2.7:

1
2
[item for item in 1,2,3,4,5]
[1, 2, 3, 4, 5]

Python3 :
需要使用额外的一对括号

1
2
[item for item in (1,2,3,4,5)]
[1, 2, 3, 4, 5]

银行进位法

python2:
round()使用的是四舍五入

1
2
3
4
5
6
>>> print 'Python', python_version()
Python 2.7.12
>>> round(15.5)
16.0
>>> round(16.5)
17.0

python3:
round()使用的是银行进位法

1
2
3
4
5
6
>>> print(‘Python’, python_version())
Python 3.5.1
>>> round(15.5)
16
>>> round(16.5)
16

参考链接: