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


Posted in Python onJune 12, 2015

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 <", 2**32, "> possibilities!", sep="")

There are <4294967296> 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 < 'ORACLE'   # Python 2 结果为:True

New: >>>11 < 'ORACLE'   # Python 3 这种比较将导致TypeError异常

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
Python 相关文章推荐
Python 连连看连接算法
Nov 22 Python
python编写简单爬虫资料汇总
Mar 22 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
Numpy数组的保存与读取方法
Apr 04 Python
Django使用HttpResponse返回图片并显示的方法
May 22 Python
python 实现视频流下载保存MP4的方法
Jan 09 Python
简单了解django orm中介模型
Jul 30 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
python多进程并行代码实例
Sep 30 Python
Python多线程及其基本使用方法实例分析
Oct 29 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
Python学习之os包使用教程详解
Mar 21 Python
Python实现比较两个列表(list)范围
Jun 12 #Python
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 #Python
Python语言实现机器学习的K-近邻算法
Jun 11 #Python
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 #Python
python中的代码编码格式转换问题
Jun 10 #Python
python实现数独算法实例
Jun 09 #Python
python中的全局变量用法分析
Jun 09 #Python
You might like
php抓即时股票信息
2006/10/09 PHP
php 前一天或后一天的日期
2008/06/28 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
JS input 数字验证代码
2009/07/30 Javascript
JavaScript之引用类型介绍
2012/08/10 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析
2019/08/16 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
python魔法方法-自定义序列详解
2016/07/21 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
tornado+celery的简单使用详解
2019/12/21 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
委托证明的格式
2014/01/10 职场文书
结婚邀请函范文
2014/01/14 职场文书
保险经纪人求职信
2014/03/11 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
你需要掌握的20个Python常用技巧
2022/02/28 Python
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python