Python3.0的新改动
通知:鱼C工作室编程视频教学《零基础入门学习Python》和《极客首先之Python》均使用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"
使用 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被解释成a.__getitem__(slice(i,j))
[*]PEP3102:keyword-only arguments.在函数参数列表中,出现在*args之后的命名参数只能使用"关键字参数"的形式调用
[*]PEP3104:nonlocal声明。使用nonlocal可以声明一个外部变量(不是global变量)
[*]PEP3111:raw_input() 改名为input(),也就是说,新的input()函数从标准输入设备(sys.stdin)读取一行并返回(不包括行结束符),如果输入过早终止,该函数抛出EOFError,如果想使用老的input(),可以使用(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修复。
{:7_179:}python 3 都3.3了呢 话说2 用的广泛的还是2.7吧 sky 发表于 2013-8-7 12:06 static/image/common/back.gif
python 3 都3.3了呢 话说2 用的广泛的还是2.7吧
确实这次故意不兼容的更新很变态,但Py3确实更加优秀了,所以时代的趋势是要淘汰2.x的。 难道打算用 python3。0讲
http://bbs.fishc.com/xwb/images/bgimg/icon_logo.png 来自 haibao220 的新浪微博 3的语法咋更像C了呢
支持甲鱼讲最新版的
与时俱进! 小甲鱼 发表于 2013-8-7 12:12 static/image/common/back.gif
确实这次故意不兼容的更新很变态,但Py3确实更加优秀了,所以时代的趋势是要淘汰2.x的。
请问Python有什么用途呢? 我认为这种故意不一定是坏事啊,像微软是那种搞死都要兼容到底的,比如现在还兼容DOS,发展太久会臃肿,而像苹果有的放矢的发展模式蛮不错啊~~ O(∩_∩)O哈哈~,沙发是我的啦
comeheres 于 2013-8-7 14:09 使用 抢沙发 抢夺本帖沙发
补充内容 (2013-8-7 14:11):
小甲鱼终于开讲动态语言python了,支持下~ 支持开讲PY3!正好把脑子里残存的一点点二把刀子的习惯给替换掉! 看教程听老师说从python2.x完全过渡到python3要花十年左右的时间,所以现在推荐使用python 2.7 很多人都 说先学PY2.7 3.+的资料很少的,第三方库也少的, 现在学了些简单的了,估计鱼哥出完,我也会了 ~~~~(>_<)~~~~ 彻底看不懂!!!! 支持楼主的做法,新的版本肯定比老版本要先进。 小甲鱼 发表于 2013-8-7 12:12 static/image/common/back.gif
确实这次故意不兼容的更新很变态,但Py3确实更加优秀了,所以时代的趋势是要淘汰2.x的。
原来如此啊(*^__^*) 嘻嘻…… 正好从这里开学学习 相关工具还请小甲鱼要提供哦。论坛有解释器下载吗? 沉默的风采 发表于 2013-8-9 16:27 static/image/common/back.gif
相关工具还请小甲鱼要提供哦。论坛有解释器下载吗?
建议下载最新版本,第二集会教大家下载~ 那就跟到视频慢慢学吧, 1258187869 发表于 2013-8-7 13:38 static/image/common/back.gif
请问Python有什么用途呢?
Python是一种开放源代码的脚本编程语言,这种脚本语言特别强调开发速度和代码的清晰程度。它可以用来开发各种程序,从简单的脚本任务到复杂的、面向对象的应用程序都有大显身手的地方。Python还被当作一种入门程序员最适合掌握的优秀语言,因为它免费、面向对象、扩展性强同时执行严格的编码标准。