相比于python2.6,python3.0的新特性。
这篇文章主要介绍了相比于python2.6,python3.0的新特性。更详细的介绍请参见python3.0的文档。
Common Stumbling Blocks
本段简单的列出容易使人出错的变动。
- print语句被print()函数取代了,可以使用关键字参数来替代老的print特殊语法。例如:
- Old: print "The answer is", 2*2
- New: print("The answer is", 2*2)
- Old: print x, # 使用逗号结尾禁止换行
- New: print(x, end=" ") # 使用空格代替换行
- Old: print # 输出新行
- New: print() # 输出新行
- Old: print >>sys.stderr, "fatal error"
- New: print("fatal error", file=sys.stderr)
- Old: print (x, y) # 输出repr((x, y))
- New: print((x, y)) # 不同于print(x, y)!
你可以自定义输出项之间的分隔符:
print("There are <", 2**32, "> possibilities!", sep="")
输出结果是:
There are <4294967296> possibilities!
注意:- print()函数不支持老print语句的“软空格”特性,例如,在python2.x中,print "A\n", "B"会输出"A\nB\n",而python3.0中,print("A\n", "B")会输出"A\n B\n"
- 学会渐渐习惯print()吧!
- 使用2to3源码转换工具时,所有的print语句被自动转换成print()函数调用,对大项目,这是无需争论的。
- python3.0使用字符串(strings)和bytes代替Unicode字符串和8位字符串,这意味着几乎所有使用Unicode编码和二进制数据的代码都要改动。这个改动很不错,在2.x的世界里,无数的bug都是因为编码问题。
- map()和filter()返回迭代器(iterators)
- dict方法keys(),items(),values()返回视图(同样是迭代器)而不是列表(list)
- 内建的sorted()方法和list.sort()方法不再接受表示比较函数的cmp参数,使用key参数代替。
- 1/2返回浮点数,使用1//2能得到整数。
- repr()函数对于long整数不再包含拖尾的L,所以不加判断的去除最后一个字符会导致去掉一个有用的数字
String and Bytes
- 现在只有一种字符串:str,它的行为和实现都很像2.x的unicode串。
- basestring超类已经去掉了,2to3工具会把每个出现的basestring替换成str。
- PEP3137:新类型bytes,用来表示二进制数据和编码文本,str和bytes不能混合,需要时,必须进行显示的转换,转换方法是str.encode()(str->bytes)和bytes.decode()(bytes->str).
- 在原始字符串(raw strings)中所有反斜线都按字面量解释,不再特殊处理Unicode转义字符。
- PEP3112:bytes字面量,例如b"abc",创建bytes实例。
- PEP3120:默认源文件编码为UTF-8
- PEP3131:可以使用非ASCII标识符(然而,除了注释中贡献者的名字之外,标准库仍然只包含ASCII)
- PEP3116:新的IO实现,API几乎100%向后兼容,二进制文件使用bytes代替strings
- 去除了StringIO和cStringIO模块,取而代之的是io.StringIO或者io.BytesIO
PEP3101:字符串格式化的新方法
- str.format方法(原文提到替代了%操作符,实际上,format方法和%的用法差别很大,各有所长)。
PEP3106:修补了dict的keys(),items(),values()方法
- 删除了dict.iterkeys(),dict.itervalues()和dict.iteritems()
- dict.keys(),dict.values()和dict.items()返回dict相关数据的引用
PEP3107:函数注解(Function Annotations)
- 注解函数参数和返回值的标准化方法
Exception Stuff
- PEP352:异常类必须继承自BaseException,它异常结构的基类。
- 移除了StandardError
- Dropping sequence behavior (slicing!) and message attribute of exception instances.
- PEP3109:抛出异常:现在必须使用raise Exception(args)而不是原来的raise Exception, args
- PEP3110:捕获异常,现在必须使用except Exception as identifier而不是原来的except Exception, identifier
- PEP3134:异常链(Exception chain)。
- 改良了一些windows不能加载模式时的异常信息,具有本地化处理。
New Class and Metaclass Stuff
- 移除了classic class
- PEP3115:新的metaclass语法
- PEP3119:抽象基类。
- PEP3129:类包装。
- PEP3141:数字抽象基类
其他的语言变化
这里列出大多数的python语言核心和内建函数的变化。
- 移除了backticks(使用repr()代替)
- 移除了<>(不等号,使用!=代替)
- as和with变成了关键字
- True,False和None变成了关键字
- PEP237:long不存在了,只有int,它和原来的long一样。不再支持以L结尾的数字字面量。移除sys.maxint,因为int现在已经是无限大了
- PEP238:int相除,返回float
- 改变了顺序操作符的行为,例如x<y,当x和y类型不匹配时抛出TypeError而不是返回随即的bool值
- 移除了__getslice__,语法a[i:j]被解释成a.__getitem__(slice(i,j))
- PEP3102:keyword-only arguments.在函数参数列表中,出现在*args之后的命名参数只能使用"关键字参数"的形式调用
- PEP3104:nonlocal声明。使用nonlocal可以声明一个外部变量(不是global变量)
- PEP3111:raw_input()改名为input(),也就是说,新的input()函数从标准输入设备(sys.stdin)读取一行并返回(不包括行结束符),如果输入过早终止,该函数抛出EOFError,如果想使用老的input(),可以使用eval(input())代替。
- xrange()改名为range(),range()现在不是产生一个列表(list),而是一个迭代器。
- PEP3113:移除了"元组参数拆包(tuple parameter unpacking)"。这种写法已经不行了:
def foo(a, (b, c)):...
现在要这样写:
def foo(a, b_c):
b,c = b_c - PEP3114:next()重命名为__next__(),新的内建函数next()可以调用一个对象的__next__()方法。
- PEP3127:新的八进制字面量,二进制字面量和bin()函数。你应该写0o666而不是0666,oct()函数也做了响应的改动。同样,0b1010等价于10,bin(10)返回"0b1010"。0666这种写法现在是错误的。
- PEP3132:支持迭代器拆包。现在你可以这样写:
a, b, *rest = some_seqence
甚至象这样:
*rest, a = stuff
一般情况下,rest对象是list,而等号右边的对象是可迭代的 - PEP3135:新的super()。你可以不适用任何参数调用super(),正确的参数和实例会被正确选择。如果使用参数,它的行为不变,和以前一样。
- zip(),map(),filter()返回迭代器。
- 移除了string.letters和它的朋友们(string.lowcase和string.uppercase),现在上场的是string.ascii_letters等
- 移除了apply(),callable(),exefile(),file(),reduce(),reload()
- 移除了dict.has_key()。使用in操作符进行测试
- exec语句没有了,现在是exec()函数
- 移除了__oct__()和__hex__()特殊方法。oct()和hex()方法使用__index__()
- 移除了对__members__和__methods__的支持
- nb_nonzero重命名为nb_bool,__nonzero__()重命名为__bool__()
Optimizations
- 一般情况下,python 3.0比python 2.5慢33%左右。不过仍有提升空间。
模块变动(新的,改进的和废弃的)
- 移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块。
- 移除了imageop模块
- 移除了audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块
- 移除了bsddb模块(单独发布,可以从http://www.jcea.es/programacion/pybsddb.htm获取)
- 移除了new模块
- os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下
- tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是tokenize.tokenize()
Build and C API Changes
Python’s build process和C API的改动包括:
- PEP3118:新的Buffer API
- PEP3121:扩展模块的的Initialization & Finalization
- PEP3123:使PyObject_HEAD符合标准C
其他的改动和修复
在源码里分散一系列的改进和bug修复。changes log表明,从2.6到3.0,有XXX个改动和YYY的bug修复。
http://www.iteye.com/topic/259156
相比于python2.6,python3.0的新特性。的更多相关文章
- Python3.0的新特性
网上关于Python3与Python2的区别的文章都烂大街了,但基本上都是抄来抄去,为了追本溯源,直接看官网最靠谱,官网文档的结构性更强. 本文是对Python3.0官网文档 What's New I ...
- php5.3到php7.0.x新特性介绍
<?php /*php5.3*/ echo '<hr>'; const MYTT = 'aaa'; #print_r(get_defined_constants()); /* 5.4 ...
- paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较
paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...
- NodeJS 框架 Express 从 3.0升级至4.0的新特性
NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...
- MySQL 8.0 InnoDB新特性
MySQL 8.0 InnoDB新特性 1.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe,metadata管理更完善 2.快速在线加新列(腾讯互娱DBA团队贡献) 3. ...
- Atitit jquery 1.4--v1.11 v1.12 v2.0 3.0 的新特性
Atitit jquery 1.4--v1.11 v1.12 v2.0 3.0 的新特性 1.1. Jquery1.12 jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.h ...
- [PHP] 从PHP 5.6.x 移植到 PHP 7.0.x新特性
从PHP 5.6.x 移植到 PHP 7.0.x 新特性: 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array ...
- servlet3.0 的新特性之二注解代替了web.xml配置文件
servlet3.0 的新特性: 注解代替了 web.xml 文件 支持了对异步的处理 对上传文件的支持 1.注解代替了配置文件 1.删除了web.xml 文件 2. 在Servlet类上添加@Web ...
- C# 6.0/7.0 的新特性
转眼C#语言都已经迭代到7.0版本了,很多小伙伴都已经把C# 7.0 的新特性应用到代码中了,想想自己连6.0的新特性都还很少使用,今天特意搜集了一下6.0和7.0的一些新特性,记录一下,方便查阅. ...
随机推荐
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- Sequence one(hdu2610dfs+去重)
题目:有一个数列N,和一个数字k,输出该数列的前k个子序列,如果k大于N的所有子序列,输出所有符合要求的序列,序列要求不能是递减序列 比如: 3 5 1 3 2 的前五个序列为 1 3 2 1 3 1 ...
- 不使用TNS直连数据库的三种方式
1.在当前目录下新建tnsnames.ora文件 如windows环境下,在C:\Users\Administrator目录下新建tnsnames.ora文件,内容如下:test =(descript ...
- 【矩阵乘法经典应用】【ZOJ3497】【Mistwa】
题意:给定一个有向图(最多25个节点,每个节点的出度最多为4),给定起点和终点,然后从起点开始走,走到终点就停止,否则一直往下走,问能不能P步到达终点.也就是说从起点出发,走一条长度为P的路径,路径中 ...
- 移动前端开发之viewport的深入理解(转)
在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或 ...
- SQL server 数据库基本知识
SQL server 数据库基本知识 一.数据库: 分为层次型.网状型.关系型.现在通常都是使用关系型 常用的有:SQLserver.Oracle.DB2.Access.Visual Foxpro.M ...
- JavaScript、jQuery获取页面及个元素高度、宽度
Javascript获取获取屏幕.浏览器窗口 ,浏览器,网页高度.宽度的大小网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.client ...
- Android 内部启动其他应用,以及打开指定qq聊天界面
在自己应用中打开第三方应用,有好多种方法,这里举例一种: //以打开微信为例,前提需要知道打开应用的包名,一般一个发布版本的应用,包名不会轻易改变的,但是,打开QQ就要注意了,毕竟QQ的发布版本有不下 ...
- android AsyncTask 的使用(转载)
1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可 ...
- 稠密图(邻接矩阵),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)
全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...