Python中的多執行緒介紹

在Python中,應用程序通常只運行在單個執行緒上,除非你明確啟用了多執行緒。 為什麼要使用多執行緒呢?在Python中,代碼是按照順序運行的,一個指令接著一個指令執行。 如果你定義了一個睡眠3秒然後打印信息的函數,像這樣: import time def greet(): time.sleep(3) print('hello') greet() print('world') world字符串將在3秒後打印出來,因為我們在greet()函數中調用了time.sleep(3)。 這只是一個簡單的例子,但想象一下處理圖像、從網絡獲取資源或將大文件寫入磁盤等耗時的任務,這些都需要較長的時間。 通過使用多執行緒,我們可以將耗時的函數運行在單獨的執行緒中,同時繼續執行主程序。 threading標准庫模塊能夠幫助我們實現多執行緒。你可以從中導入Thread: from threading import Thread 然後,我們將要執行的函數作為target參數傳遞給Thread()函數,以獲得一個執行緒對象: t = Thread(target=greet) 接下來,我們調用它的start()方法來啟動這個執行緒: t.start() 試著運行下面的代碼: from threading import Thread import time def greet(): time.sleep(3) print('hello') t = Thread(target=greet) t.start() print('world') 你會發現world比hello早3秒打印出來。 除非你將執行緒設置為守護線程,否則程序將一直運行,直到該執行緒(或它開啟的所有其他執行緒)結束。 這就是多執行緒的基本介紹。雖然強大,但如果使用不當,很容易引入錯誤。

Python列表

列表是一种基本的Python数据结构。 它们允许您将多个值分组并使用一个常用名称引用它们。 例如: dogs = ["Roger", "Syd"] 列表可以保存不同类型的值: items = ["Roger", 1, "Syd", True] 您可以使用in运算符检查一个项是否包含在列表中: print("Roger" in items) # True 列表也可以定义为空: items = [] 您可以通过索引引用列表中的项,索引从零开始: items[0] # "Roger" items[1] # 1 items[3] # True 使用相同的表示法,您可以更改存储在特定索引处的值: items[0] = "Roger" 您还可以使用index()方法: items.index("Roger") # 0 items.index("Syd") # 2 与字符串一样,使用负索引将从末尾开始搜索: items[-1] # True 您还可以使用切片提取列表的一部分: items[0:2] # ["Roger", 1] items[2:] # ["Syd", True] 使用len()全局函数可以获得列表中包含的项数,与我们用于获取字符串长度相同: len(items) # 4 您可以使用列表的append()方法将项添加到列表中: items.append("Test") 或者使用extend()方法: items.extend(["Test"]) 您也可以使用+=运算符: items += ["Test"] 提示:使用extend()或+=时,请不要忘记方括号。不要写成items += "Test"或items....

Python如何檢查一個數字是奇數還是偶數

當一個數字除以2的餘數為0時,該數字是偶數。例如2、4、10、200,000。 奇數除以2的餘數為1,例如1、3、5、15。 你可以使用if條件語句來檢查一個數字是奇數還是偶數: num = 3 if (num % 2) == 0: print('偶數') else: print('奇數') 如果你有一個數字的數組,並且想要獲取其中的偶數或奇數,可以使用filter()函數結合lambda表達式: numbers = [1, 2, 3] even = filter(lambda n: n % 2 == 0, numbers) odd = filter(lambda n: n % 2 == 1, numbers) print(list(even)) # [2] print(list(odd)) # [1, 3]

Python字符串

Python中的字符串是一系列由引号或双引号括起来的字符: "Roger" 'Roger' 你可以将字符串值赋给一个变量: name = "Roger" 你可以使用+运算符连接两个字符串: phrase = "Roger" + " is a good dog" 你可以使用+=来追加字符串: name = "Roger" name += " is a good dog" print(name) # Roger is a good dog 你可以使用str类构造函数将数字转换为字符串: str(8) # "8" 这对于将数字连接到字符串中非常重要: print("Roger is " + str(8) + " years old") # Roger is 8 years old 当使用一组3个引号将字符串括起来时,字符串可以是多行的: print("""Roger is 8 years old """) print(''' Roger is 8 years old ''') 字符串有一组内置方法,例如:...

Python安裝第三方套件使用 `pip`

Python標準函式庫包含了大量的實用工具,可以滿足我們的大部分需求,但並不能滿足所有需求。 這就是為什麼有人和公司會創建套件,並將它們作為開源軟體提供給整個社群。 這些模組都被集中在一個地方,即 Python套件索引,可以在 https://pypi.org 上找到,並且可以使用 pip 安裝在你的系統上。 截至撰寫本文時,有超過 270,000 個套件可供免費使用。 如果你按照Python的安裝說明安裝過程中,你應該已經安裝了 pip。 使用以下命令安裝任何套件: pip install <套件名稱> 如果安裝過程有問題,你也可以通過以下命令執行安裝: python -m pip install <套件名稱> 例如,你可以安裝 requests 套件,這是一個流行的HTTP庫: pip install requests 安裝完成後,它將對所有的Python腳本可用,因為套件是全局安裝的。 具體位置取決於你的操作系統。 在macOS上,執行Python 3.9,位置為 /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages。 使用以下命令將套件升級到最新版本: pip install –U <套件名稱> 使用以下命令安裝特定版本的套件: pip install <套件名稱>==<版本號> 使用以下命令卸載套件: pip uninstall <套件名稱> 使用以下命令顯示已安裝套件的詳細資訊,包括版本、文檔網站和作者資訊: pip show <套件名稱>

