日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python中类型最佳判断方法

發布時間:2025/3/20 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中类型最佳判断方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python在定義變量的時候不用指明具體的的類型,解釋器會在運行的時候會自動檢查變量的類型,并根據需要進行隱式的類型轉化,因為Python是動態語言,所以一般情況下是不推薦進行類型轉化的。

比如進行"+"操作時,如果加號兩邊是數據就進行加法操作,如果兩邊是字符串就進行字符串連接操作,如果兩邊是列表就進行合并操作,甚至可以進行復數的運算。

解釋器會在運行時根據兩邊的變量的類型調用不同的內部方法。當加號兩邊的變量類型不一樣的時候,又不能進行類型轉化,就會拋出TypeError的異常。

types模塊從Python2到Python3的變化

在實際的開發中,為了提高代碼的健壯性,我們還是需要進行類型檢查的。而進行類型檢查首先想到的就是用types(),比如使用types判斷一個int類型:

Source Code:

#!/usr/bin/env python2.6 #Author: nock.chen from types import * mylist = ['nock', 100, '100', 'IT']def delete(mylist, item): if type(item) is IntType:mylist.remove(item)delete(mylist, 100) print(mylist) 復制代碼

Result:

['nock', '100', 'IT'] 復制代碼

我們在types模塊中可以找到一些常用的類型,在2.6.9中顯示的結果:

types.BooleanType # bool類型 types.BufferType # buffer類型 types.BuiltinFunctionType # 內建函數,比如len() types.BuiltinMethodType # 內建方法,指的是類中的方法 types.ClassType # 類類型 types.CodeType # 代碼塊類型 types.ComplexType # 復數類型 types.DictProxyType # 字典代理類型 types.DictType # 字典類型 types.DictionaryType # 字典備用的類型 types.EllipsisType # Ellipsis類型 types.FileType # 文件類型 types.FloatType # 浮點類型 types.FrameType # 框架對象的類型 types.FunctionType # 函數類型 types.GeneratorType # 通過調用生成器函數生成的generator-iterator對象類型 types.GetSetDescriptorType # 用PyGetSetDef(如FrameType)在擴展模塊中定義的對象的類型 types.InstanceType # 實例類型 types.IntType # int類型 types.LambdaType # lambda類型 types.ListType # 列表類型 types.LongType # long類型 types.MemberDescriptorType # 在擴展模塊中定義的對象類型,包括PyMemberDef,如datetime.timedelta.days types.MethodType # 方法類型 types.ModuleType # module類型 types.NoneType # None類型 types.NotImplementedType # NotImplemented的類型 types.ObjectType # object類型 types.SliceType # slice()返回的對象類型 types.StringType # 字符串類型 types.StringTypes # 一個包含StringType和UnicodeType的序列,用于方便對任何字符串對象進行檢查。 types.TracebackType # 在sys.exc_traceback中發現的traceback對象的類型。 types.TupleType # 元組類型 types.TypeType # 類型本身 types.UnboundMethodType # 另一個名字for MethodType types.UnicodeType # Unicode字符字符串的類型(例如,u ' spam) types.XRangeType # xrange()返回的范圍對象的類型 復制代碼

官網介紹:https://docs.python.org/2/library/types.html

到了Python3版本,types模塊方法已經明顯減少了很多,具體如下:

types.BuiltinFunctionType types.BuiltinMethodType # 內置函數的類型,如len()或sys.exit(),以及內置類的方法。(這里,“內置”的意思是“用C寫”。) types.CodeType # 通過compile()返回的代碼對象類型。 types.DynamicClassAttribute types.FrameType # 框架對象的類型,如在tb中發現的。tb_frame如果tb是一個traceback對象。 types.FunctionType types.GeneratorType # 由生成器函數創建的generator - iterator對象類型。 types.GetSetDescriptorType # 用PyGetSetDef(如FrameType)在擴展模塊中定義的對象的類型。 types.LambdaType # 由lambda表達式創建的用戶定義函數和函數的類型。 types.MappingProxyType types.MemberDescriptorType types.MethodType # 用戶定義類實例的方法類型。 types.ModuleType types.SimpleNamespace types.TracebackType # traceback對象的類型,如sys.exc_info() types.new_class types.prepare_class 復制代碼

官網介紹:https://docs.python.org/3/library/types.html#module-types

不推薦使用type檢查類型

從上面的Python2到Python3的版本升級過程中,types模塊方法有所減少。如果使用type方法也會存在如下問題:

如上所示說明i和n的類型是不一樣的,而實際上UserInt是繼承int的,所以這個判斷是存在問題的,當我們對Python內建類型進行擴展的時候,type返回的結果就不夠準確了。我們再看一個例子:

type比較的結果a和b的類型是一樣的,結果明顯是不準確的。這種古典類的實例,type返回的結果都是一樣的,而這樣的結果不是我們想要的。對于內建的基本類型來說,使用tpye來檢查是沒有問題的, 可是當應用到其他場合的時候,type就顯得不可靠了。

這個時候我們就需要使用內置函數isinstance來進行類型檢查,示例如下:

isinstance(object, class_or_type_or_tuple) 復制代碼

object表示對象,classinfo可以是直接或間接類名、基本類型或者有它們組成的元組。

nock:ucode nock$ python3 Python 3.5.1 (default, Dec 26 2015, 18:08:53) [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> isinstance(2, float) False >>> isinstance(2, int) True >>> isinstance((2, 3), list) False >>> isinstance((2, 3), tuple) True >>> isinstance({'name': 'nock'}, tuple) False >>> isinstance({'name': 'nock'}, dict) True >>> isinstance([1, 100, 101], (str, list, tuple)) True >>> isinstance(2 ** 31, dict) False >>> isinstance(2 ** 31, long) Traceback (most recent call last):File "<stdin>", line 1, in <module> NameError: name 'long' is not defined >>> isinstance(2 ** 31, int) True 復制代碼

Python2有為非浮點數準備的int和long類型。int類型的最大值不能超過sys.maxint,而且這個最大值是平臺相關的。可以通過在數字的末尾附上一個L來定義長整型,顯然,它比int類型表示的數字范圍更大。在Python3里,只有一種整數類型int,大多數情況下,它很像Python2里的長整型。由于已經不存在兩種類型的整數,所以就沒有必要使用特殊的語法去區別他們, 進一步閱讀:PEP 237。

最后在Python中類型的判斷你最好的方法是利用內置函數isinstance完成是最佳體驗。

官網介紹:https://docs.python.org/3/library/functions.html#isinstance

總結

以上是生活随笔為你收集整理的Python中类型最佳判断方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。