美文网首页
Python2 与 Python3 区别

Python2 与 Python3 区别

作者: 月亮是我踢弯得 | 来源:发表于2018-08-14 18:02 被阅读0次

一.性能

python3.x的性能低于Python2.x,但是python3.x有极大的优化空间,正在追赶.

二.基本语法差异

一).核心语法差异

1.Python3对Unicode字符的原生支持
Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str和unicode,Python3只支持unicode的string。python2和python3字节和字符对应关系为:


img

2.Python3采用的是绝对路径的方式进行import。
Python2中相对路径的import会导致标准库导入变得困难(想象一下,同一目录下有file.py,如何同时导入这个文件和标准库file)。Python3中这一点将被修改,如果还需要导入同一目录的文件必须使用绝对路径,否则只能使用相关导入的方式来进行导入。
3.Python2中存在老式类和新式类的区别,Python3统一采用新式类。新式类声明要求继承object,必须用新式类应用多重继承。
4.Python3使用更加严格的缩进。Python2的缩进机制中,1个tab和8个space是等价的,所以在缩进中可以同时允许tab和space在代码中共存。
这种等价机制会导致部分IDE使用存在问题。Python3中1个tab只能找另外一个tab替代,因此tab和space共存会导致报错:TabError: inconsistent use of tabs and spaces in indentation.

二).废弃类差异

1.print语句被python3废弃,统一使用print函数
2.exec语句被python3废弃,统一使用exec函数
3.execfile语句被Python3废弃,推荐使用exec(open("./filename").read())
4.不相等操作符"<>"被Python3废弃,统一使用"!="
5.long整数类型被Python3废弃,统一使用int
6.xrange函数被Python3废弃,统一使用range,Python3中range的机制也进行修改并提高了大数据集生成效率
7.Python3中这些方法再不再返回list对象:dictionary关联的keys()、values()、items(),zip(),map(),filter(),但是可以通过list强行转换:

mydict={"a":1,"b":2,"c":3}
mydict.keys()  #<built-in method keys of dict object at 0x000000000040B4C8>
list(mydict.keys()) #['a', 'c', 'b']

8.迭代器iterator的next()函数被Python3废弃,统一使用next(iterator)
9.raw_input函数被Python3废弃,统一使用input函数
10.字典变量的has_key函数被Python废弃,统一使用in关键词
11.file函数被Python3废弃,统一使用open来处理文件,可以通过io.IOBase检查文件类型
12.apply函数被Python3废弃
13.异常StandardError 被Python3废弃,统一使用Exception

三).修改类差异

1.浮点数除法操作符/和//区别

  • Python2:/是整数除法,//是小数除法
    运行 "5/3"得出结果为1, 如果想得出小数部分, 则需要把代码改成:"float(5)/float(3)", 即加上类型.
  • Python3:/是小数除法,//是整数除法。
    运行"5/3"得出结果为1.666666, 如果只得到整数部分,则需要修改代码为:"5//3", 即使用整除.

2.异常抛出和捕捉机制区别
所有异常都从BaseException继承, 并且删除了StandardError

  • Python2
    try:
      ...
    except Exception, e:
raise IOError, "file error" #抛出异常
except NameError, err:  #捕捉异常
  • Python3
    try:
        ...
    except Exception as e:
raise IOError("file error") #抛出异常
except NameError as err: #捕捉异常

3.for循环中变量值区别

  • Python2,for循环会修改外部相同名称变量的值
     i = 1
     print ('comprehension: ', [i for i in      range(5)])
     print ('after: i =', i  ) #i=4
  • Python3,for循环不会修改外部相同名称变量的值
    i = 1
    print ('comprehension: ', [i for i in range(5)])
    print ('after: i =', i  ) #i=1

4.round函数返回值区别

  • Python2,round函数返回float类型值
     isinstance(round(15.5),int) #True
  • Python3中只有同一数据类型的对象可以比较
     isinstance(round(15.5),float) #True

5.比较操作符区别

  • Python2中任意两个对象都可以比较
    11 < 'test' #True
  • Python3中只有同一数据类型的对象可以比较
   11 < 'test' # TypeError: unorderable types: int() < str()

6.map、filter 和 reduce的差异

  • 这三个函数号称是函数式编程的代表。在 Python3.x 和 Python2.x 中也有了很大的差异。
    首先我们先简单的在 Python2.x 的交互下输入 map 和 filter,看到它们两者的类型是 built-in function(内置函数):
>>> map
<built-in function map>
>>> filter
<built-in function filter>
>>>

它们输出的结果类型都是列表:

>>> map(lambda x:x *2, [1,2,3])
[2, 4, 6]
>>> filter(lambda x:x %2 ==0,range(10))
[0, 2, 4, 6, 8]
>>>

但是在Python 3.x中它们却不是这个样子了:

>>> map
<class 'map'>
>>> map(print,[1,2,3])
<map object at 0x10d8bd400>
>>> filter
<class 'filter'>
>>> filter(lambda x:x % 2 == 0, range(10))
<filter object at 0x10d8bd3c8>
>>>

首先它们从函数变成了类,其次,它们的返回结果也从当初的列表成了一个可迭代的对象, 我们尝试用 next 函数来进行手工迭代:

>>> f =filter(lambda x:x %2 ==0, range(10))
>>> next(f)
0
>>> next(f)
2
>>> next(f)
4
>>> next(f)
6
>>>

对于比较高端的 reduce 函数,它在 Python 3.x 中已经不属于 built-in 了,被挪到 functools 模块当中。
7.打开文件

  • python2中
file( ..... )
或 
open(.....)
  • Python3中
    加入了"as"和"with"关键字, 用于打开文件
open with(.....) as :

8.chr( K ) 与 ord( c )

  • python 2
    chr( K ) 将编码K 转为字符,K的范围是 0 ~ 255
    ord( c ) 取单个字符的编码, 返回值的范围: 0 ~ 255
  • python 3
    chr( K ) 将编码K 转为字符,K的范围是 0 ~ 65535
    ord( c ) 取单个字符的编码, 返回值的范围: 0 ~ 65535

四).新增类差异

  1. python3.x中加入了nonlocal语句
    python引用变量的顺序
    • 1.当前作用域局部变量
    • 2.外层作用域变量
    • 3.当前模块中的全局变量
      1. python内置变量
        与global相似

nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量

示例1
        def sub():
            n = 100  # 局部变量
            print(n)

            def sub2():
            nonlocal n  # 非本地的(非全局的)外部变量
            n -= 10
            print(n)
            return sub2
        s = sub()
        s()
        s()
        输出:
            100
            90
            80
示例2
        def main():
            def local_n():
            n = 200

            def nonlocal_n():
            nonlocal n
            n = 300

            def global_n():
            global n  # 声明为全局变量
            n = 400

            n = 10
            local_n()
            print(n)

            nonlocal_n()
            print(n)

            global_n()
            print('global_n() After:{0}'.format(n))  # 显示的局部变量

        main()
        print('n = {0}'.format(n))

            --------------------------------------------------------
         
              10
              300
              global_n() After:300
              n = 400

2.dict字典变动

python3.x 去除了dict.iterkeys(),dict.itervalues(),dict.iteritems(), dict.has_key()方法
新增: dict.keys(),dict.values(),dict.items()
3.面向对象
引入抽象基类(Abstraact Base Classes,ABCs)
 import abc
 @abc.abstractmethod
4.模块变动

旧的名字 新的名字
_winreg winreg
COngigParser configpaeser
copy_reg copyreg
Queue queue
SocketServer sockerserver
repr reprlib

相关文章

网友评论

      本文标题:Python2 与 Python3 区别

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