最新消息:

python3.0的新特性(转)

Python 大步 1065浏览 0评论

Ps:好吧,真的要承认,居然有计算机语言不向下兼容的,到头来还要在学3.0,不过3.0比现在更简单,估计学起来不会太难。

原文链接:http://justcoding.iteye.com/blog/882795
这篇文章主要介绍了相比于python 2.6,python3.0的新特性。更详细的介绍请参见python3.0的文档。

Common Stumbling Blocks

本段简单的列出容易使人出错的变动。

    * print 语句被print()函数 取代了,可以使用关键字参数 来替代老的print特殊语法。例如:
         1. Old: print “The answer is”, 2*2
         2. New: print(”The answer is”, 2*2)
         3. Old: print x,                                      # 使用逗号结尾禁止换行
         4. New: print(x, end=” “)                     # 使用空格代替换行
         5. Old: print                                         # 输出 新行
         6. New: print()                                    # 输出新行
         7. Old: print >>sys.stderr, “fatal error”
         8. New: print(”fatal error”, file =sys.stderr)
         9. Old: print (x, y)                               # 输出repr((x, y))
        10. New: print((x, y))     # 不同于print(x, y)!

      你可以自定义输出项之间的分隔符:
           print(”There are <”, 2**32, “> possibilities!”, sep=”")
      输出结果是:
           There are <4294967296> possibilities!

      注意:
         1. print()函数不支持老print语句的“软空格”特性,例如,在python2.x中,print “An”, “B”会输出”AnBn”,而python3.0中,print(”An”, “B”)会输出”An Bn”
         2. 学会渐渐习惯print()吧!
         3. 使用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()

转载请注明:大步's Blog » python3.0的新特性(转)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
SiteMap