python笔试题(二)
1.什么是GIL? GIL全称Global Interpreter Lock,本质是一把互斥锁,并不是python的特性。python为了保证线程安全而采取的独立线程运行的限制, 说白了就是一个核只能在同一时间运行一个线程.对于IO密集型任务,python多线程起到作用,但对于cpu密集型任务, python的多线程几乎占不到什么优势,还有可能因为争夺资源而变慢。 2.python中staticmethod和classmethod的区别? 区别:调用方法不同 静态方法:由类调用,无默认参数 类方法:由类调用,至少一个cls参数,执行类方法时,自动将调用该方法的类复制给self 3.python里面如何拷贝一个对象,并解释深浅拷贝 一般来说可以使用copy.copy()方法或者copy.deepcopy()方法 浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会被改变) 深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另一个不会改变) 4.python里面的search()和match()的区别 re模块中match(pattern,string),检查string的开头是否与pattern匹配,返回一个匹配的对象,如果没找到,返回None re模块中search(pattern,string),在string中搜索第一个匹配值,如果没找到,返回None 5.简述迭代器和生成器以及他们之间的区别? 生成器:生成器是一次生成一个值的特殊函数,在函数执行的过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数, 下次调用生成器函数的时候,又从上次中断的地方开始执行,并且生成器内的变量参数会被保存下来供下次使用。 迭代器:任何实现了__iter__和__next__方法的对象都是迭代器。__iter__返回迭代器自身,__next__返回容器中的下一个值。 生成器是特殊的迭代器,它内部具有这两种方法 6.什么是协程?python的协程是如何实现的? 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方, 在切回来时恢复先前保存的上下文和栈,直接操作栈且基本没有内核切换的开销,可以不加锁的访问全局变量, 比如在执行函数A的时候,中断去执行函数B,过会切过来接着执行函数A。 python的协程通过yield关键字来实现. 7.什么是装饰器?请用装饰器实现singleton 装饰器本质上是一个python函数或者类,它可以让其他函数或者类在不需要做任何代码修改的前提下, 增加额外功能,装饰器的返回值也是一个函数/类对象. def singleton(cls,*args,**kwargs): instance = {} def _singleton(): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return _singleton @singleton class test_singleton(object): def __init__(self): self.number = 0 def add(self): self.num_add = 10 obj_1 = test_singleton() obj_2 = test_singleton() print(obj_1,obj_2): 8.请使用python实现快速排序 def Quick_Sort(my_List,start,end): if start < end: i,j = start,end base = my_List[i] while i < j: while (i < j) and (my_List[j] >= base): j = j - 1 my_List[i] = my_List[j] while (i < j) and (my_List[i] <= base): i = i + 1 my_List[j] = my_List[i] my_List[i]=base QuickSort(my_List,start,i-1) QuickSort(my_List,j+1,end) return my_List my_List = [42,30,61,80,74,20,24,45] Quick_Sort(my_List,0,len(my_List)-1) print(my_List) 9.简述MyISAM和InnoDB的特点。 MyISAM适合于一些需要大量查询的应用,但对于有大量写操作并不是很好。比如你只是需要update一个字段,整个表都会被锁起来,而别的进程, 就算是读进程都无法操作直到读操作完成。另外,MyISAM对于select count(*) 这类的计算非常快。 InnoDB的趋势会是一个非常复杂的存储引擎,对于小的应用,会比MyISAM慢,但是支持’行锁‘,在写操作较多时更方便,还支持更多高级应用,比如事务。 10.简述python的垃圾回收机制 python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。 引用计数:python在内存中存储每个对象的引用技术,如果计数变成0,该对象就会消失,分配给该对象的内存就会释放。 标记-清除:一些容器对象,比如list,dict,tuple,instace等可能会出现引用循环,对于这些循环,垃圾回收器会定时回收这些循环(对象之间通过引用(指针)连在一起, 构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边). 分代收集:python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代被优先处理,因此越晚创建的对象越容易被回收。