Python面試題自我總結(一)

  • is與==區別

==用來判斷兩個對象的value(值)是否相等

is 用來判斷對象間的唯一身份id(標識)是否相等

在變量與單例值之間比較常用的是is(x is None)
is運算符比 == 速度快

  • 深拷貝與淺拷貝

淺拷貝:傳遞對象的引用,原始值被修改/賦值

深拷貝:開闢新的空間,保存之前的對象,傳遞之前對象的值到新的空間中,相互之間不會影響

淺拷貝:直接賦值、copy.copy
深拷貝:copy.deepycopy()

  • GIL全局解釋器

GIL(Global Interpreter Lock) GIL不是Python的特性,是python解釋器(CPython)引入的一個概念(解釋器:把.py爲擴展名的文本文件,通過解釋器去執行 CPython IPython PyPy JyPython)。
解決多線程之間數據完整性和狀態同步的方法就是加鎖,GIL就是一把超級大鎖(全局排他鎖),對多線程效率有不小影響==Python單線程程序。但如果進行耗時的IO操作,能釋放GIL也可以提升運行效率。

  • def func(*args,**kwargs)

*args:用來發送非鍵值對的可變數量的參數列表給函數(1,‘5’,(1,5),[5,8,9],{‘x’:1})

**kwargs:用來傳遞不定長度的鍵值對參數給函數(a=2,c=4,x=5)

  • 可變類型與不可變類型

不可變:不允許將變量的值發生變化,如果改變變量的值就是新建了一個新的對象(string 數值 元組tuple[0]=100 非法的)

可變:允許變量的值發生變化,可以通過append、+=等操作(list、dict)

  • 內存管理機制

引用計數:
每個對象都有指向該對象的引用總數。對象被引用時其計數+1,不再被一個變量引用時-1,等於0時對象被刪除

垃圾回收:
1. 引用計數
2.標記清楚:假如兩個引用之間存在循環引用,則其實際有效計數爲0
3.分代回收:將內存塊根據存活時間劃分不同集合(‘代’),垃圾收集的頻率隨‘代’的存活時間增大而減小,活的越長的對象越不可能是垃圾

內存池機制:
呈現金字塔形狀 -1-2層由操作系統完成,0層大內存若請求分配的內存大於256K,malloc函數分配內存,free函數釋放內存。1,2層內存池有Python的接口函數PyMem_Malloc實現-----若請求分配的內存在1~256字節之間就使用內存池管理系統進行分配。3層 用戶對Python對象的直接操作

  • 可迭代對象、迭代器和生成器

https://blog.csdn.net/qq_39884947/article/details/90144093

  • yield 與return

yieid 會暫停函數的運行,返回當前數據,執行 next方法,函數會從暫停的位置繼續向下執行

return 會打斷函數的運行,返回結果,再次運行函數,會從頭開始重新執行
yieid 相同條件多次執行可以返回一組有關聯的數據

return 相同條件多次執行返回同一結果
yieid 和 return 聯用只有python3 支持,並且執行到return 會拋出StopIteration 異常

  • 線程、進程、協程

https://blog.csdn.net/qq_39884947/article/details/90144366
https://blog.csdn.net/qq_39884947/article/details/90145156
https://blog.csdn.net/qq_39884947/article/details/90144965

  • 裝飾器

函數可以作爲參數傳遞

普通的裝飾器

def dec(func):
    def inner():
        print('裝飾器運行')
        func()#沒有則下方被裝飾的函數不會運行
    return inner

@dec
def my():
    print('調用裝飾器')
my()

傳遞參數的裝飾器

def dec(func):
    def inner(m, n):
        print('裝飾器運行')
        func(m, n)  # 沒有則下方被裝飾的函數不會運行
    return inner
@dec
def my(a, b):
    print('調用裝飾器')
    print(a + b)
if __name__ == '__main__':
   my(1,3)

有返回值的裝飾器

def dec(func):
    def inner(m, n):
        print('裝飾器運行')
        result=func(m, n)  # 沒有則下方被裝飾的函數不會運行
        return result
    return inner
@dec
def my(a, b):
    print('調用裝飾器')
    print(a + b)
    return '返回值'+str(a+b)
if __name__ == '__main__':
   print(my(1,3))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章