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有为非浮点数准备的intlong类型。int类型的最大值不能超过sys.maxint,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。在Python3里,只有一种整数类型int,大多数情况下,它很像Python2里的长整型。由于已经不存在两种类型的整数,所以就没有必要使用特殊的语法去区别他们, 进一步阅读:PEP 237。

最后在Python中类型的判断你最好的方法是利用内置函数isinstance完成是最佳体验。

官网介绍:https://docs.python.org/3/library/functions.html#isinstance

Python中类型最佳判断方法相关推荐

  1. python中none算变量吗_在python中对变量判断是否为None的三种方法总结

    三种主要的写法有: 第一种:if X is None; 第二种:if not X: 当X为None,  False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()这 ...

  2. python中getitem_解析Python中的__getitem__专有方法

    __getitem__来看个简单的例子就明白: def __getitem__(self, key): return self.data[key] >>> f = fileinfo. ...

  3. python中类方法与实例方法的区别-Python中的对象,方法,类,实例,函数用法分析...

    本文实例分析了Python中的对象,方法,类,实例,函数用法.分享给大家供大家参考.具体分析如下: Python是一个完全面向对象的语言.不仅实例是对象,类,函数,方法也都是对象. class Foo ...

  4. python grpc 并发_在Python中使用gRPC的方法示例【h】

    本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下: 使用Protocol Buffers的跨平台RPC系统. 安装 使用 pip gRPC由两个部分构成,grpcio 和 gRP ...

  5. python中列表的sort方法_python中列表的sort方法使用详解

    内容简介:python中列表的sort方法使用详解 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. 排序,数字.字符 ...

  6. python中立方表示_在Python中表示一个对象的方法

    在 Python 中一切都是对象.如果要在 Python 中表示一个对象,除了定义 class 外还有哪些方式呢?我们今天就来盘点一下. 0x00 dict 字典或映射存储 KV 键值对,它对查找.插 ...

  7. python中使用grpc方法示例_在Python中使用gRPC的方法示例

    本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下: 使用Protocol Buffers的跨平台RPC系统. 安装 使用 pip pip install grpcio pip i ...

  8. python中字典的查询方法

    python中字典的查询方法包括: 1.直接用key查询,例如dict[key] 返回的就是这个key值对应的value值,如果没有这个key值,则会报错 2.用内置函数items() 返回的就是每一 ...

  9. python中定义数组的方法

    数组:数组(Array)是一种线性表数据结构.它用一组连续的内存空间,存储一组具有相同类型的数据. 注:Python中没有数组的数据结构,所以采用列表来表示数组这种数据结构 举个例子: a = [1, ...

最新文章

  1. Zip Slip目录遍历漏洞已影响多个Java项目
  2. python文件命名可以用中文吗-已经十多年了!你知道 Python 可以用中文命名变量吗?...
  3. 在浙学计算机基础2020答案,浙江大学2020年硕士研究生复试分数线的基本要求
  4. asp.net 页面之间跳转的几种方法及区别(转)
  5. UPS技术培训系统方案
  6. 距离剩者为王,服饰企业还要跨过很多道坎
  7. java重新初始化吗_Java中为何已经重新赋值的变量在输出后会初始化?
  8. 性能测试十四:Xshell链接linux虚拟机
  9. [vue] watch的属性用箭头函数定义结果会怎么样?
  10. 发表email所需要
  11. 解决搭载M1芯片的Mac上安装犀牛Rhinoceros 7 for Mac的安装教程
  12. 迅雷:游移的4亿用户帝国
  13. WEB表单设计学习心得
  14. react路由动画切换
  15. 三元一次方程组例题_50道三元一次方程组计算题及答案过程
  16. 阿里P6+Java研发工程师,到底牛在哪儿?
  17. 网络中数据如何保证数据的安全性?
  18. 一无所知学编程:Jargon File(1)
  19. 计算机word安装程序,word2007电脑版安装包
  20. 浏览被植入木马的网站,可能也会中木马

热门文章

  1. 全球及中国高强度钢行业发展态势与市场规模分析报告2022版
  2. 中国毛纺织行业竞争分析与发展前景展望报告2022-2028年
  3. 从上百幅架构图中学大型网站建设经验(上)
  4. 初识mysql学习笔记
  5. spring 的IoC的个人理解
  6. HDU-1698 JUST A HOOK 线段树
  7. 为Chrome多账户添加单独的快捷方式
  8. HDUOJ-----Brave Game
  9. 淘宝拼多多京东等电商平台,为何孵化不出一个小红书?(内部原因版)
  10. 产品经理其实是一种能力,而非职业