import os def get_all_files(directory): file_list = []
#os.walk
返回一個生成器,每次迭代時返回當前目錄路徑、子目錄列表和檔案列表 for root, dirs, files in os.walk(directory): for file in files: file_list.append(os.path.join(root, file)) return file_list # 獲取當前目錄下的所有檔名 current_directory = os.getcwd() files = get_all_files(current_directory) # 列印所有檔名 for file in files: print(file)
Python 2.x 和 Python 3.x 之間的一些主要區別:
列印函數:在 Python 2.x 中,列印語句是一個關鍵字,使用類似於 print "Hello"
的語法。而在 Python 3.x 中,print
被改造為一個內建函數,需要使用括號,例如 print("Hello")
。
整數除法:在 Python 2.x 中,整數除法的結果會被截斷為整數,例如 5 / 2
的結果是 2
。而在 Python 3.x 中,整數除法的結果將保留小數部分,得到浮點數結果,例如 5 / 2
的結果是 2.5
。如果想要執行截斷整數除法,可以使用 //
運運算元。
Unicode 字串:在 Python 2.x 中,字串型別分為普通字串和 Unicode 字串(以 u
字首表示),這導致字串處理的一些混亂和困惑。而在 Python 3.x 中,所有字串都是 Unicode 字串,普通字串是以位元組表示的,需要使用 b
字首表示。
xrange
替代 range
:在 Python 2.x 中,range
函數返回的是一個列表,如果需要生成大範圍的整數序列,會佔用大量記憶體。而在 Python 3.x 中,range
函數的實現類似於 Python 2.x 中的 xrange
,返回一個迭代器物件,節省了記憶體。
異常語法:在 Python 2.x 中,捕獲異常時使用的語法是 except Exception, e
,將異常物件儲存在變數 e
中。而在 Python 3.x 中,使用 except Exception as e
的語法,將異常物件儲存在變數 e
中。
input
函數:在 Python 2.x 中,input
函數會將使用者輸入的內容作為 Python 程式碼進行解析,存在安全風險。而在 Python 3.x 中,input
函數始終將使用者輸入的內容作為字串返回,不進行解析。
除了上述主要區別之外,Python 3.x 還進行了一些其他改進,包括改進的類定義語法、更好的模組管理和匯入機制、更一致的例外處理和錯誤機制等。然而,這也導致了 Python 2.x 程式碼無法直接在 Python 3.x 中執行,需要進行一些修改和調整。
多執行緒(Multithreading):
threading
模組來建立和管理執行緒。通過建立 Thread
類的範例,指定要執行的函數或方法,並呼叫 start()
方法,可以啟動一個執行緒。多程序(Multiprocessing):
multiprocessing
模組來建立和管理程序。通過建立 Process
類的範例,指定要執行的函數或方法,並呼叫 start()
方法,可以啟動一個程序。總結:
全域性直譯器鎖(Global Interpreter Lock,簡稱 GIL)是在 CPython 直譯器中存在的一個特性。它是一種機制,用於保證同一時刻只有一個執行緒執行 Python 位元組碼。雖然 GIL 的存在確保了 CPython 直譯器的執行緒安全性,但也對多執行緒並行執行帶來了一些限制。
以下是對 GIL 的一些詳細解釋和理解:
GIL 的作用:
GIL 的影響:
解決 GIL 的方法:
multiprocessing
模組、concurrent.futures
模組等,提供了替代方案,使得在某些情況下可以繞過 GIL 的限制。需要注意的是,GIL 只存在於 CPython 直譯器中,而其他實現(如 Jython、IronPython)可能沒有 GIL。此外,對於許多型別的應用程式,如 I/O 密集型、並行處理不頻繁的應用程式,GIL
的影響較小,可以繼續使用多執行緒來實現並行。然而,對於 CPU 密集型任務和需要充分利用多核處理器的應用程式,考慮使用多程序或其他解決方案來規避 GIL。