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把內存根據對象存活時間劃分爲三代,對象建立以後,垃圾回收器會分配它們所屬的代。每一個對象都會被分配一個代,而被分配更年輕的代被優先處理,所以越晚建立的對象越容易被回收。
相關文章
相關標籤/搜索