Python基礎-24 類型標注

24 類型標注

24.1 Python中的數據類型

? ? 在Python中有很多數據類型,比較常見如下所示:

錫林郭勒盟網站制作公司哪家好,找創(chuàng)新互聯建站!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、響應式網站等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯建站2013年開創(chuàng)至今到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯建站

整型 浮點型 字符串 列表 元組 字典 集合 布爾
int float str list tuple dict set bool

? ? 因Python是弱類型語言,所以在實際寫代碼時,一般不去聲明定義參數的類型。示例如下:

def welcome(city):
   print(f"welcome to {city}")

? ? 以上代碼非常簡單,就是輸出一行歡迎標語。而在大家看到這個代碼,也都默認了city是一個字符串類型(str)。

? ? 現在我們來改造一下代碼,將傳入的city參數全部變?yōu)榇髮懀a如下所示:

def welcome(city):
   print(f"welcome to {city.upper()}")

以上代碼在傳入的city為字符串類型時,一切正常,但如果傳入的是非字符串類型就會報錯,例如傳入123,便會出現如下所示的報錯

AttributeError: 'int' object has no attribute 'upper'

24.2 指定類型

24.2.1 指定變量類型

24.2.1.1 指定變量類型

? ? 針對以上問題,Python 3.5中引入了typing包,推薦使用類型標注,并且IDE會檢查類型,讓Python看起來有點像靜態(tài)語言的感覺。

? ? 那如何指定變量類型呢?只需要在變量名后 :類型 即可,如下所示:

def welcome(city:str):
   print(f"welcome to {city.upper()}")
24.2.1.2 變量類型聲明的好與壞

? ? 變量類型聲明,對于之前有使用過強類型語言的人來講,可能習以為常。但卻對弱類型的語言,可能不太習慣,但確實還是有一些好處的。

  • 以上面代碼為例,如果定義為str類型,而實際傳入為int時,PyCharm會進行相應的提示,不能這樣做,如下所示:
  • PyCharm會有更多提示

? ? 在Python中,str類型的數據會有很多方法,而在指定數據類型后,PyCharm則會有更多提示,如下所示:

  • 閱讀代碼方便,可以更快的知道需要傳入什么類型的數據及返回的數據類型

? ? 在指定變量的數據類型時,也是有一些壞處的,如下所示:

  • 在編寫代碼,需要多寫一些代碼,看起來沒有那么流暢
  • 雖然指定的數據類型,但也僅僅是方便查看,并沒有規(guī)定死變量類型,如指定為str類型,但傳入int,依然可以運行代碼,沒有在運行層面進行檢查

24.2.2 指定返回值類型

? ? 在Python里面,方法/函數都是有返回值的,那么使用類型標的話,可以直接方法/函數末尾冒號之前添加 ->類型,示例如下所示:

def welcome(city:str)->str:
   return city.upper()

? ? 這樣做的好處跟之前示例一樣,IDE可以更加智能提示,防止編寫代碼出錯,如下所示:

? ? 指定類型并不會影響編譯結果,但也有很多好處,如下所示:

  • 提高開發(fā)效率
  • 降低出錯率
  • 閱讀代碼更友好

24.3 typing包

24.3.1 typing作用

? ? 主要作用如下所示:

  • 類型檢查,防止運行時出現參數和返回值類型不符合
  • 做為開發(fā)文檔附加說明,方便調用者快速查看傳入和返回數據類型
  • 加入該模塊后,不影響程序運行,僅有提醒

typing模塊只有在Python 3.5 以上版本中才可以使用,PyCharm支持typing檢查

24.3.2 typing包常見數據類型

