天天看點

python知識筆記

基礎知識

1 . 除了正常比較操作,以下值或傳回True或False:

- 數字(0,0.0傳回false)

- 資料類型None傳回false

- 集合類型(list,tuple,dict,set)元素數量為0傳回false

2 . python内置上述四種集合可用于疊代(for… in …),其中字典類型以key值傳回,且和set一樣内容是亂序(可改用collections子產品)。

3 . 隻要類中有iter和next函數,可以作為疊代器對象在for語句中使用。

# define a Fib class
    class Fib(object):
        def __init__(self, max):
            self.max = max
            self.n, self.a, self.b = 0, 0, 1

        def __iter__(self):
            return self

        def __next__(self):
            if self.n < self.max:
                r = self.b
                self.a, self.b = self.b, self.a + self.b
                self.n = self.n + 1
                return r
            raise StopIteration()

    # using Fib object
    for i in Fib(5):
        print(i)      

yield關鍵字也可實作疊代效果。yield 語句每次執行時,立即傳回結果給上層調用者,而目前的狀态仍然保留,以便疊代器下一次循環調用。

def fib(max):
        a,b=0,1
        while max:
            r=b
            a,b=b,a+b
            max-=1
            yield r
    #using generator
    for i in fib(5):
        print(i)      

4 . 三目運算符:python沒有類似 condition ? value1 : value2 三目操作符,不過python可以通過 if-else 的行内表達式完成類似的功能。

if condition else      

5 . 使用​

​if __name__ == '__main__':​

​​的代碼稱為自調用,可用于單元測試等。

6 . 函數參數擺放位置:特定參數>預設參數>可變參數>關鍵字參數。可變參數以()和變量名組合,為可疊代的對象。關鍵字參數(*)在函數内部封裝成字典。

def report(name, *grades):
        total_grade = 0
        for grade in grades:
            total_grade += grade
        print(name, 'total grade is ', total_grade)

    def portrait(name, **kw):
        print('name is', name)
        for k,v in      

7 . list清單已經實作了append、insert、remove、切片、index(查找)、count、sort等功能。

8 . 檔案讀取(w,r,a,+)

  • r隻讀 ,r+覆寫讀寫 ,檔案不存在不建立會報錯
  • w建立隻寫(不能讀出) , w+建立讀寫,二者都會清空檔案内容,檔案不存在會建立
  • a附加寫方式打開,不可讀,a+附加讀寫方式打開

9 . 進階函數

- zip

1,2,3]
    b=[4,5,6]
    ab=zip(a,b)
    print(list(ab))
    for i,j in zip(a,b):
        print(i/2,j*2)
    '''
    [(1, 4), (2, 5), (3, 6)]
    0.5 8
    1.0 10
    1.5 12
    '''      
  • lambda
lambda x,y:x+y
    x=int(input('x='))    #這裡要定義int整數,否則會預設為字元串
    y=int(input('y='))
    print(fun(x,y)      
  • map
def fun(x,y):
        return x+y
    print(list(map(fun,[1],[2])))
    print(list(map(fun,[1,2],[2,4])))
    print(fun([1,2],[3,4]))
    '''
    [3]
    [3, 6]
    [1, 2, 3, 4]
    '''      
  • pickle

10 . 深copy和淺拷貝

一個對象的id值在CPython解釋器裡就代表它在記憶體中的位址,如​

​id(var)​

​。

淺拷貝隻是拷貝了最外圍的對象本身,内部的元素都隻是拷貝了一個引用而已。如​

​copy.copy(var)​

​​,深拷貝對外圍和内部元素都進行了拷貝對象本身,如​

​copy.deepcopy(var)​

​。

11 . 正規表達式

多線程threading

  • 系統子產品threading。
  • 使用join函數控制執行完的先後順序。(線程同步)
  • 多線程會遇到Global Interpreter Lock (GIL)問題。

    盡管Python完全支援多線程程式設計, 但是解釋器的C語言實作部分在完全并行執行時并不是線程安全的。 實際上,解釋器被一個全局解釋器鎖保護着,它確定任何時候都隻有一個Python線程執行。 GIL最大的問題就是Python的多線程程式并不能利用多核CPU的優勢 (比如一個使用了多個線程的計算密集型程式隻會在一個單CPU上面運作)。

  • 線程鎖

    執行共享記憶體前,​​

    ​lock.acquire()​

    ​​;執行後,​

    ​lock.release()​

    ​。

多程序multiprocessing

  • 多程序彌補了多線程GIL的問題并充分利用了多核和threading的使用方法。
  • 常用到程序池Pool,map、apply_async。
  • 共享記憶體使用Value、Array(一維的)
  • 使用記憶體鎖解決記憶體争用