Python常量

Python沒有強制變量成為常量的方式。 最接近的方法是使用枚舉(enum): class Constants(Enum): WIDTH = 1024 HEIGHT = 256 然後可以使用例如Constants.WIDTH.value來獲取每個值。 這樣的值是無法重新賦值的。 另外,如果你想依賴命名慣例,可以遵循這個:將永遠不會更改的變量以大寫來聲明: WIDTH = 1024 沒有人會阻止覆蓋這個值,而Python也不會阻止這樣的操作。 這是大部分Python代碼所使用的方式。

Python操作符重載

操作符重載是一種高級技巧,我們可以使用它來使類可比較,並使它們能夠使用Python的操作符。 讓我們來看一個Dog類: class Dog: # Dog類 def __init__(self, name, age): self.name = name self.age = age 讓我們創建2個Dog對象: roger = Dog('Roger', 8) syd = Dog('Syd', 7) 我們可以使用操作符重載來添加一種比較這兩個對象的方式,基於age屬性: class Dog: # Dog類 def __init__(self, name, age): self.name = name self.age = age def __gt__(self, other): return True if self.age > other.age else False 現在,如果你嘗試運行print(roger > syd),你將得到結果True。 同樣地,我們可以定義以下方法: __eq__() 檢查是否相等 __lt__() 檢查一個對象是否比另一個對象小使用 < 操作符 __le__() 小於等於 (<=) __ge__() 大於等於 (>=) __ne__() 不相等 (!=) 然後,您可以定義用於與算術操作進行交互的方法:...

Python數據類型

Python有幾種內置類型。 如果你創建了一個name變量並將其賦值為“Roger”,這個變量將自動表示一個字符串數據類型。 name = "Roger" 你可以使用type()函數檢查變量的類型,將變量作為參數傳入,然後將結果與str進行比較: name = "Roger" type(name) == str #True 或者使用isinstance(): name = "Roger" isinstance(name, str) #True 注意,在Python中查看True值時,除了在REPL中之外,你需要將這段代碼包裹在print()中,但出於清晰起見,我避免使用它。 我們在這裡使用了str類,但對於其他數據類型也同樣有效。 首先,我們有數字。 整數使用int類來表示。 浮點數(小數)的類型是float: age = 1 type(age) == int #True fraction = 0.1 type(fraction) == float #True 你看到了如何從字面值創建一個類型,就像這樣: name = "Flavio" age = 20 Python會自動從值的類型中檢測類型。 你還可以通過使用類的構造函數來創建特定類型的變量,傳入字面值或變量名: name = str("Flavio") anotherName = str(name) 你還可以通過使用類的構造函數來將一種類型轉換為另一種類型。 Python將嘗試確定正確的值,例如從字符串中提取數字: age = int("20") print(age) #20 fraction = 0.1 intFraction = int(fraction) print(intFraction) #0 這稱為類型轉換。當然,這種轉換可能不總是成功,取決於傳遞的值。如果在上述字符串中寫入test而不是20,你將得到一個ValueError: invalid literal for int() with base 10: 'test'錯誤。...

Python物件

在Python中,一切皆為物件。 甚至基本資料型別(整數、字串、浮點數等)的值也都是物件。串列是物件,元組、字典等等都是物件。 物件具有屬性和方法,可以使用點語法來存取它們。 例如,嘗試定義一個新的 int 型別的變數: age = 8 現在,age 可以存取所有 int 物件的屬性和方法。 例如存取該數字的實部和虛部: print(age.real) # 8 print(age.imag) # 0 print(age.bit_length()) # 4 存放串列值的變數則有不同的一組方法: items = [1, 2] items.append(3) items.pop() 方法的可用性取決於值的類型。 Python 提供的 id() 全域函數可讓您檢查特定物件在內存中的位置。 id(age) # 140170065725376 你的記憶體位置將會不同,這只是一個示範 如果將不同的值分配給變數,它的位置將會變化,因為變數的內容已被替換為另一個位於記憶體中的位置的值: age = 8 print(id(age)) # 140535918671808 age = 9 print(id(age)) # 140535918671840 但如果使用物件的方法修改物件,其位置將保持不變: items = [1, 2] print(id(items)) # 140093713593920 items.append(3) print(items) # [1, 2, 3] print(id(items)) # 140093713593920 只有在將變數重新分配給另一個值時,位置才會變化。...

Python註釋

Python是動態型別的語言。我們不需要指定變數、函數參數或函數返回值的型別。 註釋讓我們有了這個選擇。 下面是一個沒有註釋的函數: def increment(n): return n + 1 下面是相同函數帶有註釋的版本: def increment(n: int) -> int: return n + 1 你也可以對變數進行註釋: count: int = 0 Python會忽略這些註釋。一個叫做 mypy 的工具可以獨立運行,或者集成在像 VS Code 或 PyCharm 這樣的IDE中,它可以在你編寫代碼時靜態地自動檢查類型錯誤,幫助你在運行代碼之前捕捉到類型不匹配的錯誤。 當你的軟件變得龐大並且你需要重構代碼時,它將非常有幫助。