• Python自定义函数及常用函数分析【isinstance&type】


    一.isinstance&type

      isinstance()函数用来判断一个对象是否是一个已知类型的数据,类似于type()。

      isinstance()和type()的区别:

        1.type()不会认为子类是一种父类类型,不考虑继承关系。

        2.isinstance()会认为子类是一种父类类型,考虑继承关系。

      相同点:

        都不认为父类是子类的一种类型!

      判断两个类型是否相同可以根据具体业务进行选择,一般建议选择isinstance()。

      isinstance语法

        isinstance(object, classinfo)

      isinstance参数

        object -- 实例对象

        classinfo -- 可以是直接或间接类名、基本类型或由它们组成的元组

      isinstance返回值

        如果对象的类型与第二个参数的类型相同则返回True,否则返回False

      type语法

        type(object)

        type(name, bases, dict)

      type参数

        name -- 类的名称

        bases -- 基类的元组

        dict -- 字典,类内定义的命名空间变量

      type返回值

        一个参数返回对象类型,三个参数返回洗的对象类型

    二.isinstance&type测试代码

    def to_abs(arg):
        if(isinstance(arg,(int, float))):
            if(arg < 0):
                return -arg
            else:
                return arg
        else:
            raise TypeError('bad operation type') #定义异常
        
    class A:
        pass # 当不确定代码时,可以先写pass占位符
    
    class B(A):
        pass
    
    # 调用
    abs_1 = to_abs(-4.5)
    abs_2 = to_abs(0)
    abs_3 = to_abs(4.5)
    
    # 测试
    print(abs_1, abs_2, abs_3, sep='_')
    
    print(isinstance(12, int))
    print(isinstance(12, float))
    print(isinstance(12, object))
    
    print('===========')
    
    print(type(12) == int)
    print(type(12) == float)
    print(type(12) == object)
    
    print('-------------------------')
    
    print(isinstance(A(), A))
    print(isinstance(B(), A))
    print(isinstance(A(), B))
    
    print('===========')
    
    print(type(A()) == A)
    print(type(B()) == A)
    print(type(A()) == B)

      执行结果:

        

    三.


    #定义一个类
    #mid = "bbb"
    class Person:
      formula = ["begin","end"]
      name = "zhangsan"
      def __init__(self,name="wangwu"):#指定默认参数,当传值时覆盖默认值,注意:为了程序安全,一定要使用常量,不要使用变量(不会报错)
        self.name = name
    person = Person() #创建实例
    #person = Person("lisi") #创建实例
    #person.name = "lisi"
    person.age = 12;
    #定义返回多个值的函数(其实是一个tuple元组)
    def multiReturn(person):
      return person.name,person.age
    #定义可变参数函数
    def canChange(*args):#此函数是为了测试,暂时为int类型
      result = 0
      for arg in args:
        result += arg
      return result

    #调用返回多值函数
    name,age = multiReturn(person)
    print("name:"+name+",age:"+str(age))
    print(multiReturn(person)) #其实是个元组
    #调用可变参数函数
    print(canChange())#无参
    print(canChange(6))#一个
    print(canChange(1,6,23))#多个
    print(canChange(*[1,4,7]))#列表,*是把列表转成可变参数
    #位置参数和关键字参数
    #位置参数是指按照函数参数定义的先后顺序传入参数,调用函数传入的数据和参数一一对应,函数默认调用的方式都是位置参数。例子如下:
    def show(name,sex):
      print("name:"+name+",sex:"+sex)
    show("light","boy")
    #关键字参数是指按照参数的名称指定传入的数据,可以位置不定,但必须每个参数都被赋值且不能重复赋值
    show(sex="girl",name="lili") #good
    #show(sex="girl",sex="lili") #SyntaxError: keyword argument repeated name没有被赋值
    #show(sex="girl",name="lili",name="lijie") #SyntaxError: keyword argument repeated name被重复赋值
    #组合赋值,关键词参数必须在其原来的位置上,也就是指名位置参数的名称而已,即失去了位置参数的简单直接,也失去了关键字参数的灵活,不建议使用
    show("wangming",sex="boy")
    #show(sex="boy","wangming")#SyntaxError: positional argument follows keyword argument
    #递归函数
    def recursion(number):
      if isinstance(number,(int)):
        if number > 0:
          if number == 1:
            return 1
          else:
            return number * recursion(number - 1)
          elif number == 0:
            return number
        else:
          if number == -1:
            return number
          else:
            return number * recursion(number + 1)
      else:
        raise TypeError("error input type !")
    #调用递归函数
    print(recursion(5))
    print(recursion(50))
    #print(recursion(5000)) #RecursionError: maximum recursion depth exceeded in comparison 递归深度过大,可改成尾递归,在python中不建议使用
    #print(recursion("5")) #TypeError: error input type !

    测试结果:

  • 相关阅读:
    SharePoint安全性验证无效
    纠结的TreeView动态加载节点
    Microsoft CRM 安装问题汇总
    moss里用Response生成Excel以后页面按钮失效问题
    zt:System.Globalization 命名空间
    ZT:自定义的泛型类和泛型约束
    开博了,,,
    zt:SilverLight遍历父子控件的通用方法
    zt: 学习WPF绑定
    zt:使用复杂类型定义模型(实体框架)
  • 原文地址:https://www.cnblogs.com/yszd/p/9140516.html
Copyright © 2020-2023  润新知