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遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
python3中set(集合)的语法总结分享
Mar 24 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
python实现求最长回文子串长度
Jan 22 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
Aug 01 Python
Python 获取中文字拼音首个字母的方法
Nov 28 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
对python中类的继承与方法重写介绍
Jan 20 Python
Numpy一维线性插值函数的用法
Apr 22 Python
Python pip install之SSL异常处理操作
Sep 03 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 27 Python
用Python selenium实现淘宝抢单机器人
Jun 18 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 mssql 日期出现中文字符的解决方法
2009/03/10 PHP
PHP 开源框架22个简单简介
2009/08/24 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
asp批量修改记录的代码
2008/06/25 Javascript
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
解析Javascript中中括号“[]”的多义性
2013/12/03 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
Bootstrap表单布局
2016/07/19 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
Python过滤列表用法实例分析
2016/04/29 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
高校教师岗位职责
2014/03/18 职场文书
元旦晚会主持词
2014/03/24 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
超市采购员岗位职责
2015/04/07 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书