1、函数有3种形式
1)语句形式: foo()
def foo():
pass
2)表达式形式: 3*foo()
def foo():
return 1
print(3*foo()) //3
3)当做另一个参数的函数:foo(foo('hehe'))
def foo(a):
print(a)
foo(foo('hehe'))// hehe
hehe
2、函数是第一类对象,即函数可以被当做数据传递
1)可以被引用
def bar():
print('hehe')
res=bar
res()
2)可以当做参数传递
def bar(a):
print(a)
bar(bar(1))
3)返回值可以是函数
def foo():
print('1')
def bar():
print(foo)
return foo
a=bar()
a()
4)可以当做容器类型的元素
def foo():
pass
def bar():
pass
li=[bar,foo]
li[0]()
li[1]()
3、函数的参数
1)形参和实参定义
2)形参为变量名,实参为变量值,函数调用就是把值绑定在名字上,函数调用完成,接触绑定
3)参数的分类:
位置参数:按照从左往右的顺序定义参数
位置形参:必须要传入值
位置实参:按照位置给参数传值
关键字参数:按照key=value的形式定义实参不用按照位置给形参传值
需注意:关键字实参必须在位置实参后边
#正确
def foo(a,b,c):
pass
foo(1,2,c=3)
#错误
def foo(a,b,c):
pass
foo(1,c=3,2)
2、同一个形参不能重复传值
#错误
def foo(a,b,c):
pass
foo(1,2,3,b=4)
默认参数:形参定义时赋好的值,实参可以不必给默认形参传值
需注意:1、只在执行定义的时候赋一次值
2、默认参数定义在位置参数右面
#正确
def foo(a,b,c=1):
pass
#错误
def foo(a,c=1,b):
pass
3、默认参数通常定义成不可变类型(不定义成列表字典)
可变长参数:1、针对实参在定义时长度不固定的情况,形参可接受任意长度实参:
2、而实参有位置实参和关键字实参两种方式,形参也有对应的两种方式接受不固定实参,*args,**kwargs。
实例分解:
def foo(x,y,*args):
pass
foo(1,2,3,4,5)
==>
def foo(x,y,*args)):
pass
foo(1,2,*(3,4,5))
==>
def foo(1,2,*(3,4,5))):
pass
foo(1,2,*(3,4,5))
#执行foo时会将3,4,5传递给 *,会将3,4,5 做成元组(3,4,5)赋值给args
#**kwargs
def foo(x,y,**kwargs)
pass
foo(1,y=2,a=1,b=2,c=3)
==>
def foo(x,y,**kwargs)
pass
foo(1,y=2,**{'a':1,'b':2,'c':3})
==>
def foo(1,2,**{'a':1,'b':2,'c':3})
pass
foo(1,y=2,**{'a':1,'b':2,'c':3})
#调用foo时会将a=1,b=2,c=3 转化为**{'a':1,'b':2,'c':3},{'a':1,'b':2,'c':3}传入kwargs
#命名关键字参数:*后定义的参数,必须被传值(有默认值除外)且必须按照关键字实参的形式传递可以保证,传入的参数中一定包含某些关键字
def foo(x,y,*args,a=1,b,**kwargs):
print(x,y)
print(args)
print(a)
print(b)
print(kwargs)
foo(1,2,3,4,5,b=3,c=4,d=5)
==>
1,2
(3, 4, 5)
1
3
{'c': 4, 'd': 5}