最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的類型提示(Type Hints)總結(jié)

 更新時間:2023年05月31日 14:46:21   作者:落痕的寒假  
Python3.5 版本引入了類型提示(Type Hints),它允許開發(fā)者在代碼中顯式地聲明變量、函數(shù)、方法等的類型信息,下面小編就來帶大家一起看看Python類型提示的初步使用吧

Python3.5 版本引入了類型提示(Type Hints),它允許開發(fā)者在代碼中顯式地聲明變量、函數(shù)、方法等的類型信息。這種類型聲明不會影響 Python 解釋器的運行,但可以讓 IDE 和靜態(tài)分析工具更好地理解代碼,同時提高代碼的可讀性和可維護性。然而,由于 Python 支持動態(tài)類型,類型提示并不能完全確保代碼的正確性。本文僅介紹 Python 類型提示的初步使用。如果需要更詳細的使用說明,請參考以下文章:typing、Python 類型提示簡介Type Hints 入門教程

類型提示的語法格式為:

  • 對于變量:{變量名}:{類型名} =
  • 對于函數(shù)參數(shù):{參數(shù)名}:{類型名} =
  • 對于函數(shù)返回值:->

1.類型提升

類型提示的引入主要有以下幾個方面的用途:

1.提高代碼可讀性

類型提示可以幫助其他開發(fā)人員更好地理解代碼,特別是在處理大型代碼庫時。通過清晰地指定變量、函數(shù)參數(shù)和返回值的數(shù)據(jù)類型,開發(fā)人員可以更快地理解代碼的含義和用途,從而更容易維護和修改代碼。

如下所示。我們有一個名為 add 的函數(shù),用于將兩個數(shù)字相加并返回結(jié)果。以下是該函數(shù)的原始代碼:

def add(a, b):
    return a + b

我們發(fā)現(xiàn),該函數(shù)沒有任何類型提示,因此在調(diào)用該函數(shù)時,我們必須自己去了解和檢查每個參數(shù)的類型。這樣會導致代碼的可讀性和可維護性變差,特別是在代碼規(guī)模較大、涉及多個文件的情況下。為了改善這種情況,我們可以使用類型提示來明確指定每個參數(shù)的類型。以下是添加類型提示后的 add 函數(shù)的代碼:

def add(a: int, b: int) -> int:
    return a + b

現(xiàn)在,我們可以清楚地看到函數(shù) add 的參數(shù)和返回值都是整數(shù)類型。這使得代碼更易于理解,也提高了代碼的可靠性。

2.檢測類型錯誤

Python 是一種動態(tài)語言,因此變量和函數(shù)參數(shù)的類型可以在運行時進行更改。但是,這也意味著開發(fā)人員容易在代碼中引入類型錯誤。通過使用類型提示,開發(fā)人員可以在編譯時檢測到這些類型錯誤,并更早地發(fā)現(xiàn)和修復它們,從而減少代碼錯誤和調(diào)試時間。

mypy是一個用于檢查Python類型的靜態(tài)類型檢查器。它可以檢測類型注釋中的錯誤以及其他類型的錯誤。mypy使用說明可以參考:mypy簡易教程。mypy需要首先輸入以下命令安裝:

pip install mypy

然后,在代碼中標注變量、函數(shù)參數(shù)和返回值的類型。運行以下命令:

mypy your_script.py

在上面的示例中,your_script.py是要檢查的Python腳本。運行mypy工具后,它將檢查Python腳本中的類型錯誤,并輸出錯誤信息。

3.提供自動補全和文檔

許多集成開發(fā)環(huán)境(IDE)和編輯器都可以使用類型提示來提供自動補全和代碼文檔。這可以幫助開發(fā)人員更快地編寫代碼,并提供關(guān)于函數(shù)參數(shù)和返回值的信息,以便更好地理解代碼。要使用Python類型提示提供自動補全和文檔,需要使用一個支持該功能的Python編輯器。比如一些流行的Python編輯器包括vscode、PyCharm和Sublime Text等。

以vscode為例,考慮一個整數(shù)相加函數(shù),將結(jié)果保存在變量c中。如果加上類型提示,vscode插件將推斷變量c的類型為 int,并提供代碼補全和代碼提示等功能。

此外,還可以使用vscode的autoDocstring生成帶有類型提示的文檔和注釋。

autoDocstring注釋代碼使用方法如下所示:

按照以上方法,對于有無類型提示的注釋結(jié)果如下:

def add(a, b):
    """_summary_
    Args:
        a (_type_): _description_
        b (_type_): _description_
    Returns:
        _type_: _description_
    """
    c = a + b
    return c
def add(a: int, b: int) -> int:
    """_summary_
    Args:
        a (int): _description_
        b (int): _description_
    Returns:
        int: _description_
    """
    c = a + b
    return c

