Differences between Python2 and Python3

@1:
str, repr和反引号是Python将值转为字符串的3种方法
repr创建一个字符串,它以合法的Python表达式的形式表示该字符串。
Python2还有反引号`,但Python3中没有反引号,使用repr代替了反引号

@2:
unicode对象与字符串并不是同一个类型
Python中的普通字符串在内部是以8位ASCII码形式存储的,unicode字符串存储为16位unicode字符,
Python3中的所有字符串都是Unicode字符串。

Python 3.4.0 (default, Jun 19 2015, 14:18:46) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> type("hello")
<class 'str'>
>>> type(u"hello")
<class 'str'>

 

Python 2.7.6 (default, Jun 22 2015, 18:00:18) 

[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> type("hello")
<type 'str'>
>>> type(u"hello")
<type 'unicode'>

@3: range() & xrange()

Python2:
range()函数一次创建整个列表; 而xrange()函数一次只创建一个数。
Python3:
range()会被转换成xrange()风格的函数。

@4:tuple有什么用?感觉完全可以用list替代,通常确实是可以替代的,但存在以下2种情况:

1): tuple可以作为dict的key,而list不行

>>> dictionary = {[1, 2] : '1', [3, 4] : '2'}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> dictionary = {(1, 2) : '1', (3, 4) : '2'}
>>> dictionary
{(1, 2): '1', (3, 4): '2'}

2): 很多内建函数的返回值类型是tuple。

@5: 使用新式类的方法有两种:
1. 在文件开头添加__metaclass__ = type代码行
2. 类定义时显式继承新类object
Python3.0中已经不存在旧式类。

@6: super()只能在新式类(__metaclass__ = type/class B(object))中使用

#!/usr/bin/python2.7
#coding:utf-8
#如果想有中文注释就必须得有上面的语句

class A(object):
    def __init__(self, name):
        self.name = name
    def show(self):
        print("In A. self.name: " + self.name)


class B(A):
    def __init__(self, name, sex):
        #A.__init__(self, name) #NOTE 1: 如果不使用基类的成员变量,此处是可以不调用基类的__init__()/super()
        super(B, self).__init__(name)     #NOTE 2: super只能在新式类中使用. if without __metaclass__ = type/class B(object), then we got "TypeError: must be type, not classobj"
        self.sex = sex
    def show(self):
        print("In B. self.name: {0}, self.sex: {1}".format(self.name, self.sex))

def main():
    a = A("lxw")
    a.show()
    b = B("wxl", "f")
    b.show()

if __name__ == '__main__':
    main()
else:
    print("Being imported as a module.")

 @7:

@4: 
_metaclass__ = type                                                   
 class A:
     def modify(self, happy):
         self.happy = happy
 
     def show(self):
         print(self.happy)
 
 def main():
     a = A() 
     #a.show()    #AttributeError: 'A' object has no attribute 'happy'
     #A.show(a)   #AttributeError: 'A' object has no attribute 'happy'
     a.happy = False
     a.show()    #False
     A.show(a)   #False
     a.modify(True)  
     a.show()    #True
     A.show(a)   #True
     A.modify(a, False)
     a.show()    #False
     A.show(a)   #False
 
 if __name__ == '__main__':
     main()

在调用一个实例的方法时,该方法的self参数会自动绑定到该实例上(这称为绑定方法)。但如果直接调用类的方法(例如Base.__init__),那么就没有实例会被绑定,这样就可以自由地提供需要的self参数,这样的方法称为未绑定方法。

 

posted @ 2015-07-22 20:10  XiaoweiLiu  阅读(580)  评论(0编辑  收藏  举报