python知識點總結


此知識要點,是根據學習廖雪峰phthon3.0教程總結的,所以結構基本和這個教程的結構相同。

背景知識

  1. python是什么?(1)python是一門編程語言,意味着可以用python編寫程序,完成一定的功能;(2)python是一種腳本語言,這就是說,python程序需要在一個解釋器中運行,這個解釋器把程序翻譯成計算機可執行的二進制代碼,python的官方解釋器叫做CPython.
  2. 安裝python.所謂安裝python,實際上主要是安裝一個python解釋器(CPython,以便使用該解釋器執行python程序)和內置類庫;除此之外,同時還會安裝一個集成開發環境,這個集成開發環境叫做IDLE。
  3. python的代碼庫。python的代碼庫可以分為兩類,一類是python內置的代碼庫,提供了包括網絡/文件/GUI/數據庫/文本處理等大量的功能,內置代碼庫在安裝python的時候會同時安裝;另一類是第三方代碼庫,在python上有大量的第三方代碼庫可供使用;
  4. 啟動python.所謂啟動python,實際上是啟動python解釋器(CPython),通過在命令行中輸入python啟動解釋器。python解釋器有兩種模式,一種是交互式模式,在這種模式下,輸入的代碼在回車后會立即執行,並顯示代碼執行結果,在命令行中通過輸入python進入交互式模式,輸入exit()退出交互式模式;另一種是命令行模式,即在命令行中輸入python [文件名.py],直接執行python程序。這里有一個問題,就是python可以用來編寫web應用程序,web應用程序的基本功能是處理http請求,python程序是如何運行起來(或者說在上面的哪種模式下)處理http請求的呢?這是由web服務器和框架來啟動python程序處理http請求的。所有用腳本語言編寫的網站后台都是這種由框架啟動的模式;
  5. python語言的輸入和輸出。python用variable = input()函數將用戶輸入保存在變量variable中,用print('hello', variable)函數產生輸出;
  6. python程序需要保存為utf-8編碼,在notepad++的Encoding菜單中選擇Encode in UTF-8-BOM;

