zoukankan      html  css  js  c++  java
  • 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 !

    测试结果:

  • 相关阅读:
    监控里的主码流和子码流是什么意思
    监控硬盘容量计算
    一个能让你了解所有函数调用顺序的Android库
    电工选线
    oracle linux dtrace
    list all of the Oracle 12c hidden undocumented parameters
    Oracle Extended Tracing
    window 驱动开发
    win7 x64 dtrace
    How to Use Dtrace Tracing Ruby Executing
  • 原文地址:https://www.cnblogs.com/yszd/p/9140516.html
Copyright © 2011-2022 走看看