python3.0与python2.x的区别

1. 性能

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

2. 编码

Py3.0 源码文件默认使用 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() 函数

1  print语句被print()函数取代了,可以使用关键字参数来替代老的print特殊语法。例如:
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)!

 

 

7)改变了顺序操作符的行为,例如x<y,当x和y类型不匹配时抛出TypeError而不是返回随即的bool值

8) 输入函数改变了:

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

9 )去除元组参数解包。不能 def(a, (b, c)):pass 这样定义函数了

10 )新式的 8 进制字 变 量,相应地修改了 oct() 函数。 2.x 的方式如下:

>>> 0666

438

>>> oct(438)

'0666'

3.0 这样:

>>> 0666

SyntaxError: invalid token (<pyshell#63>, line 1)

>>> 0o666

438

>>> oct(438)

'0o666'

11 )增加了 2 进制字面量和 bin() 函数

>>> bin(438)

'0b110110110'

>>> _438 = '0b110110110'

>>> _438

'0b110110110'

1 2 )扩展的可迭代解包。在 Py3.0 里, a, b, *rest = seq 和   *rest, a = seq 都是合法的,只要求两点: rest 是 list 对象和 seq 是可迭代的。

1 3 )新的 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>

1 4 )新的 metaclass 语法:

class Foo(*bases, **kwds):

       pass

1 5 )支持 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 可以用来玩玩狸猫换太子的大把戏。

字符串和字节串

1 )现在字符串只有 str 一种类型,但它跟 2.x 版本的 unicode 几乎一样。

2 )关于字节串,请参阅“数据类型”的第 2 条目

数据类型

1 ) Py3.0 去除了 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 替代它吧

面向对象

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 ,编写抽象方法(属性)更加方便。

异常

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 版本中还没有实现,这方面就不说了

 

模块变动

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

·  移除了imageop模块

·  移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块

·  移除了bsddb模块(单独发布,可以从http://www.jcea.es/programacion/pybsddb.htm获取)

·  移除了new模块

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

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

 

其它

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() 函数都被去除了

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.0 中:

>>> file

Traceback (most recent call last):

File "<pyshell#120>", line 1, in <module>

    file

NameError: name 'file' is not defined

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值