數據類型/變量/語句/運算符

  1. 強制縮進。(縮進的最佳實踐是使用4個空格,而不使用Tab)這個理解起來比較容易,但是卻說不上來;以#表示注釋;Python區分大小寫;當語句以:結束時,其后縮進的代碼被視為代碼塊;
  2. python中的objects及其idnetity/type/value。objects是python對data的抽象(不懂),在python程序中,所有的data都是由objects表示的(好像懂了一點)。每個objects都有一個identity,一個type和一個value。object的type決定了該object可以支持的操作operations以及該object's value的取值范圍(對比C#來講,我理解object就相當於是一個變量,這個變量由所屬的類型(就是class)以及value),變量也有一個identity,可以理解就是該變量在內存中的地址。python中有內置的(build-in)的type(python的build-in是語言本身提供的還是library提供的?),下面說的python的數據類型,就是這些內置的type。
  3. python根據object的value是否可以改變,將變量分為mutable和inmutable兩類。怎么理解“object的value是否可以改變”?當我們在python中給一個object賦值時,實際上python做了兩件事:(1)python首先會分配一塊內存(第一塊內存),用來存儲這個object的value;(2)然后會再分配一塊內存(第二塊內存),這塊內存的內容是第一塊內存的地址,這塊內存代表這個object本身的名字(應該就是這個objects的identity)。這樣在“改變”object時,就有兩種情況發生:(1)第一塊內存存儲的內容發生變化;(2)第二塊內存的內容發生變化(也就是存儲的地址變了,指向另一塊內存了)。如果是發生第一種情況,那么這個object的value就是可以改變的,其type就是mutable(可變的),如果發生第二種情況,那么這個object的value就是不能改變的,其type就是inmutable(不可改變的)。
  4. python的簡單數據類型:object的type決定了這個object可以支持的操作以及這個object的可能的取值。python中的數據類型都是class(這個怎么理解?)。
    1. 整型:class int;0x前綴表示十六進制,其他沒有什么特別的;
    2. 浮點型:class float;也可以用科學技術法表示,其他沒有什么特別的;
    3. 字符型(字符串):class str;(1)單引號或雙引號擴起來的任意文本;(2)轉義字符\,r''表示其中的字符均不轉義;(3)'''...'''(3個引號)用來表示多行內容;以上3點是定義字符串字面量的方式;(4)也可以使用構造函數str()來創建字符串;(5)字符串方法:
    4. 字節序列:class bytes;python中數據類型是字節序列,不是單個字節。bytes可以通過字面量b'A'(這實際上是A字符ASCII的二進制表示形式,所以b'中'這樣是不能定義bytes的,因為'中'字符不能用ASCII表示)、函數bytes()、str.encode('ascii/utf-8等')(同樣,如果使用ascii編碼,這里的str不能是ascii不能表示的字符,漢字的utf-8編碼一般是3個字符,所以'中'.encode('utf-8)得到的是一個長度為3的字節序列)來定義。
    5. 布爾型:class bool;用True、False表示布爾值(注意大小寫);運算符:and( a and b); or(a or b); not(not a);None/空字符串/0/空的字典或List等都會被認為是False;
    6. 一個特殊的空值None,空值在什么場合下有什么用(類似C#的null)
  5. 運算符:
    1. +、-、*、**、/(除法運算符,結果為浮點數,即使能整除也是)、//(地板除,結果為小於除法計算結果的最小整數)、%(取余運算符:得到兩個整數相除的余數)
  6. 變量。有兩點注意即可:
    1. (1)python是一種動態語言,這就是說python中的變量沒有固定的數據類型,可以給同一個變量賦任意數據類型的值;
    2. python中的特殊變量:
      1. __name__:當在命令行中運行python模塊文件時,變量__name__被賦值為字符串'__main__',而在其他地方導入python模塊文件時,__name__不會被賦值,所以我們常用 if __name__ == '__main__'來運行只想在命令行中執行時才運行的代碼(如測試代碼等);
      2. __author__:
      3. __doc__:
      變量的作用域:Python沒有提供類似private、public的機制,以下只是習慣用法:
      1. 用_或者__作為前綴修飾變量、函數來表示private的含義;
    3. palceholder
  7. 常量。事實上,python中沒有常量,也就是說python沒有任何機制保證一個變量的值不被修改,但約定俗成的,用全部大寫的變量名表示常量。
  8. python字符串和字符編碼:
    1. 對於字符編碼規則,我是這樣理解的:字符編碼規則是定義某種bit序列表示某個字符的規則,也就是使用一個特定的編碼規則,可以將一個bit序列解釋為一個特定的字符(即解碼decode),同樣一個特定的字符也會轉變為一個特定的bit序列(即編碼encode),如果一個bit序列是根據A規則形成的(即編碼),然后用另一種規則B解碼,那么其結果就是亂碼。假如一個存儲在磁盤上的文件,在磁盤上就是一個bit序列,這個bit序列表示的是什么含義,要結合該文件使用的字符編碼來確定。一個工具軟件要想知道這個bit序列的含義,需要1.知道這個文件所使用的字符編碼規則;2.根據字符編碼規則對這個bit序列進行解釋,得到最終的含義。那么工具軟件是怎樣知道一個文件所使用的字符編碼規則呢?好像是操作系統有一個默認的字符編碼規則。另外一種可能是:這個bit序列其實是可以自解釋的,也就是只能用某種字符編碼規則對這個bit進行解釋,才能得到有意義的內容(這個好像不太可能);
    2. python解釋器默認好像是用UTF-8對源文件(即存儲在磁盤上的bit序列)進行解釋的,在遇到源文件中無法用UTF-8解釋的內容時(比如在保存文件時用gb2312編碼規則,那么源文件中的中文內容就不能用UTF-8解釋),就會報錯。但是可以在文件開頭通過使用# coding=<encoding name>(如 # coding=gb2312)聲明源文件使用的字符編碼,這樣也不會出錯。但最好的方法還是把源文件以UTF-8保存,這樣python解釋器也按照UTF-8解釋,這樣簡單不出錯。
    3. 【Python中的字符串在內存中都是以Unicode(每個字符用兩個字節表示)表示的,這樣在將字符串內容通過網絡傳輸或保存到磁盤中的時候,需要將Unicode的內容按照某種規則(如UTF-8)編碼,得到一個字節序列,這個字節序列可用於傳輸或保存,這個通過encode('utf-8')轉換。同理,python程序接受的字節序列,通過decode('uft-8')可以轉化為python中的字符串。】這個其實我沒有弄明白。
    4. 輸出格式化的字符串。字符串的格式化是通過%運算符實現的,基本格式是:'hello, 占位符' % (逗號分隔的實際內容)。這里“占位符”的格式比較重要,要記住,很多程序(像log4net等)都使用這個格式。%d:整數;%f:浮點數;%s:字符串;%x:十六機制整數。還可以在%后面用數字表示輸出內容所占的長度(內容本身長度不足時用空格(默認)或0(需指定)補足),用%.數字f定義浮點數中小數點后的位數。
  9. list、tuple、range(它們都是python中的sequence type):
    1. list(和tuple)是什么?是python內置的type,它們都是sequence type,實際上str、bytes、bytearray都是sequence type。sequence type有一些通用的操作,如:x in s/ x not in s(判斷x是否在或不在s中),s + t/s * n/n * s(將s和t連接起來,把s重復n次加入到s中),切片操作s[i:j:k],len(s)/min(s)/max(s),s.index(x[, i[, j]])/s.count(x)(求x在s中的index,出現的次數)等。
    2. list和tuple都表示元素的一種有序集合。區別在於tuple(叫做元組)一旦初始化后,其元素是不可修改的,“不可修改”的含義是:tuple類型的變量所指向的內存地址的內容是不可改變的,但是這個變量可以指向不同的內存地址(參看上面3的說明),也就是說list是mutable, tuple是inmutable。
    3. 初始化list的語法是中括號[],如list1 = [ 1, '2', [ 3, '4' ] ],初始化tuple的語法是小括號(),如tuple1 = ( 1, '2', [ 3, '4' ] ),但使用索引值訪問其中元素的方法都是中括號[],如list[0], tuple[0];向list中添加元素:list.append();list.insert(i,x);從list中移除元素:list.pop([i]);list.remove(x):移除list中所有等於x的元素;del list[i:j:k];list.clear();llist[i]=x;list.reverse()。這些操作只對mutable的sequence有效。
    4. 對list進行排序,其方法是:list.sort(key, reverse),或sorted(list, key, reverse),前者是就地排序,也就是改變list的內容,后者是不改變list內容,而是返回一個排序后的新list。其中的參數key是一個function,該function的參數是list的元素,返回值是排序的規則。key可以使用lambda表達式,語法舉例如下:list.sort(key = lambda x: x.lower(), reverse = True)等。
    5. python一個特殊的地方是,可以用負數作為索引值訪問其中的元素,-1表示最后一個元素,依次類推;
    6. 定義只有一個元素的tuple,其語法是tuple = ( 1, ),而非tuple = (1),這是因為小括號()同時是運算符,后一種方式會使得變量tuple等於(1)的運算結果1,而非元組(1);
    7. range表示一個數字序列:其語法有兩種:range(stop);range(start, stop[, step]),給range方法的參數必須是整數,如果省略start,則默認從0開始,如果省略step,則默認步進為1。
  10. 條件判斷的語法:
  11. 1 if <條件判斷1>:
    2     <執行1>
    3 elif <條件判斷2>:
    4     <執行2>
    5 elif <條件判斷3>:
    6     <執行3>
    7 else:
    8     <執行4>

    需要注意的幾點:(1)else if的語法是elif;(2)每個條件判斷后面必須有個冒號:;(3)縮進的部分就是一個代碼塊;(4)上面的<條件判斷>兩邊可以有括號,也可以沒有括號;

  12. 循環的語法:
    1. for ... in ...循環:對於循環n次,則使用range(),如:for i in range(n);
    2. while循環:while expression: statement block else: statement block;
    3. break;continue;
  13. try語句:形式1:try: statement block finally: statement block;形式2:try: statement block (except [expression [ as identifier]]: statement block) else: statement block finally: statement block。except子句用來指定一個或多個異常處理句柄,當try中發生異常時,如果某個exception子句中expression的結果(是個object)和發生的異常兼容(compatible,如果前面表達式結果的object是所發生異常的class或者base class,或者是個tuple,其中包含了與所發生異常兼容的對象)時,則執行該exception子句中的代碼。
  14. dict:幾點:(1)dict中的元素是一個key-value對,而不只是一個值,其中的key必須是不可變對象,字符串可以作為key,整數也是可以作為key的;(2)dict的查找和插入速度比list快,這是因為value的內存位置是通過key值來計算的(這也是要求key必須是不可變對象的原因,否則計算出的位置不同,就不能找到value的正確位置);(3)dict的語法是使用花括號{key1:value1, key2:value2},元素用,分隔,key和value之間為:分割,以key為所以存取value,即dict[key]的語法。存入元素d[key] = value,如果該變量中不含此key,則直接加入,否則會覆蓋原有值;讀取dict中的元素時,如果key不存在,則會報錯,所以還可以使用dict.get(key[, default] )的方法獲取元素的值,此時如果key不存在,則返回None或指定的默認值;(4)刪除dict中的元素使用dict.pop(key)方法。
  15. set:幾點:(1)set是一個不包含重復值的集合;(2)因為要判斷其中的值是否相同,所以其中的值必須是不可變對象,除此之外,set和list更像;(3)創建set變量的語法特別在i.有一個set關鍵字;ii.需要將一個list作為輸入集合,如下:s = set([1, 2, 3]);(4)set的add(element)和remove(element)方法;

函數

  1. 函數的定義:def 函數名( 逗號分隔的參數列表 ): 函數體
    1. 函數名:
    2. 參數列表:參數無數據類型,用逗號分隔。
    3. 返回值:在函數定義中,並不能定義返回值。但在函數體內部用return語句結束函數執行,return 語句可帶有(多個)返回值,如果沒有明確指定返回值,則函數的返回值為None,有多個返回值的,實際上是返回一個tuple。
  2. 調用函數:
    1. 在命令行模式下調用函數:
    2. 在交互式模式下調用函數:
  3. 再談函數參數:
    1. 位置參數:就是常見的參數形式,沒有特別的;
    2. 默認參數:(1)就是參數有一個默認值,在調用函數時,如果沒有為有默認值的參數指定值,則該參數使用此默認值,如:函數power( x, n = 2 ),n即為有默認值的參數;(2)如果有多個有默認值的參數,那么調用此函數的時候,要么全部省略實際參數,要么依順序提供實際參數,如果需要省略位於較前位置的實際參數值,那么為較后位置的參數提供實際參數時,要使用命名參數的形式,即 參數名 = 值 的形式;(3)默認參數的“坑”:
    3. 可變參數:是說函數參數的個數是不固定、可變的。定義可變參數的語法是在參數名前添加一個*,如:def calc( *numbers );實際上可變參數和類型為tuple的參數,效果是一樣的,只是可變參數使得代碼更簡潔一些(可以認為是個語法糖),在調用函數的時候可以提供任意個參數;
    4. 關鍵字參數:也是函數參數的個數不規定、可變的,只是在調用函數時使用“參數名 = 值”的方式提供多個參數,這些“參數名 = 值”在函數內部將作為形式參數的元素加入到形式參數中(這個形式參數將轉變為dict),定義關鍵字參數的語法是在形式參數名前添加兩個*,如:def calc( **numbers )。
    5. 命名關鍵字參數:
    6. 在python中,調用函數的時候,不能傳入未經定義的實參(這一點和javascript不一樣,后者可以傳入任意多的實參,如果在函數定義中無對應的形參,則多余參數將被忽略);
    7. python的函數參數整這么復雜,必要性是什么?

高級特性

  1. 切片(slice):切片是指獲取list或tuple的一部分(或一個子集),不能對dict或set進行切片操作(因為其中的元素不是按順序存儲的)。切片的語法是:list[n1:n2:n3],其中n1為切片的起始索引,如果省略則為從0開始;n2為結束索引,若省略則為最后一個;n3則表示在起始索引和結束索引的范圍內每n3個取一個元素,若省略,則每個元素都取。這個切片就像字符串的substring方法一樣。
  2. 可迭代對象及迭代:迭代就是使用for循環依次訪問可迭代對象中的每個元素。
    1. 什么是可迭代對象呢?
    2. 如何迭代list/dict/tuple/set/字符串:
    3. python的for循環非常特別,在for循環中可以引用多個變量,形如:for i, j, k in ...,這是要求in后的可迭代對象中也要有分別對應i,j,k多個變量的內容。
  3. 列表生成式list Comprehensions:專門用來生成一個(復雜的)list的機制。語法為:[ 對for中變量進行計算的表達式 for 變量列表 in 可迭代對象 if 對for中變量篩選的表達式],如:[ k + ' = ' + v for k, v in dict.items() if v % 2 == 0],這個語法真是足夠靈活。
  4. 生成器generator:生成器可以認為是表示生成一個list的算法(而不像列表生成式那樣直接生成了一個列表),list中的元素在需要時(比如訪問這個元素時)才會生成(不需要時不生成,減少了內存占用,可表示無限集)。
    1. 創建生成器:方法一:把列表生成式語法中的[]替換為(),即創建了一個生成器;方法二:使用函數來創建生成器,但是用來創建生成器的函數,除了其中要有yield語句外,還是與一般的函數不同。不同之處在於在這個函數中,yield還需要放在一個循環語句中,這樣,這個生成器才能生成多個列表元素。
    2. 訪問生成器generator中的元素:因為generator也是可迭代對象,所以可以使用for來訪問generator中的元素: for n in g: print(n)

函數式編程

所謂函數式編程,就是語言中的“函數”也是數據,可以被賦值給變量、作為另一個函數的參數等,總之是在使用數據的場合都可以使用“函數”。

  1. 高階函數:就是可以將其他函數作為參數的函數。python內置的幾個高階函數有(這些高階函數和C#中在集合上定義的擴展方法非常類似,它們的參數都是一個函數和一個可迭代對象,然后將函數作用於可迭代對象中的每個元素,產生結果):
    1. map(f, list):傳入map的函數僅有一個參數,將此函數單獨作用在可迭代對象的每個元素上(也就是依次用可迭代對象中的每個元素作為此函數的參數調用,需要注意的是,在函數中沒有有關此元素在list中的位置信息,所以如果遇到需在函數中使用元素的位置信息的時候,不要使用高階函數),其返回值是一個迭代器(可以轉變為list而不直接返回list);
    2. reduce(f, list):傳入reduce的函數有兩個參數,達到的效果是:reduce(f, [x1, x2, x3, x4]) = f( f( f( x1, x2 ), x3 ), x4 ),reduce的返回結果,是函數的計算結果,而不再是一個迭代器或list;
    3. filter():傳入filter的函數僅有一個參數,此函數依次作用於可迭代對象的每個元素時返回一個bool結果。整個filter的運算結果是一個迭代器,但排除了上面運算結果為false的元素;
    4. sorted():
  2. 函數作為返回值和閉包:大概了解是怎么回事,但是還是有些說不清楚,也很難應用起來。
  3. 匿名函數(在python中就是lambda表達式):語法是:lambda 逗號分隔的參數列表:表達式。匿名函數的返回值就是lambda表達式的值。python中,這里的“表達式”只是一個簡單的表達式,不支持復雜的語句塊;
  4. 裝飾器:類似於OOP中的裝飾器模式,Python直接從語言層面上支持此模式。python中的裝飾器可以為一個函數臨時增加一些功能。Python是通過下面的步驟實現此模式的:
    1. 定義一個參數為函數、返回值也是函數的函數,即裝飾器函數,在返回的函數中調用傳入的參數函數及添加其他功能,也就是返回的函數成為了參數函數的一個包裝器;
    2. 在定義需要臨時增加一些功能的函數時,在函數前使用“@裝飾器函數名”語法修飾該函數,則在調用此函數時,會轉為調用在裝飾器函數中定義的包裝函數,從而達到臨時增加功能的目的;
    3. 實際上包裝器函數和原函數的一些屬性還是不同的,如__name__屬性等,但python通過functools模塊中的wraps函數可以將原函數的屬性復制給包裝器函數,所以在裝飾器函數中要求這么一句@functools.wrap(原函數名);
    4. 總結起來,裝飾器函數有這么幾個特征(1)其參數為一個函數;(2)返回值也是一個函數;(3)在返回值函數中調用參數函數並添加其他功能,達到為參數函數臨時增加功能的目的;(4)通過“@裝飾器函數名”的方式修飾其他函數,從而為該函數增加裝飾器中增加的臨時功能;(5)裝飾器函數中要有這樣一個語句:@functools.wrap(原函數名),用於將原函數屬性復制給包裝器函數;這也太笨拙了吧?
  5. 偏函數:就是通過為一個函數中的某些參數指定默認值,從而形成一個新函數,這個新函數成為原函數的偏函數。python是通過functools模塊中的partial方法做到這一點的,這個作用不太大,等到用到的時候在詳細查看其語法吧。

模塊

模塊是Python中組織源代碼的一種機制,一個.py文件就是一個模塊,模塊名是該.py文件所在的文件夾名與文件的組合,用.分隔,即“文件夾名.文件名”;

用文件夾來組織模塊的方式,稱為“包(Package)”。可以作為包的文件夾中必須包含一個__init__.py文件(這個__init__.py文件本身可以為空,也可以包含代碼,它本身也是一個模塊,但它的模塊名不是__init__,而是它所在文件夾的名稱),否則該文件夾只是一個普通的文件夾而非“包”(“包”類似C#中命名空間的機制)。

使用內置模塊

只要安裝了Python,內置模塊就可以使用。使用模塊的第一步是導入模塊,語法為import 模塊名,如:

import sys

導入模塊后,將相當於定義了一個與模塊同名的變量sys,使用該變量來引用該模塊,如sys.argv,就是引用模塊sys中定義的變量argv。

使用第三方模塊

使用第三方模塊之前,需要首先進行安裝。在Python中,是通過包管理工具pip完成第三方模塊管理的。

pip命令:

pip search param
pip install param
pip uninstall param
pip list

面向對象編程

面向對象編程的內容:類、對象、類和對象的成員、封裝、繼承、多態;類及其成員的可訪問性public/private/protected;構造函數

1 class Student(object):
2 
3     def __init__(self, name, score):
4         self.name = name
5         self.score = score

創建類的實例:
student = Student()
  1. 定義類的語法:class 類名( 基類 ):,object是所有類的基類,如果上面的定義中省略了基類,則默認從object繼承,如:class Student( object ):;
  2. 構造函數及創建對象:如果定義類時,未顯式定義類的構造函數,則類默認擁有一個無參數的構造函數,如果顯示定義了構造函數,則此默認構造函數就不再存在。類的構造函數名必須是__init__。創建對象時,傳入的參數必須與類的構造函數的參數匹配(self參數除外);
  3. 類和對象的屬性:
    1. 類屬性:(1);(2)可以為類動態添加屬性,如:Student.score = 90,這樣的屬性相當於C#的靜態成員,為類動態添加的屬性會立即體現在類的對象中;(3)以__開頭的屬性是private,不能直接訪問(這不是約定,而是python的限制),如果需要訪問,則需要定義對應的get/set方法;(4)類似__xxx__的屬性都是類的特殊變量,但不是private的;
    2. 對象屬性:可以為對象動態添加屬性,如student1.score = 80;如果對象的屬性與類的屬性重名,則對象的屬性覆蓋類的屬性;這個可能和javascript的屬性訪問機制一樣,即從底層開始,找到后即不在繼續向上層查找;
    3. 類的方法:(1)與普通函數的區別在於,類的方法,其第一個參數永遠是self(語法是:def methodname(self)),但在調用時不必傳入該參數;(2)也可以為類動態添加方法,先定義一個第一個參數是self的方法,動態添加方法的語法是:類名.方法名 = MethodType( 方法名, 類名 )
  4. 繼承和多態:繼承和多態總體上來講和C#一樣,區別在於:python中在子類中定義的與父類同名的方法,自動全部是多態的(以__開頭的方法除外,C#有覆蓋和復寫的區別,python沒有?),python中有無類似abstract機制?python中有沒有protected/protected internal的機制?
  5. 獲取對象信息,使用以下函數:
    1. type():用來判斷對象的類型。python的設計不嚴謹,這個type()函數就是個很好的例子。type()函數返回值的類型是什么呢?是類。那是什么類呢?他可以和int/str/bool/bytes(對於基本數據類型)、類名(對於一般類)、types模塊中定義的常量(如:FunctionType等)比較。是不是太靈活了?
    2. isinstance():判斷某個變量是否為某種或某幾種類型,返回值為True或者False;
    3. dir():獲取一個對象所有的屬性和方法,返回值是一個包含對象所有屬性和方法名的list;
    4. hasattr()/getattr()/setattr():用於判斷一個屬性/方法名(字符串表示)是否為一個對象的屬性/方法。
  6. 再談動態添加屬性、方法和類的__slots__屬性:
  7. @property:

多進程和多線程

“多進程/多線程”和“異步”、“並行”的概念有什么區別?

 

 

1.重要的是要知道,哪些功能在哪些模塊中;

2.Python的文檔很難看懂,也許是還沒有找到看python文檔的正確方法;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM