Python2 与 Python3 区别

一.性能

python3.x的性能低于Python2.x,但是python3.x有极大的优化空间,正在追赶.

二.基本语法差异

一).核心语法差异

1.Python3对Unicode字符的原生支持
Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str和unicode,Python3只支持unicode的string。python2和python3字节和字符对应关系为:


img

2.Python3采用的是绝对路径的方式进行import。
Python2中相对路径的import会导致标准库导入变得困难(想象一下,同一目录下有file.py,如何同时导入这个文件和标准库file)。Python3中这一点将被修改,如果还需要导入同一目录的文件必须使用绝对路径,否则只能使用相关导入的方式来进行导入。
3.Python2中存在老式类和新式类的区别,Python3统一采用新式类。新式类声明要求继承object,必须用新式类应用多重继承。
4.Python3使用更加严格的缩进。Python2的缩进机制中,1个tab和8个space是等价的,所以在缩进中可以同时允许tab和space在代码中共存。
这种等价机制会导致部分IDE使用存在问题。Python3中1个tab只能找另外一个tab替代,因此tab和space共存会导致报错:TabError: inconsistent use of tabs and spaces in indentation.

二).废弃类差异

1.print语句被python3废弃,统一使用print函数
2.exec语句被python3废弃,统一使用exec函数
3.execfile语句被Python3废弃,推荐使用exec(open("./filename").read())
4.不相等操作符"<>"被Python3废弃,统一使用"!="
5.long整数类型被Python3废弃,统一使用int
6.xrange函数被Python3废弃,统一使用range,Python3中range的机制也进行修改并提高了大数据集生成效率
7.Python3中这些方法再不再返回list对象:dictionary关联的keys()、values()、items(),zip(),map(),filter(),但是可以通过list强行转换:

mydict={"a":1,"b":2,"c":3}
mydict.keys()  #<built-in method keys of dict object at 0x000000000040B4C8>
list(mydict.keys()) #['a', 'c', 'b']

8.迭代器iterator的next()函数被Python3废弃,统一使用next(iterator)
9.raw_input函数被Python3废弃,统一使用input函数
10.字典变量的has_key函数被Python废弃,统一使用in关键词
11.file函数被Python3废弃,统一使用open来处理文件,可以通过io.IOBase检查文件类型
12.apply函数被Python3废弃
13.异常StandardError 被Python3废弃,统一使用Exception

三).修改类差异

1.浮点数除法操作符/和//区别

  • Python2:/是整数除法,//是小数除法
    运行 "5/3"得出结果为1, 如果想得出小数部分, 则需要把代码改成:"float(5)/float(3)", 即加上类型.
  • Python3:/是小数除法,//是整数除法。
    运行"5/3"得出结果为1.666666, 如果只得到整数部分,则需要修改代码为:"5//3", 即使用整除.

2.异常抛出和捕捉机制区别
所有异常都从BaseException继承, 并且删除了StandardError

  • Python2
    try:
      ...
    except Exception, e:
raise IOError, "file error" #抛出异常
except NameError, err:  #捕捉异常
  • Python3
    try:
        ...
    except Exception as e:
raise IOError("file error") #抛出异常
except NameError as err: #捕捉异常

3.for循环中变量值区别

  • Python2,for循环会修改外部相同名称变量的值
     i = 1
     print ('comprehension: ', [i for i in      range(5)])
     print ('after: i =', i  ) #i=4
  • Python3,for循环不会修改外部相同名称变量的值
    i = 1
    print ('comprehension: ', [i for i in range(5)])
    print ('after: i =', i  ) #i=1

4.round函数返回值区别

  • Python2,round函数返回float类型值
     isinstance(round(15.5),int) #True
  • Python3中只有同一数据类型的对象可以比较
     isinstance(round(15.5),float) #True

5.比较操作符区别

  • Python2中任意两个对象都可以比较
    11 < 'test' #True
  • Python3中只有同一数据类型的对象可以比较
   11 < 'test' # TypeError: unorderable types: int() < str()

6.map、filter 和 reduce的差异

  • 这三个函数号称是函数式编程的代表。在 Python3.x 和 Python2.x 中也有了很大的差异。
    首先我们先简单的在 Python2.x 的交互下输入 map 和 filter,看到它们两者的类型是 built-in function(内置函数):
>>> map
<built-in function map>
>>> filter
<built-in function filter>
>>>

它们输出的结果类型都是列表:

>>> map(lambda x:x *2, [1,2,3])
[2, 4, 6]
>>> filter(lambda x:x %2 ==0,range(10))
[0, 2, 4, 6, 8]
>>>

但是在Python 3.x中它们却不是这个样子了:

>>> map
<class 'map'>
>>> map(print,[1,2,3])
<map object at 0x10d8bd400>
>>> filter
<class 'filter'>
>>> filter(lambda x:x % 2 == 0, range(10))
<filter object at 0x10d8bd3c8>
>>>

首先它们从函数变成了类,其次,它们的返回结果也从当初的列表成了一个可迭代的对象, 我们尝试用 next 函数来进行手工迭代:

>>> f =filter(lambda x:x %2 ==0, range(10))
>>> next(f)
0
>>> next(f)
2
>>> next(f)
4
>>> next(f)
6
>>>

对于比较高端的 reduce 函数,它在 Python 3.x 中已经不属于 built-in 了,被挪到 functools 模块当中。
7.打开文件

  • python2中
file( ..... )
或 
open(.....)
  • Python3中
    加入了"as"和"with"关键字, 用于打开文件
open with(.....) as :

8.chr( K ) 与 ord( c )

  • python 2
    chr( K ) 将编码K 转为字符,K的范围是 0 ~ 255
    ord( c ) 取单个字符的编码, 返回值的范围: 0 ~ 255
  • python 3
    chr( K ) 将编码K 转为字符,K的范围是 0 ~ 65535
    ord( c ) 取单个字符的编码, 返回值的范围: 0 ~ 65535

四).新增类差异

  1. python3.x中加入了nonlocal语句
    python引用变量的顺序
    • 1.当前作用域局部变量
    • 2.外层作用域变量
    • 3.当前模块中的全局变量
      1. python内置变量
        与global相似

nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量

示例1
        def sub():
            n = 100  # 局部变量
            print(n)

            def sub2():
            nonlocal n  # 非本地的(非全局的)外部变量
            n -= 10
            print(n)
            return sub2
        s = sub()
        s()
        s()
        输出:
            100
            90
            80
示例2
        def main():
            def local_n():
            n = 200

            def nonlocal_n():
            nonlocal n
            n = 300

            def global_n():
            global n  # 声明为全局变量
            n = 400

            n = 10
            local_n()
            print(n)

            nonlocal_n()
            print(n)

            global_n()
            print('global_n() After:{0}'.format(n))  # 显示的局部变量

        main()
        print('n = {0}'.format(n))

            --------------------------------------------------------
         
              10
              300
              global_n() After:300
              n = 400

2.dict字典变动

python3.x 去除了dict.iterkeys(),dict.itervalues(),dict.iteritems(), dict.has_key()方法
新增: dict.keys(),dict.values(),dict.items()
3.面向对象
引入抽象基类(Abstraact Base Classes,ABCs)
 import abc
 @abc.abstractmethod
4.模块变动

旧的名字 新的名字
_winreg winreg
COngigParser configpaeser
copy_reg copyreg
Queue queue
SocketServer sockerserver
repr reprlib
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容