python常用自定义函数_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测试代码

defto_abs(arg):if(isinstance(arg,(int, float))):if(arg <0):return -argelse:returnargelse:raise TypeError('bad operation type') #定义异常

classA:pass # 当不确定代码时,可以先写pass占位符

classB(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 !

测试结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值