详解python2 和 python3的差异

看到这个标题咱们或许猜到了我接下来要讲些什么,呵呵,对了,那就是列出这两个不同版别间的却别!
查找一下咱们就会知道,python有两个首要的版别,python2 和 python3 ,可是python又不同于其他言语,向下兼容,python3是不向下兼容的,可是绝大多数组件和扩展都是依据python2的,下面就来总结一下python2和python3的差异。

 
1.功用 
Py3.0运转 pystone benchmark的速度比Py2.5慢30%。Guido以为Py3.0有极大的优化空间,在字符串和整形操作上可 
以取得很好的优化成果。 
Py3.1功用比Py2.5慢15%,还有很大的提高空间。 
2.编码 
Py3.X源码文件默许运用utf-8编码,这就使得以下代码是合法的: 
    >>> 我国 = 'china' 
    >>>print(我国) 
    china 
3. 语法 
1)去除了<>,悉数改用!= 
2)去除``,悉数改用repr() 
3)关键词参加as 和with,还有True,False,None 
4)整型除法回来浮点数,要得到整型成果,请运用// 
5)参加nonlocal句子。运用noclocal x能够直接指使外围(非大局)变量 
6)去除print句子,参加print()函数完成相同的功用。相同的还有 exec句子,现已改为exec()函数 
   例如: 
     2.X: print "The answer is", 2*2 
     3.X: print("The answer is", 2*2) 
     2.X: print x,                              # 运用逗号结束制止换行 
     3.X: print(x, end=" ")                     # 运用空格替代换行 
     2.X: print                                 # 输出新行 
     3.X: print()                               # 输出新行 
     2.X: print >>sys.stderr, "fatal error" 
     3.X: print("fatal error", file=sys.stderr) 
     2.X: print (x, y)                          # 输出repr((x, y)) 
     3.X: print((x, y))                         # 不同于print(x, y)! 
7)改动了次序操作符的行为,例如x<y,当x和y类型不匹配时抛出TypeError而不是回来随即的 bool值  
8)输入函数改动了,删去了raw_input,用input替代: 
   2.X:guess = int(raw_input('Enter an integer : ')) # 读取键盘输入的办法 
   3.X:guess = int(input('Enter an integer : '))
 
9)去除元组参数解包。不能def(a, (b, c)):pass这样界说函数了 
10)新式的8进制字变量,相应地批改了oct()函数。 
   2.X的办法如下: 
     >>> 0666 
     438 
     >>> oct(438) 
     '0666' 
   3.X这样: 
     >>> 0666 
     SyntaxError: invalid token (<pyshell#63>, line 1) 
     >>> 0o666 
     438 
     >>> oct(438) 
     '0o666' 
11)添加了 2进制字面量和bin()函数 
    >>> bin(438) 
    '0b110110110' 
    >>> _438 = '0b110110110' 
    >>> _438 
    '0b110110110' 
12)扩展的可迭代解包。在Py3.X 里,a, b, *rest = seq和 *rest, a = seq都是合法的,只要求两点:rest是list 
目标和seq是可迭代的。 
13)新的super(),能够不再给super()传参数, 
    >>> class C(object): 
          def __init__(self, a): 
             print('C', a) 
    >>> class D(C): 
          def __init(self, a): 
             super().__init__(a) # 无参数调用super() 
    >>> D(8) 
    C 8 
    <__main__.D object at 0x00D7ED90> 
14)新的metaclass语法: 
    class Foo(*bases, **kwds): 
      pass 
15)支撑class decorator。用法与函数decorator相同: 
    >>> def foo(cls_a): 
          def print_func(self): 
             print('Hello, world!') 
          cls_a.print = print_func 
          return cls_a 
    >>> @foo 
    class C(object): 
      pass 
    >>> C().print() 
    Hello, world! 
class decorator能够用来玩玩狸猫换太子的大花招。更多请参阅PEP 3129 
4. 字符串和字节串 
1)现在字符串只要str一种类型,但它跟2.x版别的unicode简直相同。
 
2)关于字节串,请参阅“数据类型”的第2条目 
5.数据类型 
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替代它吧 
6.面向目标 
1)引进笼统基类(Abstraact Base Classes,ABCs)。 
2)容器类和迭代器类被ABCs化,所以cellections模块里的类型比Py2.5多了许多。 
    >>> import collections 
    >>> print('\n'.join(dir(collections))) 
    Callable 
    Container 
    Hashable 
    ItemsView 
    Iterable 
    Iterator 
    KeysView 
    Mapping 
    MappingView 
    MutableMapping 
    MutableSequence 
    MutableSet 
    NamedTuple 
    Sequence 
    Set 
    Sized 
    ValuesView 
    __all__ 
    __builtins__ 
    __doc__ 
    __file__ 
    __name__ 
    _abcoll 
    _itemgetter 
    _sys 
    defaultdict 
    deque 
别的,数值类型也被ABCs化。关于这两点,请参阅 PEP 3119和PEP 3141。 
3)迭代器的next()办法改名为__next__(),并添加内置函数next(),用以调用迭代器的__next__()办法 
4)添加了@abstractmethod和 @abstractproperty两个 decorator,编写笼统办法(特点)愈加便利。 
7.反常 
1)所以反常都从 BaseException承继,并删去了StardardError 
2)去除了反常类的序列行为和.message特点 
3)用 raise Exception(args)替代 raise Exception, args语法 
4)捕获反常的语法改动,引进了as关键字来标识反常实例,在Py2.5中: 
    >>> try: 
    ...    raise NotImplementedError('Error') 
    ... except NotImplementedError, error:
 
    ...    print error.message 
    ... 
    Error 
在Py3.0中: 
    >>> try: 
          raise NotImplementedError('Error') 
        except NotImplementedError as error: #留意这个 as 
          print(str(error)) 
    Error 
5)反常链,由于__context__在3.0a1版别中没有完成 
8.模块变化 
1)移除了cPickle模块,能够运用pickle模块替代。终究咱们将会有一个通明高效的模块。 
2)移除了imageop模块 
3)移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2,  
rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块 
4)移除了bsddb模块(独自发布,能够从http://www.jcea.es/programacion/pybsddb.htm获取) 
5)移除了new模块 
6)os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下 
7)tokenize模块现在运用bytes作业。首要的进口点不再是generate_tokens,而是 tokenize.tokenize() 
9.其它 
1)xrange() 改名为range(),要想运用range()取得一个list,有必要显式调用: 
    >>> list(range(10)) 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
2)bytes目标不能hash,也不支撑 b.lower()、b.strip()和b.split()办法,但关于后两者能够运用 b.strip(b’  
\n\t\r \f’)和b.split(b’ ‘)来到达相同意图 
3)zip()、map()和filter()都回来迭代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload 
()函数都被去除了
 
现在能够运用hasattr()来替换 callable(). hasattr()的语法如:hasattr(string, '__name__')
 
4)string.letters和相关的.lowercase和.uppercase被去除,请改用string.ascii_letters 等 
5)假如x < y的不能比较,抛出TypeError反常。2.x版别是回来伪随机布尔值的 
6)__getslice__系列成员被抛弃。a[i:j]依据上下文转化为a.__getitem__(slice(I, j))或 __setitem__和 
__delitem__调用 
7)file类被抛弃,在Py2.5中: 
    >>> file 
    <type 'file'> 
在Py3.X中: 
    >>> file 
    Traceback (most recent call last): 
    File "<pyshell#120>", line 1, in <module> 
       file 
    NameError: name 'file' is not defined

上一篇:详解python 局部变量与大局变量
下一篇:初学者学习python2仍是python3?

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854