zoukankan      html  css  js  c++  java
  • Python进阶之路---1.2python版本差异

                            Python2.*与python3.*版本差异

        作为一个初学者,我们应该如何选择python的版本进行学习呢,这两个版本有什么区别呢,接下来让我们简单了解一下,以便我们后续的学习。

    Python版本差异简介

    使用_future_模块

    Print函数

    整数除法

    Unicode

    Xrange

    触发异常

    处理异常

    next()函数和.net()方法

    for循环变量与全局命名空间泄露

    比较无序类型

    使用input()解析输入内容

    返回可迭代对象,而不是列表

    使用_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:
    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

        
    
        from platform import python_version
    								

    print函数

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

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

    Python2

    print "hello word"

        Python3

    print('Hello, World!')
    print("some text,", end="")
    print(' print more text on the same line')

        注意:

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

    整数除法

          由于人们常常会忽视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的除法)。

    Python2

    print '3 / 2 =', 3 / 2
    print '3 // 2 =', 3 // 2
    print '3 / 2.0 =', 3 / 2.0
    print '3 // 2.0 =', 3 // 2.0
    
    3 / 2 = 1
    3 // 2 = 1
    3 / 2.0 = 1.5
    3 // 2.0 = 1.0

    Python3

    print('3 / 2 =', 3 / 2)
    print('3 // 2 =', 3 // 2)
    print('3 / 2.0 =', 3 / 2.0)
    print('3 // 2.0 =', 3 // 2.0)
    
    3 / 2 = 1.5
    3 // 2 = 1
    3 / 2.0 = 1.5
    3 // 2.0 = 1.0
     

    unicode

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

    而在Python 3中,终于有了Unicodeutf-8)字符串,以及两个字节类:bytesbytearrays

        Python2

    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'>

        Python3

      
    print(' has', type(b' bytes for storing data'))
    
    has <class 'bytes'>
    
    print(' also has', type(bytearray(b'bytearrays')))
    
    also has <class 'bytearray'>

    xrange

    在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。这个表现十分像生成器(比如。"惰性求值")。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。

    在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中 xrange() 会抛出命名异常)。

     
    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   

      python2

    print 'Python', python_version()
    
    print '
    timing range()' 
    %timeit test_range(n)
    
    print '
    
    timing 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

    python3

    print('Python', python_version())
    
    print('
    timing 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)
    <ipython-input-5-5d8f9b79ea70> in <module>()
    ----> 1 print(xrange(10))
    
    NameError: name 'xrange' is not defined

    八进制字面量表示

    八进制数必须写成0o777,原来的形式0777不能用了;二进制必须写成0b111。

    新增了一个bin()函数用于将一个整数转换成二进制字串。 Python 2.6已经支持这两种语法。

    在Python 3.x中,表示八进制字面量的方式只有一种,就是0o1000。

    python 2x

    >>> 0o1000
    512
    >>> 01000
    512

    python 3x

    >>> 01000
      File "<stdin>", line 1
        01000
            ^
    SyntaxError: invalid token
    >>> 0o1000
    512

    不等运算符

    Python 2.x中不等于有两种写法 != 和 <>

    Python 3.x中去掉了<>, 只有!=一种写法。

    去掉了repr表达式``

    Python 2.x 中反引号``相当于repr函数的作用

    Python 3.x 中去掉了``这种写法,只允许使用repr函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用repr的机会很少,一般只在debug的时候才用,多数时候还是用str函数来用字符串描述对象。

    def sendMail(from_: str, to: str, title: str, body: str) -> bool:
        pass

    多个模块被改名(根据PEP8)

    旧的名字新的名字
    _winreg winreg
    ConfigParser configparser
    copy_reg copyreg
    Queue queue
    SocketServer socketserver
    repr reprlib

    StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。Python 2.6已经支援新的io模组。

    httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。

    取消了exec语句,只剩下exec()函数。 Python 2.6已经支援exec()函数。

    数据类型

    1)Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long

    2)新增了bytes类型,对应于2.X版本的八位串,定义一个bytes字面量的方法如下:

    >>> b = b'china' 
    >>> type(b) 
    <type 'bytes'> 

    str对象和bytes对象可以使用.encode() (str -> bytes) or .decode() (bytes -> str)方法相互转化。

    >>> s = b.decode() 
    >>> s 
    'china' 
    >>> b1 = s.encode() 
    >>> b1 
    b'china'

    3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。

  • 相关阅读:
    子集生成——增量构造法+位向量法+二进制法
    记忆化搜索
    欧拉回路和欧拉通路
    拓扑排序(基于dfs+基于队列)
    HDU 3839 Ancient Messages(DFS)
    【gulp】前端自动化工具---gulp的使用(一)------【巷子】
    【面向对象】用大白话扯扯那"神奇"的面向对象之方法继承(五)------【巷子】
    【面向对象】----【prototype&&__proto__&&实例化对象三者之间的关系】(四)-----【巷子】
    【面向对象】用大白话扯扯那"神奇"的面向对象之属性继承(三)------【巷子】
    【面向对象】用大白话扯扯那"神奇"的面向对象编程思维(二)------【巷子】
  • 原文地址:https://www.cnblogs.com/lixingli/p/5083119.html
Copyright © 2011-2022 走看看