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把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代被优先处理,因此越晚创建的对象越容易被回收。

 

posted @ 2018-02-15 09:24  爱笑的大象  阅读(308)  评论(0编辑  收藏  举报