2.類型聲明

2.1基本類型

對于Python的內(nèi)置基本類型 int、float、str 和 byte等,可以直接使用類型本身進行類型提示。如下所示:

# 直接定義
age: int = 1
# 聲明后定義
num: float
num = 2.0
def greet(name: str) -> str:
    return f"Hello, {name}!"
def is_even(x: int) -> bool:
    return x % 2 == 0
def encode_data(data: str) -> bytes:
    return data.encode('utf-8')

2.2嵌套類型

對于容器數(shù)據(jù)結(jié)構(gòu),例如 list、tuple、dict 等,也可以直接使用類型本身進行類型提示。如下所示:

items: list = [1, 4.0, "3"]
info: dict = {"name":"john", "age":24}

在Python的容器數(shù)據(jù)結(jié)構(gòu)中,每個元素都具有其自己的類型。雖然這種方法提供了靈活性,但是內(nèi)部元素的類型無法受到限制,因此內(nèi)部元素可以是任何類型(Any)??梢酝ㄟ^Python的typing標準庫來聲明這些類型及其元素類型。

from typing import List, Tuple, Dict, Set
# 指定my_list變量是一個整數(shù)列表
my_list: List[int] = [1, 2, 3, 4]
# 指定my_tuple變量應該是一個按順序包含整數(shù)、字符串和布爾值的元組
my_tuple: Tuple[int, str, bool] = (1, "hello", True)
# 指定了my_dict變量是一個所有鍵為str類型,所有值為int類型的字典
my_dict: Dict[str, int] = {"apple": 1, "banana": 2, "orange": 3}
# 指定了my_set變量應該是一個浮點數(shù)集合
my_set: Set[float] = {1.0, 2.0, 3.0}

2.3自定義類型

Python也支持對自定義類進行類型提示。下面是一個自定義類的類型提示示例:

class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age
def say_hello(person: Person) -> str:
    return f"Hello, {person.name}!"

在上面的代碼中,我們定義了一個 Person 類,它有兩個屬性:name 和 age。在初始函數(shù)中,我們使用類型提示指定了這兩個屬性的類型。接下來,我們定義了一個 say_hello 函數(shù),這個函數(shù)的參數(shù)是一個 Person 類型的對象,并且返回值是一個字符串。

對于numpy和pandas這種第三方庫,也可以通過同樣的方法進行類型提示:

import numpy as np
import pandas as pd
import cv2
# numpy
def add_arrays(a: np.ndarray, b: np.ndarray) -> np.ndarray:
    return np.add(a, b)
# pandas
def filter_dataframe(df: pd.DataFrame, column: str, value: float) -> pd.DataFrame:
    return df[df[column] > value]
# opencv,opencv圖像本身就是一個numpy數(shù)組結(jié)構(gòu)
def resize_image(img: np.ndarray, height: int, width: int) -> np.ndarray:
    return cv2.resize(img, (width, height))

2.4復合類型

2.4.1 Union和Optional

Python的typing庫也提供了Union類型用于表示多種類型中的一種,Optional類型用于表示可選類型。它們可以結(jié)合使用,以便更好地表示變量的類型。

例如,如果一個變量可以是整數(shù)或字符串類型,那么可以這樣定義它的類型:

from typing import Union
def func(x: Union[int, str]) -> None:
    pass

上面的代碼中,x的類型為Union[int, str],表示x可以是整數(shù)或字符串類型。

如果一個變量可以是整數(shù)類型或None類型,那么可以這樣定義它的類型:

from typing import Optional
def func(x: Optional[int] = None) -> None:
    pass

Union和Optional類型可以結(jié)合使用。例如,如果一個變量可以是整數(shù)類型、字符串類型或None類型,那么可以這樣定義它的類型:

from typing import Optional, Union
def func(x: Optional[Union[int, str]]) -> None:
    pass

上面的代碼中,x的類型為Optional[Union[int, str]],表示x可以是整數(shù)類型、字符串類型或None類型。

此外,在Python中,Union[X, Y] 表示變量的類型可以是 X 或 Y。因此,Optional[X] 實際上是 Union[X, None] 的簡寫形式。這種語法的好處是它可以使代碼更簡潔,因為我們只需要寫一個類型而不是兩個。

from typing import Optional, Union
def greet(name: Optional[str]) -> str:
    if name is None:
        return "Hello, stranger!"
    else:
        return f"Hello, {name}!"
def greet2(name: Union[str, None]) -> str:
    if name is None:
        return "Hello, stranger!"
    else:
        return f"Hello, {name}!"

在上面代碼中,greet和greets函數(shù)是等價的。在第一個函數(shù)中,我們使用了 Optional[str] 來表示 name 可以是一個字符串或者是 None。在第二個函數(shù)中,我們使用了 Union[str, None] 來達到相同的效果。

