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 24 Python
快速实现基于Python的微信聊天机器人示例代码
Mar 03 Python
Python探索之ModelForm代码详解
Oct 26 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
Python使用OpenCV进行标定
May 08 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
Python批量处理csv并保存过程解析
May 16 Python
Python如何实现定时器功能
May 28 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 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处理二进制数据的实现方法
2016/06/13 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
jQuery事件详解
2017/02/23 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
python字符串连接方式汇总
2014/08/21 Python
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
护士的岗位职责
2013/12/04 职场文书
行政专员工作职责
2013/12/22 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
办理房产过户的委托书
2014/09/14 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript