python3.0与2.x之间的区别

1125阅读 0评论2012-09-26 zdm
分类:

1.性能
Py3.0运行pystone benchmark的速度比Py2.530%Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果。

2.编码
Py3.0源码文件默认使用utf-8编码,这就使得以下代码是合法的:

点击(此处)折叠或打开

  1. >>>中国 = 'china'
  2. >>> print(中国)
  3. china
3.语法
1)去除了<>,全部改用!=

2)去除``,全部改用repr()

3)关键词加入aswith,还有True,False,None

4)整型除法返回浮点数,要得到整型结果,请使用//

5)加入nonlocal语句。使用noclocal x可以直接指派外围(非全局)变量

6)去除print语句,加入print()函数实现相同的功能。同样的还有exec语句,已经改为exec()

4、函数
1)print语句被print()函数取代了,可以使用关键字参数来替代老的print特殊语法。例如:

点击(此处)折叠或打开

  1. Old: print "The answer is", 2*2
  2. New: print("The answer is", 2*2)

  3. Old: print x, # 使用逗号结尾禁止换行
  4. New: print(x, end=" ") # 使用空格代替换行

  5. Old: print # 输出新行
  6. New: print() # 输出新行

  7. Old: print >>sys.stderr, "fatal error"
  8. New: print("fatal error", file=sys.stderr)

  9. Old: print (x, y) # 输出repr((x, y))
  10. New: print((x, y)) # 不同于print(x, y)!
2)改变了顺序操作符的行为,例如x,当xy类型不匹配时抛出TypeError而不是返回随即的bool
3)输入函数改变了:

点击(此处)折叠或打开

  1. Old:
  2. guess = int(raw_input('Enter an integer : ')) #读取键盘输入的方法
  3. New:
  4. guess = int(input('Enter an integer : '))

4)
去除元组参数解包。不能def(a, (b, c)):pass这样定义函数
5)新式的8进制字变量,相应地修改了oct()函数。2.x的方式如下

点击(此处)折叠或打开

  1. >>> 0666
  2. 438
  3. >>> oct(438)
  4. '0666'

  5. 3.0这样:
  6. >>> 0666
  7. SyntaxError: invalid token (<pyshell#63>, line 1)
  8. >>> 0o666
  9. 438
  10. >>> oct(438)
  11. '0o666'
6)增加了2进制字面量和bin()函数

点击(此处)折叠或打开

  1. >>> bin(438)
  2. '0b110110110'
  3. >>> _438 = '0b110110110'
  4. >>> _438
  5. '0b110110110'
7)扩展的可迭代解包。在Py3.0里,a, b, *rest = seq *rest, a = seq都是合法的,只要求两点:restlist对象和seq是可迭代的

8)新的super(),可以不再给super()传参数

点击(此处)折叠或打开

  1. >>> class C(object):
  2.       def __init__(self, a):
  3.              print('C', a)
  4. >>> class D(C):
  5.       def __init(self, a):
  6.              super().__init__(a) #无参数调用super()
  7. >>> D(8)
  8. C 8
  9. <__main__.D object at 0x00D7ED90>
9)新的metaclass语法

点击(此处)折叠或打开

  1. class Foo(*bases, **kwds):
  2.       pass
10)支持class decorator。用法与函数decorator一样:

点击(此处)折叠或打开

  1. >>> def foo(cls_a):
  2.       def print_func(self):
  3.              print('Hello, world!')
  4.       cls_a.print = print_func
  5.       return cls_a
  6. >>> @foo
  7. class C(object):
  8.       pass
  9. >>> C().print()
  10. Hello,

  11. class decorator可以用来玩玩狸猫换太子的大把戏。更多请参阅PEP 3129
5、字符串和字节串

1)现在字符串只有str一种类型,但它跟2.x版本的unicode几乎一样。
2)关于字节串,请参阅数据类型的第2条目

6、数据类型

1Py3.0去除了long类型,现在只有一种整型——int,但它的行为就像2.x版本的long
2)新增了bytes类型,对应于2.x版本的八位串,定义一个bytes字面量的方法如下:

点击(此处)折叠或打开

  1. >>> b = b'china'
  2. >>> type(b)
  3. <type 'bytes'>
3)str对象和bytes对象可以使用.encode() (str -> bytes) or .decode() (bytes -> str)方法相互转化

点击(此处)折叠或打开

  1. >>> s = b.decode()
  2. >>> s
  3. 'china'
  4. >>> b1 = s.encode()
  5. >>> b1
  6. b'china'
4)1.       dict.keys().items.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有dict.has_key(),用in替代它吧

7、7、面向对象

1)1)引入抽象基类(Abstraact Base ClassesABCs)。
2)容器类和迭代器类被ABCs化,所以cellections模块里的类型比Py2.5多了很多

点击(此处)折叠或打开

  1. >>> import collections
  2. >>> print('\n'.join(dir(collections)))
  3. Callable
  4. Container
  5. Hashable
  6. ItemsView
  7. Iterable
  8. Iterator
  9. KeysView
  10. Mapping
  11. MappingView
  12. MutableMapping
  13. MutableSequence
  14. MutableSet
  15. NamedTuple
  16. Sequence
  17. Set
  18. Sized
  19. ValuesView
  20. __all__
  21. __builtins__
  22. __doc__
  23. __file__
  24. __name__
  25. _abcoll
  26. _itemgetter
  27. _sys
  28. defaultdict
  29. deque
另外,数值类型也被ABCs化。关于这两点,请参阅 PEP 3119PEP 3141
3)迭代器的next()方法改名为__next__(),并增加内置函数next(),用以调用迭代器的__next__()方法
4)增加了@abstractmethod @abstractproperty两个decorator,编写抽象方法(属性)更加方便

8、异常
1 所以异常都从BaseException继承,并删除了StardardError
2 去除了异常类的序列行为和.message属性

3 raise Exception(args)代替 raise Exception, args语法

4 捕获异常的语法改变,引入了as关键字来标识异常实例,在Py2.5中:

点击(此处)折叠或打开

  1. >>> try:
  2. ... raise NotImplementedError('Error')
  3. ... except NotImplementedError, error:
  4. ... print error.message
  5. ...
  6. Error

  7. 在Py3.0中:
  8. >>> try:
  9.       raise NotImplementedError('Error')
  10. except NotImplementedError as error: #注意这个 as
  11.       print(str(error))
  12. Error
5 异常链,因为__context__3.0a1版本中还没有实现,这方面就不说了


9、模块变动
•        移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块。
•        移除了imageop模块

•        移除了audiodev, Bastion, bsddb185, exceptions, 
audiodev, , MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timingxmllib模块
•        移除了bsddb模块(单独发布,可以从获取)

•        移除了new模块

•        os.tmpnam()os.tmpfile()函数被移动到tmpfile模块下

•        tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是tokenize.tokenize()

10、其他
1xrange()改名为range(),要想使用range()获得一个list,必须显式调用:

点击(此处)折叠或打开

  1. >>> list(range(10))
  2. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2bytes对象不能hash,也不支持b.lower()b.strip()b.split()方法,但对于后两者可以使用b.strip(b’ \n\t\r\f’)b.split(b’ ‘)来达到相同目的

3zip()map()filter()都返回迭代器。而apply()callable()coerce()execfile()reduce()reload()函数都被去除了

4string.letters和相关的.lowercase.uppercase被去除,请改用string.ascii_letters

5)如果x < y的不能比较,抛出TypeError异常。2.x版本是返回伪随机布尔值的

6__getslice__系列成员被废弃。a[i:j]根据上下文转换为a.__getitem__(slice(I, j))__setitem____delitem__调用

7file类被废弃,在Py2.5中:

点击(此处)折叠或打开

  1. >>> file
  2. <type 'file'>

  3. 在Py3.0中:
  4. >>> file
  5. Traceback (most recent call last):
  6. File "", line 1, in <module>
  7.    file
  8. NameError: name 'file' is not defined

上一篇:在win2008下如何查看DELL服务器的service tag
下一篇:如何在Linux下Shell脚本输出带颜色文字