Python基礎-24 類型標註

来源:https://www.cnblogs.com/surpassme/archive/2022/08/03/16545609.html
-Advertisement-
Play Games

24 類型標註 24.1 Python中的數據類型 在Python中有很多數據類型,比較常見如下所示: |整型 | 浮點型|字元串 | 列表|元組|字典|集合|布爾| | | | | | | | | | |int| float|str|list|tuple|dict|set|bool| 因Pytho ...


24 類型標註

24.1 Python中的數據類型

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

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

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

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

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

    現在我們來改造一下代碼,將傳入的city參數全部變為大寫,代碼如下所示:

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看起來有點像靜態語言的感覺。

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

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

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

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

  • PyCharm會有更多提示

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

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

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

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

24.2.2 指定返回值類型

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

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

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

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

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

24.3 typing包

24.3.1 typing作用

    主要作用如下所示:

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

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 的泛型,在某些情況下,我們可能並不需要嚴格區分一個變數或參數到底是列表類型還是元組類型,則可以使用一個更為泛化的類型,叫做 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是一種特殊的類型,它可以代表所有任意類型,靜態類型檢查器的所有類型都與 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

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

作者: Surpassme

來源: http://www.jianshu.com/u/28161b7c9995/

         http://www.cnblogs.com/surpassme/

聲明:本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接 ,否則保留追究法律責任的權利。如有問題,可發送郵件 聯繫。讓我們尊重原創者版權,共同營造良好的IT朋友圈。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Date日期 日期對象的定義(使用new關鍵詞) 1.獲取當前的時間(本地的時間) var date = new Date() //不傳參就是獲取當前時間 2.獲取指定的時間 var date = new Date(123456) //一個參數毫秒值 將這個毫秒值去加上對應的1970.1.1 0:0 ...
  • 今天在做css定位的時候遇到一個問題,我想用fixed定位下來,但是發現這個時候定義的百分百寬度不隨著父元素走了而是整個屏幕的百分百,這個就很尷尬了,也不能固定寬度吧,畢竟還要寬度自適應。 這個時候發現了一個position的屬性 sticky 它是relative和fixed的結合體可以理解為,當 ...
  • 最近,在對公司的一個老項目進行優化調整。有個使用的三方插件報表頁面,一旦查詢時間過長就會自動異常並使瀏覽器崩潰,由於這個插件只有個前人遺留的dll文件,實在看不懂裡面的代碼無從下手,既然項目前端大部分是基於EasyUI做的,想著就直接用EasyUI的DataGrid做數據報表明細展示。 由於之前很少 ...
  • 網頁是一個頁面,網站是由多個網頁組成的! 我們在使用代碼編寫的時候能看到這樣的東西,具體內容如下,比較基礎: 認識SEO? SEO就是搜索引擎優化,作用就是你找查找相關內容時,能夠優先給你展示這個內容。 SEO三大標簽(一般由想乾人員提供): title(網頁標簽)、description(網頁描述 ...
  • 項目背景 我們的系統(一個 ToB 的 Web 單頁應用)前端單頁應用經過多年的迭代,目前已經累積有大幾十萬行的業務代碼,30+ 路由模塊,整體的代碼量和複雜度還是比較高的。 項目整體是基於 Vue + TypeScirpt,而構建工具,由於最早項目是經由 vue-cli 初始化而來,所以自然而然使 ...
  • 什麼時候精靈圖呢? 通常在渲染頁面的時候,需要伺服器向我們發送數據,但有的時候一個頁面需要多張圖時,伺服器就會處於連續發圖的工作狀態,但如果我們把需要的圖都放在一張圖上,這樣可以大大的減少服務的工作負擔,打個比喻。伺服器發一張圖是,工作流程是:找到圖片——讀取圖片——發送圖片,如果是發送5個圖片時, ...
  • 蒼穹之邊,浩瀚之摯,眰恦之美; 悟心悟性,善始善終,惟善惟道! —— 朝槿《朝槿兮年說》 寫在開頭 我們都知道,經過多年的發展和無數Java開發者的不懈努力,Java已經由一門單純的電腦編程語言,逐漸演變成一套強大的以及仍在可持續發展中的技術體系平臺。 雖然,Java設計者們根據不同的技術規範,把 ...
  • 1. 登錄用戶數據獲取 登錄成功之後,在後續的業務邏輯中,開發者可能還需要獲取登錄成功的用戶對象,如果不使用任何安全管理框架,那麼可以將用戶信息保存在HttpSession中,以後需要的時候直接從HttpSession中獲取數據。在Spring Security中,用戶登錄信息本質上還是保存在 Ht ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...