• 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

  • 相关阅读:
    排序算法
    chrome
    2017年末思考
    phpstorm修改创建文件时的默认注释
    男人
    Easyui-Tree和Combotree使用注意事项-sunziren
    Easyui-Treegrid使用注意事项-sunziren
    在生产环境中碰见的JSP木马-sunziren
    JS实现粒子拖拽吸附特效-sunziren
    双向链表的简单Java实现-sunziren
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/5028897.html
Copyright © 2020-2023  润新知