類型 備注
int int
str str
List 列表,也可以使用list
List[類型] 指定列表中存放的數據類型
Tuple 元組,也可以使用tuple
Tuple[類型] 指定元組中存放的數據類型
Set 集合,也可以使用set
Set[類型] 指定集合中存放的數據類型
Dict 字典,也可以使用dict
Dict[類型1,類型2] key為類型1,value為類型2的字典
Sequence[類型] 指定序列中存放的數據類型
NoReturn 表示無返回類型
Any 任意類型
TypeVar 自定義兼容特定類型的變量
Union[類型1,類型2] 聯合類型,可以接受類型1或類型2
Optional[類型] 參數可以為空或已經聲明的類型

常見的類型如上表格表示,如果需要使用List,Set,Dict,Union則需要導入typing

from typing import List,Set,Dict

24.3.3 typing包常見數據類型用法

  • List

? ? List:列表,是list的泛型,基本等同于list,其后緊跟一個方括號,里面代表了構成這個列表的元素類型,示例如下所示:

from typing import List

# 基本聲明
listSample:List[int or str]=[1,"Surpass"]
# 嵌套聲明
listSample:List[List[int]]=[[1,2],[3,4]]
  • Tuple

? ? Tuple:元組,是 tuple 的泛型,其后緊跟一個方括號,方括號中按照順序聲明了構成本元組的元素類型,如 Tuple[X, Y] 代表了構成元組的第一個元素是 X 類型,第二個元素是 Y 類型,示例如下所示:

from typing import Tuple

personInfo:Tuple[str,int,float,str]=("Surpass",28,62.33,"Shanghai")
  • Set/AbstractSet

? ? Set(集合)是set 的泛型,AbstractSet是 collections.abc.Set 的泛型。根據官方文檔,Set 推薦用于注解返回類型,AbstractSet 用于注解參數,使用方法是后面跟一個中括號,里面聲明集合中元素的類型,示例如下所示:

from typing import Set,AbstractSet

def SetSample(s:AbstractSet[int]) -> Set[int]:
    return  set(s)
  • Dict/Mapping

? ? Dict(字典)是 dict 的泛型,Mapping(映射)是 collections.abc.Mapping 的泛型。根據官方文檔,Dict推薦用于注解返回類型,Mapping 推薦用于注解參數。使用方法都是其后跟一個中括號,中括號內分別聲明鍵名、鍵值的類型,示例如下所示:

from typing import Dict,Mapping

def DictSample(personInfo:Mapping[str,str])->Dict[str,str]:
    return {"name":personInfo["name"],"location":personInfo["location"]}
  • Sequence

? ? Sequence是 collections.abc.Sequence 的泛型,在某些情況下,我們可能并不需要嚴格區(qū)分一個變量或參數到底是列表類型還是元組類型,則可以使用一個更為泛化的類型,叫做 Sequence,其用法類似于List,示例如下所示:

from typing import Sequence,List

def Square(ele:Sequence[int])->List[int]:
    return [i**2 for i in ele]
  • NoReturn

? ? 當一個方法沒有返回結果時,為了注解它的返回類型,我們可以將其注解為 NoReturn,示例如下所示:

from typing import NoReturn

def hello(word:str)->NoReturn:
    print(word.title())
  • Any

? ? Any是一種特殊的類型,它可以代表所有任意類型,靜態(tài)類型檢查器的所有類型都與 Any 類型兼容,所有的無參數類型注解和返回類型注解的都會默認使用 Any 類型。以下示例兩種是完全等價相同的

from typing import Any

def hello(word):
    return word.title()

def hello(word:Any)->Any:
    return word.title()
  • TypeVar

? ? TypeVar可以用來自定義兼容特定類型的變量,比如有的變量聲明為int、float、str都是符合要求的,實際就是代表任意的數字或者字符串都是可以的,其他的類型則不可以。例如一個人的身高,便可以使用 int 或 float 或 None 來表示,但不能用 dict 來表示,所以可以這么聲明:

from typing import TypeVar

Height=TypeVar(int,float,None)

def getHeight(height)->Height:
    return height
  • NewType

? ? NewType,我們可以借助于其來聲明一些具有特殊含義的類型,如前面Tuple示例,需要用來定義一個Person信息,但從表面上聲明為Tuple不太直觀,因此可以借助NewType來進行聲明。示例如下所示:

