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中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 Python
Python中获取网页状态码的两个方法
Nov 03 Python
Python解惑之True和False详解
Apr 24 Python
PyQt5每天必学之切换按钮
Aug 20 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
我就是这样学习Python中的列表
Jun 02 Python
对Python 检查文件名是否规范的实例详解
Jun 10 Python
Django model update的多种用法介绍
Mar 28 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
Python的缺点和劣势分析
Nov 19 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
python实现与redis交互操作详解
Apr 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数组合并array_merge()函数使用注意事项
2014/06/19 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
javascript 闭包疑问
2010/12/30 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
Angular 多模块项目构建过程
2020/02/13 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
Django实现图片文字同时提交的方法
2015/05/26 Python
python 容器总结整理
2017/04/04 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
求职简历自荐信范文
2013/10/21 职场文书
幼儿教师研修感言
2014/02/12 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
公司应聘自荐书
2014/06/14 职场文书
个人主要事迹材料
2014/08/26 职场文书
防卫过当辩护词
2015/05/21 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript