Python Essential Reference 4th – 第3章 – 读书笔记

1、Python中,一切都是对象。

2、类型:type/class,对象/实例:instance。

3、对象按照是否可以修改,分为可变的 mutable 和不可变的 immutable 。

4、对象中可以引用其他对象,成为容器 container or collection。

5、对象有属性(值)和方法(函数)。

6、Python中的对象无法直接映射到内存空间,但是可以用内置函数id( )函数来查看:

>>> a = []
>>> B = []
>>> id(a)
3077871564L
>>> id(B)
3077198956L

7、操作符is和==的区别:
is是比较是否是指向同一个对象(指向的地址是否相同)
==是比较指向的值是否相等
下面的例子:

# 初始化
>>> a = ["123",456]
>>> b = a
>>> c = ["123",456]

# = 比较的是指向的值是否等
>>> a == b
True
>>> a == c
True
>>> b == c
True

# is比较的是指向地址是否相等
>>> a is b
True
>>> a is c
False
>>> b is c
False

8、每个对象都有一个类型,用内置函数type查看,可用此比较两个对象是否为同一类型。
但是is用于type上,不包含继承类型。

>>> type([])
<type 'list'>
>>> a = set()
>>> type(a)
<type 'set'>
#比较
type(a) is type(b)

9、如果需要判断对象类型并考虑继承情况,可以用isinstance。

# 第一个参数必须是实例,第二个参数必须是类型
isinstance(a,list)

10、每个对象都有一个ref-count
ref-count加一的情况:赋值给别的对象,加入list等container中。
ref-count减一的情况:del删除对象,或者引用的对象出了作用域。
使用sys.getrefcount(xx)可以获得xx对象的引用数。

a = 37
print sys.getrefcount(a)
b = a
c = []
c.append(a)
print sys.getrefcount(a)
del b
del c[0]
print sys.getrefcount(a)

#输出结果
9
11
9
11、加入list、tuple等collection中的是引用!
因此如果一个对象被加入两个collection,修改其中一个,另外一个也会被改变。
a = [1,2]
b = [0,a,3]
c = [a,55]

print c
b[1][1] = 3
print c

#输出
[[1, 2], 55]
[[1, 3], 55]

12、如果希望复制给别的引用或者添加到list中的是独立的对象(新的),可以用deepcopy:

import copy
a = [1,2]
b = copy.deepcopy(a)
b[0] = -2

print a
print b

#输出,经过deepcopy后,就是独立的了。
[1, 2]
[-2, 2]

13、一个转化数据的例子,我们要把GOOG, 100, 490.10转化为对应的类型:
非常精简吧!

line = "GOOG, 100 , 490.10"
field_types = [str,int,float]
fields = [ty(val) for ty,val in zip(field_types,line.split(","))]
#结果
['GOOG', 100, 490.10000000000002]

14、内置类型:None int long float complex bool str unicode(只有python2有) list tuple xrange dict set frozenset(不可变的set)
int值域 -2147483648 ~ 2147483647
long值域 无限(取决与内存)
float:64bit的浮点标示法。

15、sequence类型 str unicode list tuple xrange 的共用操作
S[i] index
S[i:j] slice
S[i:j:stride] slice stride是间隔
要说明的是,i和j都可以是负数,比如-1表示倒数最后一个。
len(S) S中元素的数量
min(S) S中最小的
max(S) S中最大的
sum(S,[初始值]) 累加S
all(S) 当S中都为True时返回True,否则False
any(S) 当S中有任何一个为True时返回True,否则False

16、list独有的操作
list(s) 转化为list
s.append(x) 追加元素到s末尾(如果x是list,则把x整体做为一个元素,追加到s后面)
s.extend(t) 追加list到s末尾(如果x是list,则把x打散后,做为N个元素,追加到s后面)

#list.append 整体追加
>>> x = [1,2,3]
>>> m = [0]
>>> m.append(x)
>>> print m
[0, [1, 2, 3]]

#list.extend 打散追加
>>> x = [1,2,3]
>>> m = [0]
>>> m.extend(x)
>>> print m
[0, 1, 2, 3]

#list.sort 原地排序
>>> x = [5,2,5,3,5,4,2]
>>> x.sort()
>>> x
[2, 2, 3, 4, 5, 5, 5]

17、Python 2 中默认是用Byte String而不是Unicode,非常恶心。对字符串的操作不会改变原值!要么返回新的,要么是返回状态。

str.encode():将unicode的字符串str转化为其他编码,并返回。
str.decode():将非unicode编码的字符串str转化为unicode编码的,并返回。
encode和decode的参数有时候是可以省略的。

str.strip(): 移除字符串头和尾部的空白字符,所有空白!包括空格、换行、制表符等等。

#str.capitalize()  返回首字母大写的字符串
>>> a = "china"
>>> a.capitalize()
'China'

#str.encode()  将unicode的字符串str转化为其他编码,并返回
>>> a = u"计算所"
>>> b = a.encode("gbk")
>>> print b
计算所

#str.decode()  将非unicode编码的字符串str转化为unicode编码的,并返回
>>> c = b.decode("gbk")
>>> print c
计算所

#str.isupper()  检查str所有字符是否都是大写
>>> s = "ABC"
>>> s.isupper()
True
>>> s = "aBC"
>>> s.isupper()
False

#str.strip(chrs)  移除字符串头或者尾部的空白(chrs指定)
>>> s = " \tchina \r\n"
>>> s.strip()
'china'

