[Python][微進階]型別提示 type hint

更新於 發佈於 閱讀時間約 5 分鐘

在程式開發中,協作合作專案時,利用type hint,可以快速知道函式輸入及輸出的資料型別在後續的維護時也會更加方便及可讀

Type hintsPython 3.5 版本引入的功能,它允許在函數宣告中指定參數和傳回值的類型。Type hints 是一種可選的註解形式,不會影響程式碼的運行,但可以提供給IDE靜態類型檢查工具其他開發者更多的信息,以提高程式碼可讀性可維護性


基本的Python Type hints 範例:

在函式參數和傳回值中使用Type hints:

基本數值型態:

def add_numbers(x: int, y: float) -> float:
return x + y

在這個例子中,x 是一個整數,y 是一個浮點數,而函式的傳回類型被註釋為 float

字串型態:

def merge_strings(str1: str, str2: str) -> str:
return str1 + str2

在這個例子中,str1str2 都是字串,而函數的傳回類型也是字串。

布林型態:

def is_positive(number: int) -> bool:
return number > 0

在這個例子中,number 是一個整數,而函數的傳回類型被註釋為 bool

使用 Any 作為函數參數或返回值的型別:

在型別提示(Type hint)中,Any 是一個特殊的型別,表示任意類型。

當你不確定一個變數的確切型別時,可以使用 Any。但要注意,使用 Any 會失去靜態型別檢查的優勢。

from typing import Any

def process_data(data: Any) -> Any:
# 執行一些處理操作
return data

result: Any = process_data("Hello, World!")
print(result)

在這個例子中,data: Any 表示 process_data 函數的參數 data 可以是任意型別,而 -> Any 表示該函數返回的結果也可以是任意型別。


使用 -> None 來表示一個函數沒有返回任何值:

使用 -> None 的情況通常包括:

  • 函式的主要目的是通過副作用改變程式狀態,而不是返回值。
  • 函式執行某些操作,但這些操作的結果不需要返回。
def log_message(message: str) -> None:
# 將消息記錄到日誌或執行其他操作
print(f"Log: {message}")

# 呼叫函數
log_message("This is a log message")

在這個例子中,-> None 表示 log_message 函式不會返回任何值,即它是一個沒有返回值的函式。


Python 3.9 以下

列表型態:

使用 typing 模組的 List 進行表達:

from typing import List

def process_numbers(numbers: List[int]) -> List[float]:
return [float(num) for num in numbers]

在這個例子中,numbers 是一個整數列表,而函數的傳回類型是一個浮點數列表。

字典型態:

使用 typing 模組的 Dict進行表達:

from typing import Dict

def create_person(name: str, age: int) -> Dict[str, Union[str, int]]:
return {'name': name, 'age': age}

在這個例子中,create_person 函數的傳回類型是一個包含字串鍵和混合字串、整數值的字典。

元組型態:

使用 typing 模組的 Tuple進行表達:

from typing import Tuple

def split_name(full_name: str) -> Tuple[str, str]:
first, last = full_name.split()
return first, last

這個例子中,split_name 函數的傳回類型是一個包含兩個字串的元組。

這些 Type hints 可以在開發過程中提供更多的資訊。


可以使用 NumPy 提供的 ndarray 類型進行型別註釋ndarrayNumPy 中用於表示多維數組的類型。

NumPy 的 ndarray 進行型別註釋的例子:

import numpy as np

def process_array(arr: np.ndarray) -> np.ndarray:
result = arr * 2
return result

# 創建一個 NumPy 數組
input_array = np.array([1, 2, 3])

# 呼叫函數
output_array = process_array(input_array)

print(output_array)

在這個例子中,arr: np.ndarray 表示 process_array 函數的參數 arr 的型別是 NumPy 的 ndarray

同樣地,-> np.ndarray 表示該函數將返回一個 NumPy 的 ndarray

使用 np.ndarray 這樣的型別提示可以讓代碼更清晰地表達預期的數據結構


參考文獻






avatar-img
135會員
224內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言
avatar-img
留言分享你的想法!
螃蟹_crab的沙龍 的其他內容
在實務上,條碼槍傳送的資訊可能包含不可見字符或控制字符。這可能是因為條碼槍在傳送條碼數據時使用了一些特殊字符,這些字符在可見字符集合之外,例如 \x06 就是 ASCII 中的 "ACK" 控制字符。 本文將探討,如何查詢及處理這些特殊字符。
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
在實務上,條碼槍傳送的資訊可能包含不可見字符或控制字符。這可能是因為條碼槍在傳送條碼數據時使用了一些特殊字符,這些字符在可見字符集合之外,例如 \x06 就是 ASCII 中的 "ACK" 控制字符。 本文將探討,如何查詢及處理這些特殊字符。
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
你可能也想看
Google News 追蹤
Thumbnail
全方位分析脫離繼承戰的方法,大膽猜測誰會成為卡丁國下一任國王。
在現代的軟體開發中,序列化(Serialization)與反序列化(Deserialization)是不可或缺的技術。這些操作廣泛用於資料存儲、網路傳輸以及跨平台的數據交換。Python 提供了多種工具和庫來實現這些功能,例如 pickle、json 和 yaml 等。
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
ITS python認證內容含蓋六大主題
有時候在使用數學運算時,會出現一些看似反直覺的結果。 這些錯誤可能是由於我們對於數學規則的誤解或者忽略了一些細節所導致的。 以下是一些 Python 的例子: 除餘數 例如負數求餘數。 假設-15 % 90 狀況下 會下意思覺得結果還是 -15 但輸出的結果是 75。
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
f字符串(f-string)在Python 3.6版本引入了新特性,可以更方便地格式化字符串。本文介紹了f-string的基本使用方法,以及表達式、運算符、格式化控制、字典和列表的應用,以及調用方法和函數等。f-string提供了一種更靈活的方式,使你能夠控制字符串的外觀,以滿足不同情況下的需求。
Thumbnail
全方位分析脫離繼承戰的方法,大膽猜測誰會成為卡丁國下一任國王。
在現代的軟體開發中,序列化(Serialization)與反序列化(Deserialization)是不可或缺的技術。這些操作廣泛用於資料存儲、網路傳輸以及跨平台的數據交換。Python 提供了多種工具和庫來實現這些功能,例如 pickle、json 和 yaml 等。
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
ITS python認證內容含蓋六大主題
有時候在使用數學運算時,會出現一些看似反直覺的結果。 這些錯誤可能是由於我們對於數學規則的誤解或者忽略了一些細節所導致的。 以下是一些 Python 的例子: 除餘數 例如負數求餘數。 假設-15 % 90 狀況下 會下意思覺得結果還是 -15 但輸出的結果是 75。
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
f字符串(f-string)在Python 3.6版本引入了新特性,可以更方便地格式化字符串。本文介紹了f-string的基本使用方法,以及表達式、運算符、格式化控制、字典和列表的應用,以及調用方法和函數等。f-string提供了一種更靈活的方式,使你能夠控制字符串的外觀,以滿足不同情況下的需求。