2.4.2 Generator和Iterator

在Python中,Generator和Iterator是非常常見的數(shù)據(jù)類型。Generator是一種函數(shù),可以通過yield語句生成一個迭代器,而Iterator是一種對象,可以用于迭代元素序列。為了提高代碼的可讀性和可維護性,我們可以使用類型提示來指定Generator和Iterator的類型。

Generator類型提示使用Generator[ReturnType, SendType, ReturnType]語法,其中ReturnType指定返回值類型,SendType指定發(fā)送值類型,ReturnType指定生成器的類型。例如,下面是一個簡單的Generator類型提示示例:

from typing import Generator
def even_numbers(n: int) -> Generator[int, None, None]:
    for i in range(n):
        if i % 2 == 0:
            yield i

上面的代碼中,even_numbers是一個Generator函數(shù),返回類型是Generator[int, None, None],該函數(shù)生成一個整數(shù)序列,其中每個偶數(shù)都是通過yield語句生成的。

Iterator類型提示使用Iterator[ElementType]語法,其中ElementType指定迭代器元素類型。例如,下面是一個簡單的Iterator類型提示示例:

from typing import Iterator
class MyIterator:
    def __init__(self):
        self.current: int = 0
        self.max: int = 5
    def __iter__(self) -> Iterator[int]:
        return self
    def __next__(self) -> int:
        if self.current >= self.max:
            raise StopIteration
        else:
            self.current += 1
            return self.current

在上面的代碼中,我們對MyIterator類進行了注釋。使用了typing模塊中的Iterator類來注釋__iter__()方法的返回值類型。同時,我們對current和max屬性也進行了注釋,指定了它們的類型為int。在__next__()方法中,我們指定了返回值類型為int。

2.4.3 Callable

Callable類型提示用于表示一個可調(diào)用對象,例如函數(shù)、類或?qū)ο蟮?。從形式上來看,Callable類型提示接受兩個或三個類型提示參數(shù):第一個參數(shù)表示函數(shù)的參數(shù)類型,第二個參數(shù)表示函數(shù)的返回類型。下面是一個Callable類型提示的例子:

from typing import Callable
def apply(func: Callable[[int, int], int], a: int, b: int) -> int:
    return func(a, b)
def add(a: int, b: int) -> int:
    return a + b
result = apply(add, 3, 4)
print(result) # 輸出7

在上面的例子中,apply函數(shù)接受一個名為func的參數(shù),該參數(shù)是一個Callable類型,它指定了函數(shù)的兩個整數(shù)參數(shù)和一個整數(shù)返回值。add函數(shù)滿足這個條件,因此可以傳遞給apply函數(shù),它會返回add(3, 4)的結(jié)果7。

2.4.4 Any和NoReturn

Any類型表示一個任意類型,它可以用于函數(shù)參數(shù)、函數(shù)返回值和變量等。使用Any類型時,我們可以省略類型注釋,使變量類型更加靈活。下面是一個使用Any類型的例子:

from typing import Any
def print_value(value: Any) -> None:
    print(value)
print_value("Hello World")  # 輸出 "Hello World"
print_value(123)           # 輸出 123

在上面的例子中,我們定義了一個print_value函數(shù),它接受一個任意類型的參數(shù)value,并將其打印出來。我們可以看到,我們可以將任何類型的值傳遞給print_value函數(shù),包括字符串和整數(shù)。這使得我們的代碼更加靈活。

NoReturn類型表示函數(shù)不會返回任何值。這個類型通常用于標識那些沒有返回值的函數(shù)。下面是一個使用NoReturn類型的例子:

from typing import NoReturn
def print_message(message: str) -> NoReturn:
    print(message)
    raise Exception("Error occurred")
print_message("Hello World")  # 輸出 "Hello World",然后拋出異常

在上面的例子中,我們定義了一個print_message函數(shù),它接受一個字符串類型的參數(shù)message,并將其打印出來。然后,我們手動拋出了一個異常,這意味著函數(shù)不會返回任何值。我們可以使用NoReturn類型來明確地表示這一點。

2.4.5 其他

Python還支持更高級的類型提示。例如,可以使用Sequence來指定一個列表,使用TypedDict來指定一個帶有特定鍵和值類型的字典。此外,Python還支持Literal類型提示,可以限制變量只能取特定的常量值。最近,Python3.8版本還增加了Protocol類型提示,允許指定類需要實現(xiàn)哪些方法和屬性。這些類型提示用的不多,但是如果需要更精細的類型控制,可以參考官方文檔:typing

2.5類型提示的別名

