这篇文章主要介绍了相比于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 “A\n”, “B”会输出”A\nB\n”,而python3.0中,print(”A\n”, “B”)会输出”A\n B\n”
         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()函数从标准输入设备(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修复。

Python3.0 新特性相关推荐

  1. python-3.8.0 新特性之赋值表达式

    [python-3.8.0 新特性之赋值表达式] 赋值表达式的语法是这样的" name := expression ",形式上看和赋值语句 " = " 差不多, ...

  2. Python3.8 新特性:仅位置参数

    这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟了解什么是仅位置参数(Positional-Only Arguments) 函数传递参数的方式繁多,有位置参数.默认参数. ...

  3. python 3.8 新特性 video_1分钟了解:Python3.8 新特性:仅位置参数

    这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟了解什么是仅位置参数(Positional-Only Arguments) 插播一条:我自己是一名从事了多年开发的Pyth ...

  4. Python3.10新特性初体验

    Python3.10新特性初体验 注:图片来源 目录 结构模式匹配 [PEP 635] union类型允许X | Y [PEP 604] 带圆括号的上下文管理器 一.结构模式匹配(新增PEP 635) ...

  5. JDK5.0新特性系列---目录

    JDK5.0新特性系列---目录 JDK5.0新特性系列---1.自动装箱和拆箱 JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列--- ...

  6. [转]C# 2.0新特性与C# 3.5新特性

    C# 2.0新特性与C# 3.5新特性 一.C# 2.0 新特性: 1.泛型List<MyObject> obj_list=new List(); obj_list.Add(new MyO ...

  7. Servlet 3.0 新特性概述

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

  8. Redis 6.0 新特性-多线程连环13问!

    来自:码大叔 导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有 ...

  9. WCF4.0新特性体验(3):标准终结点(Standard Endpoints)

    今天在WCF4.0新特性体验第3节,我们介绍WCF4.0里的标准终结点概念,也就是Standard Endpoints. WCF4.0提供了那些标准终结点?他们有什么作用?如何使用标准终结点?如何该表 ...

最新文章

  1. 狂汗!售货员竟遭遇到最彪悍的付款方式(转)
  2. struts2.1.8,hibernate3.3.2,spring2.5 整合需要哪些jar包
  3. mysql redis qps_Redis QPS测试
  4. centos 安装 acrobat Reader之后
  5. 动手造轮子:实现一个简单的基于 Console 的日志输出
  6. css 写打印样式问题
  7. mysql触发器如何获取当前表名_MCGS pro组态环境下,如何获取当前用户名,在画面上显示?...
  8. 小tip: 使用CSS将图片转换成黑白(灰色、置灰)[转]
  9. 【leetcode 简单】第四十二题 阶乘后的零
  10. 9.3. where 优化
  11. Windows 下80端口被进程 System PID=4 占用的解决方法
  12. python数据加载常规教程_Python加载数据的5种不同方式(收藏)
  13. list 删除_算法面试题:一个List,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!...
  14. 敬伟PS教程:基础篇A
  15. c语言中转义字符有什么作用,C语言中的转义字符及含义
  16. 电商新趋势来临!?解析Dtop 环球嘉年华电商是否值得加入!
  17. IDEA server乱码
  18. 计算机打不开sai文件夹,解决 Excel打开桌面文件 显示“无法找到C:\Documents.xls。请检查文件名的...”错误...
  19. android基础知识13:AndroidManifest.xml文件解析【转载】
  20. 读书有益——》《让我留在你身边》

热门文章

  1. 34 CO配置-控制-产品成本控制-成本对象控制-期末结算-检查差异变式
  2. python爬取网上文章_python 爬取微信文章
  3. sqllite java 代码,非常简单的SQLite的Java程序
  4. 文件md5码怎么生成_Linux 系统文件校验方法--MD5,SHA1,PGP,SHA256,SHA512
  5. 网页内置html5游戏,爽爆HTML5网页游戏!教你怎么精选浏览器
  6. linux控制器错误码,ubuntu – 不频繁的输入/输出错误 – Linux服务器
  7. docker 导出堆栈信息.hprof_JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用...
  8. Building wheel for mmcv-full (setup.py) ... error和OSError: CUDA_HOME environment variable is not set
  9. 0x00000116
  10. [Origin]图像属性:画图时修改直线的起点和终点、随图层和坐标变化、多y轴图独立编辑线条属性