Python 2.7.x 和 3.x 版本的重要区别小结

许多Python初学者都会问:我应该学习哪个版本的Python。对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本。等学得差不多了,再来研究不同版本之间的差别”。

但如果想要用Python开发一个新项目,那么该如何选择Python版本呢?我可以负责任的说,大部分Python库都同时支持Python
2.7.x和3.x版本的,所以不论选择哪个版本都是可以的。但为了在使用Python时避开某些版本中一些常见的陷阱,或需要移植某个Python项目时,依然有必要了解一下Python两个常见版本之间的主要区别。

目录

  • 使用__future__模块
  • print函数
  • 整数除法
  • Unicode
  • xrange
  • 触发异常
  • 处理异常
  • next()函数和.next()方法
  • For循环变量与全局命名空间泄漏
  • 比较无序类型
  • 使用input()解析输入内容
  • 返回可迭代对象,而不是列表
  • 更多关于Python 2和Python 3的文章

__future__模块

[ 回到目录 ]

Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python
2中,可以通过内置的__future__模块导入这些新内容。如果你希望在Python 2环境下写的代码也可以在Python
3.x中运行,那么建议使用__future__模块。例如,如果希望在Python 2中拥有Python
3.x的整数除法行为,可以通过下面的语句导入相应的模块。


    from __future__ import division

下表列出了__future__中其他可导入的特性:

特性 可选版本 强制版本 效果
nested_scopes 2.1.0b1 2.2 [ PEP 227

](http://www.python.org/dev/peps/pep-0227) :
Statically Nested Scopes
generators | 2.2.0a1 | 2.3 | PEP 255
:
Simple Generators
division | 2.2.0a2 | 3.0 | PEP 238
:
Changing the Division Operator
absolute_import | 2.5.0a1 | 3.0 | PEP 328
:
Imports: Multi-Line and Absolute/Relative
with_statement | 2.5.0a1 | 2.6 | PEP 343
:
The “with” Statement
print_function | 2.6.0a2 | 3.0 | PEP 3105
:
Make print a function
unicode_literals | 2.6.0a2 | 3.0 | PEP 3112
:
Bytes literals in Python 3000

(来源: https://docs.python.org/2/library/ future .html
)

示例:


    from platform import python_version

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 text on 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

整数除法

[ 回到目录 ]

由于人们常常会忽视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

Unicode

[ 回到目录 ]

Python 2有基于ASCII的str()类型,其可通过单独的unicode()函数转成unicode类型,但没有byte类型。

而在Python 3中,终于有了Unicode(utf-8)字符串,以及两个字节类:bytes和bytearrays。

Python 2


    print 'Python', python_version()

    Python 2.7.6

    print type(unicode('this is like a python3 str type'))

    <type 'unicode'>

    print type(b'byte type does not exist')

    <type 'str'>

    print 'they are really' + b' the same'

    they are really the same

    print type(bytearray(b'bytearray oddly does exist though'))

    <type 'bytearray'>

Python 3


    print('Python', python_version())
    print('strings are now utf-8 u03BCnicou0394é!')

    Python 3.4.1
    strings are now utf-8 μnicoΔé!

    print('Python', python_version(), end="")
    print(' has', type(b' bytes for storing data'))

    Python 3.4.1 has <class 'bytes'>

    print('and Python', python_version(), end="")
    print(' also has', type(bytearray(b'bytearrays')))

    and Python 3.4.1 also has <class 'bytearray'>

    'note that we cannot add a string' + b'bytes for data'

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值