from typing import NewType,Tuple

personInfo=NewType("PersonInfo",Tuple[str,int,float,str])

person=personInfo(("Surpass",28,62.33,"Shanghai"))

示例中person就是一個tuple類型,跟其他tuple類型一樣進行操作

  • Union

? ? Union(聯合類型),Union[類型1,類型2] 代表要么是類型1類型,要么是類型2 類型。聯合類型的聯合類型等價于展平后的類型:

Union[Union[int, str], float] == Union[int, str, float]

? ? 僅有一個參數的聯合類型等同于參數自身,示例如下:

Union[int] == int

? ? 如果存在相同類型的時候,則會進行去重處理,示例如下:

Union[int, str, int] == Union[int, str]

? ? 在比較聯合類型的時候,參數順序會被忽略,示例如下:

Union[int, str] == Union[str, int]
from typing import Union

def getType(params:Union[int,str,float])->str:
    if isinstance(params,int):
        return f"{params} type is int"
    elif isinstance(params,float):
        return f"{params} type is float"
    elif isinstance(params,str):
        return f"{params} type is str"
    else:
        return f"{params} type is unknown"
  • Optional

? ? Optional意思是說這個參數可以為空或已經聲明的類型,即 Optional[類型1] 等價于 Union[類型1, None]

需要注意的是這個并不等價于可選參數,當它作為參數類型注解的時候,不代表這個參數可以不傳遞了,而是說這個參數可以傳為 None。

from typing import Optional

def getInfo(data:Optional[int])->Optional[str]:
    if isinstance(data,int):
        return f"INFO - {data} type is int"
    elif data is None:
        return f"WARNING -  {data} type is None"
    else:
        return f"ERROR - {data} type is not int,"

原文地址:https://www.jianshu.com/p/5b135f8dec0d

本文同步在微信訂閱號上發(fā)布,如各位小伙伴們喜歡我的文章,也可以關注我的微信訂閱號:woaitest,或掃描下面的二維碼添加關注:

當前名稱:Python基礎-24 類型標注
路徑分享:http://m.kartarina.com/article38/dsogipp.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站建設網站排名用戶體驗網頁設計公司品牌網站建設微信小程序

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

搜索引擎優(yōu)化
主站蜘蛛池模板: 中文字幕乱码人妻无码久久| 国产精品无码素人福利免费| 日日日日做夜夜夜夜无码| 中文无码人妻有码人妻中文字幕| 亚洲AV无码码潮喷在线观看| 亚洲AV无码片一区二区三区| 亚洲一区精品无码| 午夜无码性爽快影院6080| 亚洲精品中文字幕无码蜜桃| 永久免费无码日韩视频| 久久久久亚洲av无码专区导航 | 亚洲AV成人片无码网站| 中文无码人妻有码人妻中文字幕| 97免费人妻无码视频| 亚洲中文久久精品无码ww16| 亚洲精品人成无码中文毛片| 亚洲a∨无码精品色午夜| 日韩精品无码一区二区三区不卡| 成人A片产无码免费视频在线观看| 国产精品亚洲专区无码牛牛| 亚洲无码一区二区三区| 亚洲成av人片在线观看无码不卡| 国产亚洲精久久久久久无码AV | 无码成人AAAAA毛片| 毛片免费全部播放无码| 国产白丝无码免费视频| 中文无码乱人伦中文视频在线V| 最新亚洲人成无码网站| 67194成l人在线观看线路无码| 无码专区狠狠躁躁天天躁| 在线观看片免费人成视频无码| 国产成年无码AV片在线韩国| 人妻系列无码专区久久五月天 | 亚洲桃色AV无码| 亚洲一区精品无码| 日韩精品无码免费专区午夜不卡| 国产精品无码不卡一区二区三区| 亚洲成?Ⅴ人在线观看无码| 国内精品久久人妻无码不卡| 国产av无码久久精品| 亚洲AV无码专区日韩|