1、File , line 101000SyntaxError: invalid token运算符 (1) 不等于测试 Python 2.x中不等于有两种写法 != 和 Python 3.x中去掉了, 只有!=一种写法,还好,我从来没有使用的习惯 (2) 去掉了repr表达式 Python 2.x 中反引号相当于repr函数的作用 Python 3.x 中去掉了这种写法,只允许使用repr函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用repr的机会很少,一般只在debug的时候才用,多数时候还是用str函数来用字符串描述对象。(3) 除法运算 Python中的除法较其它语言显得非常高端
2、,有套很复杂的规则。Python中的除法有两个运算符,/和/ 首先来说/除法:在python 2.x中/除法就跟我们熟悉的大多数语言,比如Java啊C啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。在python 3.x中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。Python 2.x: 1 / 2 1.0 / 2.00.5Python 3.x: 1/2而对于/除法,这种除法叫做floor除法,会对除法的结果自动进行一个floor操作,在python 2.x和python 3.x中是一致的。python 2.x: -1
3、/ 2-1python 3.x:注意的是并不是舍弃小数部分,而是执行floor操作,如果要截取小数部分,那么需要使用math模块的trunc函数 import math math.trunc(1 / 2) math.trunc(-1 / 2)(4) 比较运算符 Python 2.x中允许不同类型的对象进行比较,比如: -1 FalsePython 3.x中则不允许这类不同类型之间含糊不清的比较:Traceback (most recent call last):, line 1, in TypeError: unorderable types: int() str()我觉着即使在2.x中也不应
4、该使用这种含糊不清的比较,1 返回了False, 这个是基于什么判断的?说不清楚。语句 (1) print 这是应该算是最广为人知的一个差别了吧,Python 2.x和Python 3.x之间连Hello World都是不兼容的。python 2.x中print是语句 print file x, y向打开的输出流file中输出x, y变量的值 在python 3.x中这句要这么写 print(x,y,)file参数定义的默认值是sys.stdout(2) 扩展序列解包 python中的序列赋值一直是这门语言宣传时候的一个亮点,能把一个序列解开进行赋值:89101112131415 x, y =
5、 1, 2 x y x, y = 1, 2 x, y = y, xpython 3.x对这一功能更加进行了强化,支持扩展序列解包: x, *y = 1, 2, 32, 3内置集合类型 内置集合的差别主要体现在字典对象的几个视图方法上,keysitems和values,在2.x中这几个试图方法每次都是赤裸裸的返回一个新的列表,3.x对这种粗鲁的行为做了优化,返回的是迭代器对象。另外原先字典对象有个has_key方法来判断key在字典中是否存在,这个方法实现的功能跟in运算符完全一样,因此在3.x就把这个方法给干掉了。函数 (1) nonlocal作用域 在2.x的时代,Python只有两个作用域
6、,模块里面的全局作用域和函数的局部作用域,但是随着在函数中定义函数的情况越来越多,比如装饰器、闭包等等,这里面就出现了内层函数引用外层函数变量的问题:比如我要在内层函数修改外层函数的一个变量,在Python 2.x的时代就会出现错误: def out_function():. call_count = 0 def in_function(): call_count += 1 return in_function. out_function()(), line 4, in in_functionUnboundLocalError: local variable call_count refere
7、nced before assignment但是在Python 3.x中只要使用nonlocal关键字对变量进行修饰,就会自动去外层函数寻找变量: nonlocal call_count call_count+=1(2) Key-word only 参数 前面我们说到print在Python 3.x中是作为函数提供的。print的参数设计是这样的:print(*value, sep=, end=n, )如果了解Python参数的顺序规则,我们知道在Python 2.x中,参数的顺序必须遵循以下规则去定义:def function(一般参数 or 带默认值参数,*sequence, *dict)
8、 而这个地方却允许先定义*sequence再去定义一般参数,这就是Python 3.x所支持的key-word only的参数形式。在一个*之后允许去定义一些参数,这些参数在函数调用的时候必须指定参数名称。这样本质上其实就是在*sequence类型的参数之后固定写死了一个*dict, 当然也可以在后面继续定义一个*dict:def test(*value, name, *dict):但这样写就不对了def test(*value, *dict, name) (3) map、filter和reduce 这三个函数号称是函数式编程的代表。在Python3.x和Python2.x中也有了很大的差异。
9、首先我们先简单的在Python2.x的交互下输入map和filter,看到它们两者的类型是built-in function: mapbuilt-in function map filterbuilt-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中它们却不是这个样子了:class map map(print,1,2,3)map object at 0xa6fd70cfilterfil
10、ter object at 0xa6eeeac首先它们从函数变成了类,其次,它们的返回结果也从当初的列表成了一个可迭代的对象, 我们尝试用next函数来进行手工迭代: f = filter(lambda x: next(f)对于比较高端的reduce函数,它在Python 3.x中已经不属于built-in了,被挪到functools模块当中。模块 Python 2.x和3.x模块之间的差别主要体现在相对导入这部分的规则上。在Python2.x和3.x当中都是使用点号来指定在当前包下进行相对导入,但是在没有点号的情况下,Python2.x会以先相对再绝对的模块搜索顺序,3.x的顺序跟这个相反,
11、默认是绝对的,缺少点号的时候,导入忽略包含包自身并在sys.path搜索路径上进行查找。面向对象 (1) 经典类和新式类 Python OO最神奇的地方就是有两种类,经典类和新式类。新式类跟经典类的差别主要是以下几点:1. 新式类对象可以直接通过_class_属性获取自身类型:type 2. 继承搜索的顺序发生了改变,经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧;新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动 3. 新式类增加了_slots_内置属性, 可以把实例属性的种类锁定到_slots_规定的范围之中。4. 新式类增加了_getattribute_方法 Pyt
12、hon 2.x中默认都是经典类,只有显式继承了object才是新式类 Python 3.x中默认都是新式类,不必显式的继承object ClassicClass._class_AttributeError: class ClassicClass has no attribute _class_ class NewClass(object): pass NewClass._class_type type class NewClass:pass(2) 无绑定方法 在Python 2.x中除了类方法和静态方法,其余的方法都必须在第一个参数传递self跟实例绑定,但是在Python 3.x中废除了这条
13、规定,允许方法不绑定实例,这样的方法跟普通的函数没有区别: class MyClass: def function(): print function MyClass.function() unbound method function() must be called with MyClass instance as first argument (got nothing instead) m = MyClass() m.function() function() takes no arguments (1 given) print()function(3) 重要的重载 1. next()和
14、_next_():这应该是继print之后第二大坑爹的不兼容吧,Python程序漫山遍野都是迭代器,但是2和3之间迭代器的实现接口方法名是不同的嗯,啥都不说了。2. 分片拦截:Python 3.x之前, 类可以定义_getslice_和_setslice_方法来专门拦截分片,并且这两个方法优先于_getitem_和_setitem_, 但是Python 3.x时代这俩方法再也不存在了,全部的工作都交给了_getitem_和_setitem_,因此在使用这两个方法之前要先判断传递进参数的类型是不是slice对象。3. _bool_方法:我们知道Python中默认将所有的空对象定义为布尔意义上的F
15、alse,在自己定义的类中我们也可以加入自定义的布尔判断标准,在2.x中这个方法名叫做_nonzero_, 这个名字显然非常不直观并且不科学!所有考试交白卷的孩子我们都要否定他们的才能么?显然不能!因此Python 3.x中这个方法被重名命为_bool_ 4. 3.x 取消了用于大小比较的_cmp_方法,取而代之的是:_lt_、_gt_、_le_、_ge_、_eq_、_ne_,嗯,我感觉这个想法真是不能苟同有谁能说服我给我洗脑让我爱上这一堆_lt_、_gt_、_le_、_ge_、_eq_、_ne_么。(4) 类修饰器 在我的上一篇博客中秀了一把函数装饰器在表单验证中的使用, 在3.x的时代,类
16、也有装饰器了,这个装饰器威力巨大,能把装饰的类搞的面目全非,总之想怎么搞就怎么搞,用法同函数装饰器基本一致,只不过传递的参数是类型: def shutdown(cls): def shutdown_func(self):do something. cls.shutdown = shutdown_func return cls shutdown. class Test: t = Test() t.shutdown()do something.异常 先来看一段代码 class Person: def _init_(self, msg): self.msg = msg try: raise Pers
17、on, woca. except Person as p: print p.msgwoca161718 raise Person( print(p.msg), line 2, in exceptions must derive from BaseExceptionDuring handling of the above exception, another exception occurred:, line 3, in 迭代器取消了原先的xrange,现在range函数的返回结果同之前的xrange的返回结果一样,不是列表,而是一个可迭代的对象。其它常用的内置函数,如zip也是如此。(3) U
18、nicode字符串能很好的支持Unicode str = 我爱北京天安门 strxe6x88x91xe7x88xb1xe5x8cx97xe4xbaxacxe5xa4xa9xe5xaex89xe9x97xa8 str = uuu6211u7231u5317u4eacu5929u5b89u95e8我爱北京天安门没有去考究核心库的差别,常用语法上的差别就总结了这些,感觉还好吧,很多常用的框架现在都开始支持Python 3.x, 虽然现在自己主要是在用2.7进行开发,但多了解一下最新的动态总是好的,Python 最初版本设计的年代距离现在已经很长时间了,貌似跟自己同岁,可能那时的一些概念尚不清晰,但Python出现的比Java早多了,能设计到这种先进地步,已经相当厉害,Pytho
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2