美文网首页
Python 2 和 Python 3 有哪些主要区别?

Python 2 和 Python 3 有哪些主要区别?

作者: 大富帅 | 来源:发表于2018-03-05 11:39 被阅读49次

    语法

    1. print不再是语句,而是函数,比如原来是 print 'abc' 现在是 print('abc')
      但是 python2.6+ 可以使用 from future import print_function 来实现相同功能

    2. 在Python 3中,没有旧式类,只有新式类,也就是说不用再像这样 class Foobar(object): pass 显式地子类化object

    3. 原来1/2(两个整数相除)结果是0,现在是0.5了

    #python 2
    >>> 1/2
    0
    
    #python3
    >>> 1/2
    0.5
    
    1. 异常的写法改变:原来的except Exception, e 变成 except (Exception) as e

    编码

    Python2 的默认编码是 asscii,这也是导致 Python2 中经常遇到编码问题的原因之一,至于是为什么会使用 asscii 作为默认编码,原因在于 Python这门语言诞生的时候还没出现 Unicode。Python 3 默认采用了 UTF-8 作为默认编码,因此你不再需要在文件顶部写 # coding=utf-8 了。

    # python2
    >>> print sys.getdefaultencoding()
    ascii
    
    # python3
    >>> print(sys.getdefaultencoding())
    utf-8
    

    字符串

    字符串是最大的变化之一,这个变化使得编码问题降到了最低可能。在 Python2 中,字符串有两个类型,一个是 unicode,一个是 str,前者表示文本字符串,后者表示字节序列,不过两者并没有明显的界限,开发者也感觉很混乱,不明白编码错误的原因,不过在 Python3 中两者做了严格区分,分别用 str 表示字符串,byte 表示字节序列,任何需要写入文本或者网络传输的数据都只接收字节序列,这就从源头上阻止了编码错误的问题。

    >>> s = '中文'
    >>> s
    '中文'
    >>> type(s)
    <class 'str'>
    # 上面的str类型对象实际上相当于py2的unicode
    
    s.encode('utf-8')
    b'\xe4\xb8\xad\xe6\x96\x87'
    # str对象encode utf-8后,变成bytes对象,所以bytes对象取代了py2的str对象
    

    所以:

    • py2 -> unicode -> 被 py3的str对象代替
    • py2 -> str -> 被py3的bytes对象代替
    py2 与 py3 字符串差异比较

    迭代器

    在 Python2 中很多返回列表对象的内置函数和方法在 Python 3 都改成了返回类似于迭代器的对象,因为迭代器的惰性加载特性使得操作大数据更有效率。Python2 中的 range 和 xrange 函数合并成了 range,如果同时兼容2和3,可以这样:

    try:
        range = xrange
    except:
        pass
    

    另外,字典对象的 dict.keys()、dict.values() 方法都不再返回列表,而是以一个类似迭代器的 "view" 对象返回。高阶函数 map、filter、zip 返回的也都不是列表对象了。Python2的迭代器必须实现 next 方法,而 Python3 改成了 next

    map方法返回了迭代器而不再是列表

    # py2
    #直接返回列表
    >>> map(lambda x: x*x, range(1, 3))
    [1, 4]
    
    #py3
    # 返回迭代器
    >>> map(lambda x: x*x, range(1, 3))
    <map object at 0x7f45371e5c18>
    
    #需要遍历才能读取,这样对于大数据会更高效率
    >>> map_data = map(lambda x: x*x, range(1, 3))
    >>> for m in map_data:
    ...     print(m)
    ... 
    1
    4
    

    asyncio 异步IO模型

    asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。

    asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。

    相关文章

      网友评论

          本文标题:Python 2 和 Python 3 有哪些主要区别?

          本文链接:https://www.haomeiwen.com/subject/jwvcfftx.html