Python 3 - 新功能

  • __future__ 模块

    Python 3.x 引入了一些 Python 2 不兼容的关键字和函数,这些关键字和函数可以通过 Python 2 中内置的 __future__ 模块导入。如果您计划为您的代码提供 Python 3.x 支持,建议使用 __future__ 导入。
    例如,如果我们想要在 Python 2 中使用 Python 3.x 的整数除法行为,请添加以下 import 语句。
    
    from __future__ import division
    
  • print 函数

    Python 3 中最显着和最广为人知的变化是print函数被使用。现在必须将括号 () 与print 函数一起使用。它在 Python 2 中是可选的。
    
    print "Hello World" #is acceptable in Python 2
    print ("Hello World") # in Python 3, print must be followed by ()
    
    默认情况下,print() 函数会在末尾插入一个新行。在 Python 2 中,可以通过在末尾放置 ',' 来抑制它。在 Python 3 中,"end =' '" 附加空格而不是换行符。
    
    print x,           # Trailing comma suppresses newline in Python 2
    print(x, end=" ")  # Appends a space instead of a newline in Python 3
    
  • 从键盘读取输入

    Python 2 有两个版本的输入函数,input()raw_input(). 如果接收到的数据包含在引号“”或“”中,则 input() 函数将接收到的数据视为字符串,否则将数据视为数字。
    在 Python 3 中,raw_input() 函数已弃用。此外,接收到的数据始终被视为字符串。
    
    In Python 2
    >>> x = input('something:') 
    something:10 #entered data is treated as number
    >>> x
    10
    >>> x = input('something:')
    something:'10' #entered data is treated as string
    >>> x
    '10'
    >>> x = raw_input("something:")
    something:10 #entered data is treated as string even without ''
    >>> x
    '10'
    >>> x = raw_input("something:")
    something:'10' #entered data treated as string including ''
    >>> x
    "'10'"
    In Python 3
    >>> x = input("something:")
    something:10
    >>> x
    '10'
    >>> x = input("something:")
    something:'10' #entered data treated as string with or without ''
    >>> x
    "'10'"
    >>> x = raw_input("something:") # will result NameError
    Traceback (most recent call last):
       File "<pyshell#3>", line 1, in 
      <module>
       x = raw_input("something:")
    NameError: name 'raw_input' is not defined
    
  • 整数除法

    在 Python 2 中,两个整数相除的结果四舍五入为最接近的整数。结果,3/2 将显示 1。为了获得浮点除法,分子或分母必须显式用作 float。因此,3.0/2 或 3/2.0 或 3.0/2.0 将导致 1.5
    Python 3 默认将 3 / 2 计算为 1.5,这对于新程序员来说更直观。
  • Unicode 表示

    如果您想将字符串存储为 Unicode,Python 2 要求您用 au 标记它。
    默认情况下,Python 3 将字符串存储为 Unicode。我们有 Unicode (utf-8) 字符串和 2 个字节类:字节和字节数组。
  • xrange() 函数已删除

    在 Python 2 中,range() 返回一个列表,而 xrange() 返回一个对象,该对象只会在需要时生成范围内的项目,从而节省内存。
    在 Python 3 中,range() 函数被删除,xrange() 已重命名为 range()。此外,range() 对象支持 Python 3.2 及更高版本中的切片。
  • 引发异常

    Python 2 接受两种表示法,即“旧”和“新”语法;如果我们没有将异常参数括在括号中,Python 3 会引发 SyntaxError。
    
    raise IOError, "file error" #This is accepted in Python 2
    raise IOError("file error") #This is also accepted in Python 2
    raise IOError, "file error" #syntax error is raised in Python 3
    raise IOError("file error") #this is the recommended syntax in Python 3
    
  • 异常中的参数

    在 Python 3 中,异常参数应使用“as”关键字声明。
    
    except Myerror, err: # In Python2
    except Myerror as err: #In Python 3
    
  • next() 函数和 .next() 方法

    在 Python 2 中,允许将 next() 作为生成器对象的方法。在 Python 2 中,用于遍历生成器对象的 next() 函数也被接受。然而,在 Python 3 中,next(0 作为生成器方法已停止并引发AttributeError.
    
    gen = (letter for letter in 'Hello World') # creates generator object
    next(my_generator) #allowed in Python 2 and Python 3
    my_generator.next() #allowed in Python 2. raises AttributeError in Python 3
    
  • 2to3效用

    与 Python 3 解释器一起,2to3.py 脚本通常安装在 tools/scripts 文件夹中。它读取 Python 2.x 源代码并应用一系列修复程序将其转换为有效的 Python 3.x 代码。
    
    Here is a sample Python 2 code (area.py):
    def area(x,y = 3.14): 
       a = y*x*x
       print a
       return a
    a = area(10)
    print "area",a
    To convert into Python 3 version:
    $2to3 -w area.py
    Converted code :
    def area(x,y = 3.14): # formal parameters
       a = y*x*x
       print (a)
       return a
    a = area(10)
    print("area",a)