Python3.x和Python2.x的差异dongfang - 千亿集团

Python3.x和Python2.x的差异dongfang

2018-10-05 08:48:48 | 作者: 环亚 | 标签: 运用,函数,模块 | 浏览: 3977

Python3.x和Python2.x的差异

这个星期开端学习Python了,由于看的书都是依据 Python2.x,并且我装置的是Python3.1,所以书上写的当地许多都不适用于Python3.1,特意在Google上search了一下 3.x和2.x的差异。特此在自己的空间中记载一下,以备今后查找便利,也能够共享给想学习Python的friends.

 

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 = bchina
    type(b)
    type bytes
str目标和bytes目标能够运用.encode() (str - bytes) or .decode() (bytes - str)办法彼此转化。
    s = b.decode()
    s
    china
    b1 = s.encode()
    b1
    bchina
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模块(独自发布,能够从https://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

 

 

转博客园https://www.cnblogs.com/codingmylife/archive/2010/06/06/1752807.html

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章