在類型提示中使用了過于復雜的類型,可以考慮將其定義為一個類型別名,然后在函數(shù)參數(shù)、返回值等處使用該類型別名。例如,如果你需要傳遞一個包含多個字段的字典作為函數(shù)參數(shù),你可以使用Dict[str, Union[int, str, List[int]]]來表示該字典的類型。但是,這個類型過于復雜,不易于理解。你可以將其定義為一個類型別名,如下所示:

from typing import Dict, Union, List
MyDict = Dict[str, Union[int, str, List[int]]]
def my_function(my_dict: MyDict) -> int:
    # Function body
    return 1

這樣,你就可以在函數(shù)參數(shù)、返回值等處使用MyDict這個類型別名,使代碼更加易讀、易懂。

到此這篇關(guān)于Python中的類型提示(Type Hints)總結(jié)的文章就介紹到這了,更多相關(guān)Python類型提示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決Python3.8用pip安裝turtle-0.0.2出現(xiàn)錯誤問題

    解決Python3.8用pip安裝turtle-0.0.2出現(xiàn)錯誤問題

    turtle庫是python的基礎繪圖庫,這個庫被介紹為一個最常用的用來給孩子們介紹編程知識的方法庫,這篇文章主要介紹了解決Python3.8用pip安裝turtle-0.0.2出現(xiàn)錯誤問題,需要的朋友可以參考下
    2020-02-02
  • Python實現(xiàn)捕獲異常發(fā)生的文件和具體行數(shù)

    Python實現(xiàn)捕獲異常發(fā)生的文件和具體行數(shù)

    這篇文章主要介紹了Python實現(xiàn)捕獲異常發(fā)生的文件和具體行數(shù)。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python基本數(shù)據(jù)類型及內(nèi)置方法

    Python基本數(shù)據(jù)類型及內(nèi)置方法

    這篇文章主要介紹了Python基本數(shù)據(jù)類型及內(nèi)置方法,??數(shù)據(jù)類型是用來記錄事物狀態(tài)的,而事物的狀態(tài)是不斷變化的,下文圍繞主題展開相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • python中List的sort方法指南

    python中List的sort方法指南

    我們需要對List進行排序,Python提供了兩個方法:1.用List的成員函數(shù)sort進行排序;2.用built-in函數(shù)sorted進行排序,今天我們就來探討下這2個方法
    2014-09-09
  • python第三方庫visdom的使用入門教程

    python第三方庫visdom的使用入門教程

    Visdom:一個靈活的可視化工具,可用來對于 實時,富數(shù)據(jù)的 創(chuàng)建,組織和共享,本文主要介紹了python第三方庫visdom的使用入門教程,分享給大家,感興趣的可以了解一下
    2021-05-05
  • 使用Pytorch實現(xiàn)two-head(多輸出)模型的操作

    使用Pytorch實現(xiàn)two-head(多輸出)模型的操作

    這篇文章主要介紹了使用Pytorch實現(xiàn)two-head(多輸出)模型的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python基于jieba分詞實現(xiàn)snownlp情感分析

    Python基于jieba分詞實現(xiàn)snownlp情感分析

    情感分析(sentiment analysis)是2018年公布的計算機科學技術(shù)名詞,它可以根據(jù)文本內(nèi)容判斷出所代表的含義是積極的還是負面的等。本文將通過jieba分詞實現(xiàn)snownlp情感分析,感興趣的可以了解一下
    2023-01-01
  • Python如何使用cv2.canny進行圖像邊緣檢測

    Python如何使用cv2.canny進行圖像邊緣檢測

    這篇文章主要介紹了Python如何使用cv2.canny進行圖像邊緣檢測問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python3+selenium實現(xiàn)cookie免密登錄的示例代碼

    Python3+selenium實現(xiàn)cookie免密登錄的示例代碼

    這篇文章主要介紹了Python3+selenium實現(xiàn)cookie免密登錄的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Python3中FuzzyWuzzy庫實例用法

    Python3中FuzzyWuzzy庫實例用法

    在本篇文章中小編給各位整理了關(guān)于Python3z中FuzzyWuzzy庫實例用法及相關(guān)代碼,有興趣的朋友們可以參考下。
    2020-11-11

最新評論

柳州市| 鄂温| 木兰县| 麻阳| 略阳县| 永济市| 杭州市| 电白县| 双桥区| 兴义市| 盈江县| 关岭| 临城县| 泉州市| 花垣县| 叙永县| 当雄县| 名山县| 湘阴县| 登封市| 施甸县| 通辽市| 西安市| 奇台县| 丰原市| 阿巴嘎旗| 金平| 云梦县| 保定市| 应城市| 达拉特旗| 大城县| 镇安县| 金平| 静宁县| 尉犁县| 桦川县| 西吉县| 新安县| 古浪县| 南昌县|