最近在学习python,和很多初学者一样,一开始比较纠结到底是版本2好还是版本3是将来的趋势呢?为了避免走太多弯路,专门上网查了相关资料,总结了一些2和3 的区别,很多内容是转载来的,大神们别鄙视哈。。。

1.性能 

Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可 
以取得很好的优化结果。 
Py3.1性能比Py2.5慢15%,还有很大的提升空间。 
2.编码 
Py3.X源码文件默认使用utf-8编码,这就使得以下代码是合法的: 
    >>> 中国 = 'china' 
    >>>print(中国) 
    china 
3. 语法 
1)去除了<>,全部改用!= 
2)去除``,全部改用repr() 
3)关键词加入as 和with,还有True,False,None 
4)整型除法返回浮点数,要得到整型结果,请使用// 
5)加入nonlocal语句。使用noclocal x可以直接指派外围(非全局)变量 


4、print函数

虽然print语法是Python 3中一个很小的改动,且应该已经广为人知,但依然值得提一下:Python 2中的print语句被Python 3中的print()函数取代,这意味着在Python 3中必须用括号将需要输出的对象括起来。

在Python 2中使用额外的括号也是可以的。但反过来在Python 3中想以Python2的形式不带括号调用print函数时,会触发SyntaxError。

Python 2

print 'Python', python_version()
print 'Hello, World!'
print('Hello, World!')
print "text",  ; print 'print more texton the same line'
Python  2.7.6
Hello,
Hello,
text  print

Python 3

print('Python', python_version())
print('Hello, World!')
 
print("some text,", end="")
print(' print more text on the same line')
Python  3.4.1
Hello,
some text, print
print 'Hello, World!'
File  "<ipython-input-3-139a7c5835bd>", line  1
print 'Hello, World!'
^
SyntaxError:

注意:

在Python中,带不带括号输出”Hello World”都很正常。但如果在圆括号中同时输出多个对象时,就会创建一个元组,这是因为在Python 2中,print是一个语句,而不是函数调用。

print 'Python', python_version()
print('a', 'b')
print 'a',  'b'
Python  2.7.7
('a', 'b')
a b



5、整数除法

由于人们常常会忽视Python 3在整数除法上的改动(写错了也不会触发Syntax Error),所以在移植代码或在Python 2中执行Python 3的代码时,需要特别注意这个改动。

所以,我还是会在Python 3的脚本中尝试用float(3)/2或 3/2.0代替3/2,以此来避免代码在Python 2环境下可能导致的错误(或与之相反,在Python 2脚本中用from __future__import division来使用Python 3的除法)。

Python 2

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  2.7.6
3 / 2  = 1
3 // 2  = 1
3 / 2.0  = 1.5
3 // 2.0  = 1.0

Python 3

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



6、xrange

在Python 2.x中,经常会用xrange()创建一个可迭代对象,通常出现在“for循环”或“列表/集合/字典推导式”中。

这种行为与生成器非常相似(如”惰性求值“),但这里的xrange-iterable无尽的,意味着可能在这个xrange上无限迭代。

由于xrange的“惰性求知“特性,如果只需迭代一次(如for循环中),range()通常比xrange()快一些。不过不建议在多次迭代中使用range(),因为range()每次都会在内存中重新生成一个列表。

在Python 3中,range()的实现方式与xrange()函数相同,所以就不存在专用的xrange()(在Python 3中使用xrange()会触发NameError)。

import
 
n  = 10000
def test_range(n):
 return for i  in range(n):
 pass
 
def test_xrange(n):
 for i in xrange(n):
 pass

Python 2

print 'Python', python_version()
 
print 'ntiming range()'
%timeit test_range(n)
 
print 'nntiming xrange()'
%timeit test_xrange(n)
Python  2.7.6
 
timing range()
1000 loops, best of 3:  433
 
timing xrange()
1000 loops, best of 3:  350

Python 3

print('Python', python_version())
 
print('ntiming range()')
%timeit test_range(n)
Python  3.4.1
 
timing range()
1000 loops, best of 3:  520
print(xrange(10))
---------------------------------------------------------------------------
NameError Traceback  (most recent call last)
in ()
----> 1 print(xrange(10))
 
NameError: name 'xrange' is not





作者:王猫猫


> 1. print不再是语句,而是函数,比如原来是 print 'abc' 现在是 print('abc')
但是 python2.6+ 可以使用 from __future__ import print_function 来实现相同功能
> 2. 在Python 3中,没有旧式类,只有新式类,也就是说不用再像这样 class Foobar(object): pass 显式地子类化object
但是最好还是加上. 主要区别在于 old-style 是 classtype 类型而 new-style 是 type类型
> 3. 原来1/2(两个整数相除)结果是0,现在是0.5了
python 2.2+ 以上都可以使用 from __future__ import division 实现改特性, 同时注意 // 取代了之前的 / 运算
> 4. 新的字符串格式化方法format取代%
错误, 从 python2.6+ 开始已经在str和unicode中有该方法, 同时 python3依然支持 % 算符
> 6. xrange重命名为range
同时更改的还有一系列内置函数及方法, 都返回迭代器对象, 而不是列表或者 元组, 比如 filter, map, dict.items 等
> 7. !=取代 < > 
python2 也很少有人用 < > 所以不算什么修改
> 8. long重命名为int
不完全对, python3 彻底废弃了 long+int 双整数实现的方法, 统一为 int , 支持高精度整数运算.
> 9. except Exception, e变成except (Exception) as e
只有 python2.5 及以下版本不支持该语法. python2.6 是支持的. 不算新东西
> 10. exec变成函数
类似 print() 的变化, 之前是语句.