最好函数内部变量声明为全局,不然易报错
练习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) #?
'''
False
True
'''
判断是不是什么类型用函数 isinstance(object,classinfo)
object:实例对象 classinfo:可以是直接或间接类名、基本类型或者由它们组成的元组。
print(isinstance(tuple1,tuple))
'''
True
'''
tip:按住Ctrl,鼠标点击函数,就能看到函数源码 // ctrl+/快速注释所选内容
函数的参数:普通参数,可变参数(*args(),**kwargs{}),关键字参数
1.无参数
'''
def func():
pass
func()
'''
2.有参数
一般参数
'''
def func(a,b): #a,b为形参
pass
func(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关键字参数
pass
func()
func(1)
func(a=10)
'''
默认值参数 key=value,相当于一个默认值。给值则覆盖
'''
def func(a=10):
pass
func()
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原来的默认值
'''
12
11
'''
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 4
16
4 7 4
15
2 10 6
18
'''
函数拆装包
def func(**kwargs): # key word arguments
print(kwargs)
#调用
func(a=1,b=2,c=3) #关键字参数 key=value
func()
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}
'''