• 隐藏侧边栏
  • 展开分类目录
  • 关注微信公众号
  • 我的GitHub
  • QQ:1753970025
Chen Jiehua

python2与python3的几点小区别 

Python 2在2020年元旦将正式停止官方支持(看这里),同时也有越来越多的 python 库不再支持 python 2,所以我们就来看看 pyhton 2 跟 python 3 有哪些区别,慢慢做个迁移~

__future__ 模块

通过 __future__ 模块,我们可以轻松使用 python 3 的特性,比如:

from __future__ import division

# result is 1.4
print 7/5

其它可以使用的特性主要有:

featureeffect
generatorsSimple Generators
divisionChanging the Division Operator
absolute_importImports: Multi-Line and Absolute/Relative
with_statementThe “with” Statement
print_functionMake print a function
unicode_literals
Bytes literals in Python 3000

print 函数

python 2 中 print 是表达式,python 3 中 print 是函数:

# python 2
print 'python'
print('python')

# python 3
print 'python'    # SyntaxError
print('python')

除法运算

# python 2
print 7/5    # 1
print -7/5   # -2

# python 3
print(7/5)   # 1.4
print(-7/5)  # -1.4

编码问题

python 2 中默认的字符串类型是 ASCII,python 3 中默认的字符串类型是 Unicode:

# python 2
print type('string')         # <type 'str'>
print type(b'string byte')   # <type 'str'>

# python 3
print(type('string'))        # <class 'str'>
print(type(b'string byte'))  # <class 'bytes'>

python 2 也支持 Unicode:

# python 2
print type('string')            # <type 'str'>
print type(u'string unicode')   # <type 'unicode'>

# python 3
print(type('string'))           # <class 'str'>
print(type(u'string unicode'))  # <class 'str'>

xrange

python 2 中 range() 返回一个list,xrange() 返回一个 xrange 对象(迭代器);使用 xrange() 在计算大范围时可以更加节省内存;

python 3 中不存在 xrange(),只有 range() 也就是 python 2 中的 xrange()

抛出异常

# python 2
raise IOError, 'file error'
raise IOError('file error')

# pyhton 3
raise IOError, 'file error'    # SyntaxError
raise IOError('file error')

异常处理

python 3 中 as 关键字时必须的,不可以省略

# python 2 可以正常执行
# python 3 报错:SyntaxError
try:
    1/0
except ZeroDivisionError, err:
    print(err)

# python 3 写法:
except ZeroDivisionError as err

next

python 2 中同时存在 next().next(),而 python 3 仅保留 next()

# python 2
generator = (letter for letter in "abcdefg")
next(generator)     # a
generator.next()    # b

# python 3
generator = (letter for letter in "abcdefg")
next(generator)     # a
generator.next()    # AttributeError

for循环变量和全局命名空间

python 3 中 for 循环的变量不会泄漏到全局命名空间。

# python 2
i = 1
print "before: i=", i                              # before: i=1
print "comprehension: ", [i for i in range(5)]     # comprehension: [0, 1, 2, 3, 4]
print "after: i=", i                               # after: i=4

# python 3
i = 1
print "before: i=", i                              # before: i=1
print "comprehension: ", [i for i in range(5)]     # comprehension: [0, 1, 2, 3, 4]
print "after: i=", i                               # after: i=1

input()

python 2 中,输入有两个函数 input()raw_input();

python 3 中仅保留 input() ,功能同 raw_input() ,输入对象类型始终保存为 str;

码字很辛苦,转载请注明来自ChenJiehua《python2与python3的几点小区别》

评论