本文共 3100 字,大约阅读时间需要 10 分钟。
最好函数内部变量声明为全局,不然易报错
练习3:
封装一个求最大值函数
def max(iterable): #iterable 可迭代的 max = iterable[0] for i in iterable: if i>max: max=i print('最大值是:',max)#调用,测试是否完成预定功能#封装好后,谁用谁直接调函数list1 = [4,1,8,4,6,3,3]max(list1)tuple1=(3,9,0,1,3,8,11)max(tuple1)'''最大值是: 8最大值是: 11'''
上面代码要求输入是可迭代的,如何判断是否可迭代?
type只能查看是什么类型,不能判断是不是什么类型,此处指判断是否可迭代
print(type(tuple1)=='tuple') print(type(tuple1)==tuple) #?'''FalseTrue'''
判断是不是什么类型用函数 isinstance(object,classinfo)
object:实例对象 classinfo:可以是直接或间接类名、基本类型或者由它们组成的元组。
print(isinstance(tuple1,tuple))'''True'''
tip:按住Ctrl,鼠标点击函数,就能看到函数源码 // ctrl+/快速注释所选内容
函数的参数:普通参数,可变参数(*args(),**kwargs{}),关键字参数
1.无参数
'''def func(): passfunc()'''
2.有参数
一般参数
'''def func(a,b): #a,b为形参 passfunc(1,2) #1,2为实参'''
出现阴影要小心,说明有错误,形参和实参个数要一致
TypeError: add() missing 1 required positional argument: 'b'
可变参数 参数个数可以改变
不报阴影说明能正常运行
上图中,*号相当于装包,底层提前把装包容器(元组)准备好了
args是arguments缩写,表示位置参数
def add(*args): #个数随便传 可变参数 sum=0 if len(args)>0: for i in args: sum+=i print('累加和是:',sum) else: print('没有元素可以计算',sum)add()add(1,2,3,4)add(1,) #一个元素的元组要加逗号,不然括号会当成运算符'''没有元素可以计算 0累加和是: 10累加和是: 1'''
参数包含可变参数和不可变参数的情况:先放固定参数,再放可变参数
def add(name,*args): #name,*args='飞飞',1,2,3,4 sum=0 if len(args)>0: for i in args: sum+=i print('%s的累加和是:%s'%(name,sum)) else: print('没有元素可以计算',sum) #调用add('飞飞',1,2,3,4)'''飞飞累加和是:10'''
万能形式
'''def func(*args,**kwargs): #args单个元素 kwargs关键字参数 passfunc()func(1)func(a=10)'''
默认值参数 key=value,相当于一个默认值。给值则覆盖
'''def func(a=10): passfunc()func(100)'''
关键字参数 指明给谁赋值
def add(a,b=10): #b为关键字参数,此时b为默认值 result = a+b print(result)#调用add(2)add(4,7) #a=4,b=7 7覆盖b原来的默认值'''1211'''
def add(a,b=10,c=4): print(a,b,c) result = a+b+c print(result)#调用add(2)add(4,7)#给c赋值而不是给b赋值add(2,c=6)'''2 10 4164 7 4152 10 618'''
函数拆装包
def func(**kwargs): # key word arguments print(kwargs)#调用func(a=1,b=2,c=3) #关键字参数 key=valuefunc()func(a=1)dict1={'a':1,'b':2,'c':3} #字典key要是字符串类型func(**dict1) #传递实参用到**,会把字典拆包成关键字(a=1,...),传到**kwargs,又进行了装包变成字典'''{'a': 1, 'b': 2, 'c': 3}{}{'a': 1}{'a': 1, 'b': 2, 'c': 3}'''
**kwargs说明,只要外面给函数送值,送的值必须是关键字(key=value),不一定要取kwargs这个名,**是关键
*默认准备元组,**默认准备字典
def bb(a,b,*c,**d): print(a,b,c,d)bb(1,2)bb(1,2,3,4)bb(1,2,x=100,y=200)#bb(1,2,x=100,5,6) 1给a,2给b,c没有,x=100,5,6给了d,不符合要求'''1 2 () {}1 2 (3, 4) {}1 2 () {'x': 100, 'y': 200}'''
位置参数要在关键字参数之前
def func(name,*courses): if len(courses)>0: for i in courses: print('{}学过了{}'.format(name,i)) else: print('没有学过任何编程知识')courses=['html','sql','python']func('坤坤',courses)func('坤坤',*courses)'''坤坤学过了['html', 'sql', 'python']坤坤学过了html坤坤学过了sql坤坤学过了python'''
作业:
def func(a,*args): print(a,args)func(2,[1,2,3,4],5,'hello')func(3,4,(4,5,7),9)'''2 ([1, 2, 3, 4], 5, 'hello')3 (4, (4, 5, 7), 9)'''
def func(a,b=10,c=3,**kwargs): print(a,b,c,kwargs)#func(3,4,7,a=9,b=2) TypeError: func() got multiple values for argument 'a'#改正func(3,4,7,x=9,y=2)func(3,c=5,b=3,x=9,y=2) #关键字赋值,顺序没有要求'''3 4 7 {'x': 9, 'y': 2}3 3 5 {'x': 9, 'y': 2}'''
转载地址:http://szegn.baihongyu.com/