您好,欢迎访问一九零五行业门户网

Python 3.x 新特性及10大变化

python 3.x 起始版本是python 3.0,目前的最新版本是 3.3.3
python之父guido van rossum谈到了python 3.0的构思:
一直以来,除非要打破向后兼容性,否则很多缺陷和错误都无法修复。因此,python 3000将会作为第一个放弃向后兼容性的python版本,目的就是要让python向着最好的语言前进。
python的3.0版本,常被称为python 3000,或简称py3k。相对于python的早期版本,这是一个较大的升级。为了不带入过多的累赘,python 3.0在设计的时候没有考虑向下兼容。许多针对早期python版本设计的程序都无法在python 3.0上正常运行。为了照顾现有程序,python 2.6作为一个过渡版本,基本使用了python 2.x的语法和库,同时考虑了向python 3.0的迁移,允许使用部分python 3.0的语法与函数。基于早期python版本而能正常运行于python 2.6并无警告。程序可以通过一个2to3的转换工具无缝迁移到python 3.0。python有一些很有用的测试模块,包括doctext和unitest。确保在尝试移植到python3之前,对应用程序进行全面测试。要确保测试范围尽可能大,而且程序在python2.6上运行时,能通过测试并且没有出现任何警告信息。
新的python程序建议使用python 3.0版本的语法。除非运行环境无法安装python 3.0或者程序本身使用了不支持python 3.0的第三方库。目前不支持python 3.0的第三方库有twisted, py2exe, pil等。大多数第三方库都正在努力地兼容python 3.0版本。即使无法立即使用python 3.0,也建议编写兼容python 3.0版本的程序,然后使用python 2.6, python 2.7来运行。python 2.7被确定为最后一个python 2.x版本,它除了支持python 2.x语法外,还支持部分python 3.1语法.
变化大致总结如下: 
01.print() and exec() 函数
python旧版本里,print和exec是作为一语句出现,可以用print hello,world!, 来打印一个语句,在新版本里,print()和exec()作为一个函数出现,所以上面的写就是错误的,应该写成print (hello,world!)对于java的程序员来说,这样的改变应该是比较熟悉. system.out.print(hello,world!);
复制代码 代码如下:
old: >>>print the answer is, 2*2
new: >>>print(the answer is, 2*2)
old: >>>print x,           # trailing comma suppresses newline
new: >>>print(x, end= )  # appends a space instead of a newline
old: >>>print              # prints a newline
new: >>>print()            # you must call the function!
old: >>>print >>sys.stderr, fatal error
new: >>>print(fatal error, file=sys.stderr)
old: >>>print (x, y)       # prints repr((x, y))
new: >>>print((x, y))      # not the same as print(x, y)!
不过在python 2.6版本里面: from __future__ import print_function
复制代码 代码如下:
>>> from __future__ import print_function
>>> print ('jerry','sherry',sep='-')
jerry-sherry
下面的修改在新版本是正确的:
复制代码 代码如下:
>>>print(there are possibilities!, sep=)
there are possibilities!
>>>fid = open(log.txt, a)
>>>print(log.txt, file=fid)
>>>print(foo, bar, sep=%)
>>>foo%bar
exec() 同样是函数,在python 2.x里,下列代码是ok的.
复制代码 代码如下:
>>> def foo():
 exec('a=4')
 print a 
>>> foo()
4
但在python 3.x里面就不行了,会报nameerror: global name 'a' is not defined. 因为变量a没有定义。原因在于exec()作为函数,只操作globals()和locals()函数返回的字典。但locals()函数返回的字典实际上是局部变量的一个副本。exec()函数中进行的赋值只修改了局部变量的这份副本,而非局部变量本身。下面给出了一种解决办法:
复制代码 代码如下:
>>> def foo():
 _locals = locals()
 exec('a=4',globals(),_locals)
 a = _locals['a']
 print (a) 
>>> foo()
4
02.整数及除法
int和long统一为int, int表示任何精度的整数,移除sys.maxint, 因为int已经是最大的整数。新版本移除了含糊的除法符号('/'),而只返回浮点数。在以前的版本中,如果参数是int或者是long的话,就会返回相除后结果的向下取整(floor), 而如果参数是float或者是complex的话,那么就会返回相除后结果的一个恰当的近似。
复制代码 代码如下:
old: >>>1/2   #结果是0     晕死。。。
new: >>>1/2   #结果是0.5   总算接地气了。
03.input()代替raw_input()
变简洁了。
复制代码 代码如下:
old:  >>>question = raw_input(what is your quest? )
new:  >>>question = input(what is your quest? )
04.源文件编码默认为utf-8
python 3 在字符编码方面有很多改进,其中之一就是默认的源文件编码从ascii变为utf-8,也就是说以前在文件头加上的各种花样的 coding=utf-8不再需要了!
复制代码 代码如下:
# coding: utf-8
# vim:fileencoding=utf-8
# -*- coding=utf-8 -*-
# vim: set fileencoding=utf-8
05.字符串格式化变化
格式化字符串的这个内置的%操作符太有限了,新版本新增加了format(),比以前更灵活了,%要逐渐被淘汰。举三个简单的例子如下:
复制代码 代码如下:
>>>i love {0}, {1}, and {2}.format(eggs, bacon, sausage)
'i love eggs, bacon, and sausage'
>>>i love {a}, {b}, and {c}.format(a=eggs, b=bacon, c=sausage)
'i love eggs, bacon, and sausage'
>>>i love {0}, {1}, and {param}.format(eggs, bacon, param=sausage)
'i love eggs, bacon, and sausage'
06.比较
python3对于值的比较要严格得多。在python2中,任意两个对象均可进行比较,例如:
复制代码 代码如下:
old: >>>11 new: >>>11 07.标识符支持非 ascii 字符
复制代码 代码如下:
所有 = all
class 男人:
    @classmethod
    def 包括(cls,ta):
        return isinstance(ta,cls)
def 一起玩(人们):
    if 所有(男人.包括(ta) for ta in 人们):
        print (他们是基友)
    else:
        print (他们是朋友)
汤姆 = 男人()
杰瑞 = 男人()
一起玩([汤姆,杰瑞])
>>>
他们是基友
08.异常处理
* 异常类必须继承自baseexception,它是异常结构的基类。
* 移除了standarderror
* 抛出异常:使用raise exception(args)而不是原来的raise exception, args
* 捕获异常: 使用except exception as identifier而不是原来的except exception, identifier
* 异常链(exception chain)。
* 改良了一些windows不能加载模式时的异常信息,具有本地化处理。
例子1:  python 3中的异常处理
复制代码 代码如下:
# 绑定valueerror到本地的ex
try:
    x = float('blah')
except valueerror as ex:
    print(value exception occurred , ex)
# 同时捕获两个不用的异常
try:
    x = float('blah')
except (valueerror, nameerror):
    print(caught both types of exceptions)
例子2:  python 3中的隐式异常链
复制代码 代码如下:
def divide(a, b):
    try:
        print(a/b)
    except exception as exc:
        def log(exc):
            fid = open('logfile.txt') # missing 'w'
            print(exc, file=fid)
            fid.close()
            log(exc)
divide(1,0)
09.字典dict
 python 3.0 内的另一个重大改变是字典内dict.iterkeys(),dict.itervalues(),dict.iteritems()方法的删除。取而代之的是:dict.keys(),dict.values(),dict.items(),它们被进行了修补,可以返回轻量的、类似于集的容器对象,而不是键和值的列表。这样的好处是在不进行键和条目复制的情况下,就能在其上执行set操作。dict.has_key()同样被移除。
复制代码 代码如下:
>>> d = {1:food,2:book}
>>> d.keys(), d.values(),d.items()
>>> for values in d.items():
 print (values)
(1, 'food')
(2, 'book')
>>> keys = list(d.items())
>>> print (keys)
[(1, 'food'), (2, 'book')]
old:  >>> d.has_key(1)
true
new: >>> 1 in d     #新版本判断key是否在字典里面
true
10.其他改变
* 移除了backticks(使用repr()代替)
* 移除了(不等号,使用!=代替)
* as和with 变成了关键字
* true,false和none变成了关键字
* 移除了__getslice__,语法a[i:j]被解释成a.__getitem__(slice(i,j))
* nonlocal声明。使用nonlocal可以声明一个外部变量(不是global变量)
* xrange()改名为range(),range()现在不是产生一个列表(list),而是一个迭代器。
* next()重命名为__next__(),新的内建函数next()可以调用一个对象的__next__()方法。
* 八进制字,二进制和bin()函数。应该写0o666而不是0666,oct()函数也做了响应的改动。同样,0b1010等价于10,bin(10)返回”0b1010″。
复制代码 代码如下:
>>>0o13             #八进制转十进制
11
>>>0b010101         #八进制转二进制
21
其它类似信息

推荐信息