18、xrange,构造i到j的数组,用于循环时候比较多。

#输出
>>> for i in xrange(10,20):
...     print i
...
10
11
12
13
14
15
16
17
18
19

19、map在Python中又叫做Dictionary(词典)。和数组类似,k和v可以使任意数值(k必须是不可变类型)。
【常用操作】
k in m:检查key是否在map m中。
m[k]=v: 对m的key赋值v
print m[k]: 访问m的key值k
m.has_key(k): m中是否有key k
m.setdefault(k,v): 如果m中已经有k,忽略,否则,新建k并设置数值为v

len(m):map含k-v对儿的个数
m.items():遍历所有k和v
m.keys():遍历所有k
m.values():遍历所有v

m.copy():影子拷贝,非深度拷贝!

20、set类型。set是集合,内含元素非重复,可以看作是退化的无value的map。
frozenset是不可变的set。

set和fronzenset的常用操作:
set_a.copy()
set_a.intersection(another_set):与set取交集。
set_a.union(another_set):与set取并集。

set独有的常用操作(修改的):
set_b.add(item)
set_b.clear():清空
set_b.discard(item):如果item再set_b中,移除,不在的话,无效,不报异常。
set_b.remove(item):和discard类似,不过item不在要抛出异常!

21、lamada函数,其实就是类似Java的匿名类。

bar = lamada x,y: x + y

Cop Six ‘s Blog

22、函数有三种:直接函数、类函数和静态函数:

#直接函数
def fun1(x,y):
    return x+y

#类函数和静态函数
class Foo(object):
    #类函数,第一个参数必须是self
    @classmethod
    def method1(self,arg):
        pass

    #静态函数,其实就是class的static函数,第一个参数不用是self
    @staticmethod
    def method2(arg):
        pass

23、几个内置对象:
Trackback:调用Trackback,一般异常的时候用
Generator:构造器
Slice:这个不用说了吧,lst[1:2],这种slice的时候就是用的这个对象
Ellipsis:下标相应的对象。

24、特殊函数一般是双下划线开头,如:__add__()是重载的+操作符。再如__getitem__()是重载的[]操作符。

25、与构造对象相关的特殊函数:
__new__():新建对象时。
__init__():初始化时。
__de__():del xx,操作符。

new和init一般是同时使用,等价关系是:新建对象=new + init

#x = A()翻译为:
x = A.__new__(A,args)
is isinstance(x,A): x.__init__(args)

26、字符串相关的特殊函数:
__str__():重载的str(xx)函数。
__repr():重载的repr(xx)函数。

27、特殊函数:
__bool__():返回True或者False,用于分支判断时。
__len__():重载len()函数。
__hash__():返回一个int类型的hash值。

__lt__(self,other):重载self__ge__(self,other):重载self>=other

28、属性访问相关的特殊函数
__getattr__(self, name):访问属性,x.name
__setattr__(self,name):设置属性,x.name=yy
__delattr__(self, name):删除属性,del x.name

29、有时候,我们希望在访问x.name时,加一层逻辑(如log日志),此时可以用Descriptors。

30、
__len__(self):len(item)重载
__geitem__(self,key):item[key]重载
__contains__(self,obj):返回self中是否含obj,重载了 x in item。

31、数学操作符特殊函数

__add__(self,other): self + other
__sub__(self,other): self – other
__mul__(self,other): self * other
__div__(self,other): self / other (Python 2 only)
__truediv__(self,other) : self / other (Python 3)
__floordiv__(self,other): self // other
__mod__(self,other): self % other
__divmod__(self,other): divmod(self,other)
__pow__(self,other [,modulo]) : self ** other, pow(self, other,modulo)
__lshift__(self,other): self << other
__rshift__(self,other) : self >> other
__and__(self,other) : self & other
__or__(self,other): self | other
__xor__(self,other): self ^ other
__radd__(self,other) : other + self
__rsub__(self,other) : other – self
__rmul__(self,other): other * self
__rdiv__(self,other) : other / self (Python 2 only)
__rtruediv__(self,other) : other / self (Python 3)
__rfloordiv__(self,other) : other // self
__rmod__(self,other): other % self
__rdivmod__(self,other) : divmod(other,self)
__rpow__(self,other) : other ** self
__rlshift__(self,other) : other << self
__rrshift__(self,other): other >> self
__rand__(self,other) : other & self
__ror__(self,other): other | self
__rxor__(self,other): other ^ self
__iadd__(self,other) : self += other
__isub__(self,other) : self -= other
__imul__(self,other) : self *= other
__idiv__(self,other) : self /= other (Python 2 only)
__itruediv__(self,other) : self /= other (Python 3)
__ifloordiv__(self,other): self //= other
__imod__(self,other) : self %= other
__ipow__(self,other): self **= other
__iand__(self,other) : self &= other
__ior__(self,other) : self |= other
__ixor__(self,other) : self ^= other
__ilshift__(self,other): self < __irshift__(self,other): self >>= other
__neg__(self): –self
__pos__(self): +self
__abs__(self) : abs(self)
__invert__(self): ~self
__int__(self): int(self)
__long__(self): long(self) (Python 2 only)
__float__(self) : float(self)
__complex__(self) : complex(self)

32、with操作符。
with context [ as var]:
statements
重载函数为__enter__(self)和__exit__(self, type, value, tb)

33、dir函数,辅助函数,类似help
__dir__(self):重载了dir函数。

第三章完毕。

Leave a Reply

Your email address will not be published.