严格地说明,只有放在内存空间中对象才有类型,而变量是没有类型的。一个变量只能对应只一个对象,一个对象能够对应多个变量。html
【基础】深度拷贝实现机制
【我的理解】深度拷贝是针对可变变量进行内存复制的。机制不清楚。
浅度拷贝:copy.copy,会建立的一个新的对象,若是是list对象,对于list对象的元素浅拷贝就只会使用原始元素的引用(内存地址)。
深度拷贝:copy.deepcopy,会建立一个新的对象。若是是list对象,对于list对象的元素,深拷贝都会从新生成一份,而不是简单的使用原始元素的引用。
对于不能够变的变量对象,不能拷贝,浅度拷贝和深度拷贝都是同样的。python
new() 与 init()的区别
【我的理解】init()能够认为是__new__()的包装的外壳,在定义类中必需要定义这个方法,能够传入类对象的属性值。__new__()类对象申请内存空间的方法?
__new__是类方法,参数中带有cls,表明实例化的类。继承自object的新式类才有__new__。
__new__必需要有返回值,返回实例化出来的实例,这点在本身实现__new__时要特别注意,能够return父类__new__出来的实例,或者直接是object的__new__出来的实例。
__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上能够完成一些其它初始化的动做,__init__不须要返回值正则表达式
实例化一个类时,__new__是首先被调用的,而后才是__init__调用。
__new__是建立类实例的方法,能够建立单例模式的实例对象生成。__init__是实例建立后的方法。算法
g = (i for i in range(10**100))#生成器表达式 l = [i for i in range(10**100)]#列表生成式 print g.__next__()#更省内存,须要一个取一个 print l.__next__()#须要在内存中建立1行10**100列的序列
另外,使用了yield替代return的函数称之为生成器函数。生成器函数和其余函数的执行流程不同,其余函数是顺序执行,遇到return语句或者最后一行函数语句就结束。在调用生成器运行过程当中,每次遇到yield时函数会暂停并保存当前全部的运行信息,返回yield值。并在下一次执行next方法时,从当前位置继续运行。多线程
编码和解码
【我的理解】编码和解码的问题我认为是一个翻译的问题。unicode是计算机的标准语言,其余的utf-8或者gbk都是不一样体系的语言,编码的过程是把unicode翻译到对应体系的语言,解码的过程是把不一样的体系语言翻译成unicode的过程。
参见之前写的博文基于Python的数据分析(2):字符串编码函数
装饰器、wraps的使用、单例模式
【我的理解】装饰器是函数或者类的对象的外壳,能够在指定被装饰的函数调用先后加入特定的功能。Python装饰器的做用是提升代码的简洁,下降代码的耦合性,将代码要执行的业务逻辑和公共功能进行分离,业务逻辑经过具体的函数来实现,公共功能(例如日志记录,权限认证,输入检查等等)由装饰器负责,代码耦合性下降的同时复用成都也大大提升。
在 Python 中,使用关键字 def 和一个函数名以及一个可选的参数列表来定义函数。函数使用 return 关键字来返回值。Python 容许建立内嵌函数。便可以在函数内部声明函数,而且全部的做用域和生命周期规则仍然适用。装饰器其实就是一个以函数做为参数并返回一个替换函数的可执行函数。
注意:1.@符号是装饰器的语法糖,在定义函数的时候使用,避免再一次赋值操做。2.args 能够表示在调用函数时从迭代器中取出位置参数, 也能够表示在定义函数时接收额外的位置参数。3. kwargs 来表示全部未捕获的关键字参数将会被存储在字典 kwargs。
除了函数装饰器,还有一个类型叫作类装饰器。类装饰器*具备灵活度打、高内聚、封装性等优势。使用类装饰器以来内部的__call__方法,当使用语法糖@附加到函数上时,就能够调用此方法。注意带参数和不带参数的两种类装饰器的区别。编码
#不带参数的类装饰器 class Check(object): def __init__(self, func): self.func = func def __call__(self, *args,**kwargs): print("111111") self.func(*args,**kwargs) print("222222") @Check def param_check(request): print(request) param_check('hello') param_check('world') #带参数的类装饰器 class Check(object): def __init__(self, name): self.name = name def __call__(self, func): print ("1111111111") def decorator(*args, **kwargs): print ("2222222222") return func(*args, **kwargs) return decorator @Check('parm') def param_check(): print('Hello') param_check() param_check()
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已是另一个函数了(函数名等函数属性会发生改变),为了避免影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的反作用。写一个decorator的时候,最好在实现以前加上functools的wrap,它能保留原有函数的名称和docstring。操作系统
装饰器的单例模式:线程
def singleton(cls, *args, **kw): instance={} def _singleton(): if cls not in instance: instance[cls]=cls(*args, **kw) return instance[cls] return _singleton @singleton class test_singleton(object): def __init__(self): self.num_sum=0 def add(self): self.num_sum=100
正则表达式
【我的理解】从文本信息中匹配或者抽取制定规则的信息。翻译
垃圾回收
【我的理解】内存回收。
python的内存回收机制是引用计数策略。对Python语言来说,对象的类型和内存都是在运行时肯定的。这也是为何咱们称Python语言为动态类型的缘由(这里咱们把动态类型能够简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。
解释器负责跟踪对象的引用计数,垃圾收集器负责释放内存。
经过销毁对象的引用,使引用计数减小至 0。
假设 x = 3,如下状况会使 3 这个整型对象的引用计数减小:
对象从集合对象中移除。例如 lst.remove(x);包含对象的集合对象被销毁。例如 del lst。
Python的内存机制以金字塔行,-1,-2层主要有操做系统进行操做;第0层是C中的malloc,free等内存分配和释放函数进行操做;第1层和第2层是内存池,有Python的接口函数,PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;第3层是最上层,也就是咱们对Python对象的直接操做。
垃圾回收时,Python不能进行其它的任务。频繁的垃圾回收将大大下降Python的工做效率。若是内存中的对象很少,就没有必要总启动垃圾回收。因此,Python只会在特定条件下,自动启动垃圾回收。当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数。当二者的差值高于某个阈值时,垃圾回收才会启动。能够手动启动gc.collect.
当内存中有再也不使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,而后清除其在内存的空间。固然除了引用计数为0的会被清除,还有一种状况也会被垃圾收集器清掉:当两个对象相互引用时,他们自己其余的引用已经为0了。垃圾回收机制还有一个循环垃圾回收器, 经过消除引用换的方式释放循环引用对象(a引用b, b引用a, 致使其引用计数永远不为0)。
多进程和多线程
协程