Python 2和 3版本的一些区别

     最近在学习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, World!

Hello, World!

text print more text on the same line

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, World!

some text, print more text on the same line

print 'Hello, World!'

File "<ipython-input-3-139a7c5835bd>", line 1

print 'Hello, World!'

^

SyntaxError: invalid syntax

注意:

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 timeit

 

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 µs per loop

 

timing xrange()

1000 loops, best of 3: 350 µs per loop

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 µs per loop

print(xrange(10))

---------------------------------------------------------------------------

NameError Traceback (most recent call last)

in ()

----> 1 print(xrange(10))

 

NameError: name 'xrange' is not defined



附知乎大神的答复

作者:王猫猫
链接:http://www.zhihu.com/question/19698598/answer/12704353
来源:知乎

> 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() 的变化, 之前是语句.


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值