python语法笔记(五)

1、python内存管理 
(1)对象内存使用 
&nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存中的地址。在python中,整数和短小的字符,python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象

a = 1
b = 1

print(id(a))
print(id(b))

    python中,通过is关键字可以判断两个引用是否指向同一个对象,即 obj1 is obj2 <===> id(obj1) 是否等于 id(obj2)

# True
a = 1
b = 1
print(a is b)

# True
a = "good"
b = "good"
print(a is b)

# False
a = "very good morning"
b = "very good morning"
print(a is b)

# False
a = []
b = []
print(a is b)

由于Python缓存了整数和短字符串,因此每个对象只存有一份。比如,所有整数1的引用都指向同一对象。
即使使用赋值语句,也只是创造了新的引用,
而不是对象本身。长的字符串和其它对象可以有多个相同的对象,可以使用赋值语句创建出新的对象。

 

 


    在python中,每个对象都有存有指向该对象的引用总数,即引用计数。通过sys包中的getrefcount()方法可以查看某个对象的引用计数。需要注意的是当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。

from sys import getrefcount

a = [1, 2, 3]
print(getrefcount(a)) # 2

b = a
print(getrefcount(b)) #3

 

(2)对象引用对象 
    python的一个容器对象,比如列表、词典等,可以包含多个对象。实际上,容器对象中包含的并不是元素对象本身,是指向各个元素对象的引用。 
也可以自己定义一个对象,中间引用其他的对象:

class from_obj(object):
    def __init__(self, to_obj):
        self.to_obj = to_obj

b = [1,2,3]
a = from_obj(b)
print(id(a.to_obj))
print(id(b))

 

(3)引用减少 
    某个对象的引用计数可能减少,比如,可以使用del关键字删除某个引用:

from sys import getrefcount

a = [1, 2, 3]
b = a
print(getrefcount(b)) #3

del a       #删除了一个引用
print(getrefcount(b))  #2

 

del也可以用于删除容器中的元素,比如:

    a = [1,2,3]
    del a[0]
    print(a) #删除a[0]引用,则a[0]指向的对象可能会被释放(如果没有其他引用指向它的话)

 

如果某个引用指向对象A,当这个引用被重新定向到某个其他对象B时,对象A的引用计数减少:

    from sys import getrefcount
    a = [1, 2, 3]
    b = a
    print(getrefcount(b))
    a = 1
    print(getrefcount(b))

 

(4)垃圾回收 
    python的内存自动回收机制使得程序不需要自己释放内存。

2、python内置函数 
    python内置函数随着python解释器的运行而创建。在python程序中,你可以随时调用这些函数,不需要定义。常见的内置函数如下:

    print(), type(), dir(), help(), len(), open(), range(), enumerate(),
    zip(), iter(), map(), filter(), reduce(),

 

分类总结:

    数学运算
    abs(-5) # 取绝对值,也就是5
    round(2.6) # 四舍五入取整,也就是3.0
    pow(2, 3) # 相当于2**3,如果是pow(2, 3, 5),相当于2**3 % 5
    cmp(2.3, 3.2) # 比较两个数的大小
    divmod(9,2) # 返回除法结果和余数
    max([1,5,2,9]) # 求最大值
    min([9,2,-4,2]) # 求最小值
    sum([2,-1,9,12]) # 求和
    类型转换
    int("5") # 转换为整数 integer
    float(2) # 转换为浮点数 float
    long("23") # 转换为长整数 long integer
    str(2.3) # 转换为字符串 string
    complex(3, 9) # 返回复数 3 + 9i
    ord("A") # "A"字符对应的数值
    chr(65) # 数值65对应的字符
    unichr(65) # 数值65对应的unicode字符
    bool(0) # 转换为相应的真假值,在Python中,0相当于False
    bin(56) # 返回一个字符串,表示56的二进制数
    hex(56) # 返回一个字符串,表示56的十六进制数
    oct(56) # 返回一个字符串,表示56的八进制数
    list((1,2,3)) # 转换为表 list
    tuple([2,3,4]) # 转换为定值表 tuple
    slice(5,2,-1) # 构建下标对象 slice
    dict(a=1,b="hello",c=[1,2,3]) # 构建词典 dictionary**粗体文本**
    序列操作
    all([True, 1, "hello!"]) # 是否所有的元素都相当于True值
    any(["", 0, False, [], None]) # 是否有任意一个元素相当于True值
    sorted([1,5,3]) # 返回正序的序列,也就是[1,3,5]
    reversed([1,5,3]) # 返回反序的序列,也就是[3,5,1]
    类,对象,属性
    # define class
    class Me(object):
    def test(self):
    print "Hello!"
    def new_test():
    print "New Hello!"
    me = Me()
    hasattr(me, "test") # 检查me对象是否有test属性
    getattr(me, "test") # 返回test属性
    setattr(me, "test", new_test) # 将test属性设置为new_test
    delattr(me, "test") # 删除test属性
    isinstance(me, Me) # me对象是否为Me类生成的对象 (一个instance)
    issubclass(Me, object) # Me类是否为object类的子类
    编译,执行
    repr(me) # 返回对象的字符串表达
    compile("print('Hello')",'test.py','exec') # 编译字符串成为code对象
    eval("1 + 1") # 解释字符串表达式。参数也可以是compile()返回的code对象
    exec("print('Hello')") # 解释并执行字符串,print('Hello')。参数也可以是compile()返回的code对象
    其他
    input("Please input:") # 等待输入
    globals() # 返回全局命名空间,比如全局变量名,全局函数名
    locals() # 返回局部命名空间

 

参考:

http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html

posted @ 2015-12-08 13:57  农民伯伯-Coding  阅读(378)  评论(0)    收藏  举报