目录
一、python函数的定义
函数是工具,调用的过程即使用工具的过程,因此函数名为动词为好。 先定义再调用。一般格式为:
def 函数名(参数): #好的函数名能看出其功能 代码段; #代码段可适当的注释 代码段; return 返回值 函数名()#调用函数
一个函数无非三种情况: #有参数的情况: def Max2(x,y): if x>y: print(x) else: print(y) Max2(100,192) #无参数的情况 def Max1(): print("这个是一个无参数的函数") Max1() #空函数 def Max3() pass Max3()
二、函数的调用
调用即执行的意思,就是函数名(参数)即可:
三、函数的返回值
1,return None与 return,与不写return 其相当于返回的结果都是None
2,return 返回的类型可以是任何数据类型
3,可以有多个return但是一次只return一个结果
四、函数的作用域
局部变量与全局变量:
局部变量:在被调用函数内部定义的变量即局部变量,在局部的变量在该函数执行完之后就会自动的销毁。
全局变量:在所有函数之外定义的变量就叫全局变量
def spam():
eggs=99
spam()
print(eggs) #这里会报错,因为eggs这个变量在函数的内部属于内部变量,而这里print()函数调用了一个
#被没有定义的局部变量,所以会报错。
def spam():
egg = 100
bar()
print(egg)
def bar():
egg = 50
spam() #这里spam()执行的结果是egg=100,因为在spam()函数体内bar()函数内,虽然egg=50但问
#但这里的egg=50是局部变量,只能在bar()内部使用,当bar()执行结束,回到spam()体内
#egg=50失效
def foo():
print(eggs) #报错,原因是因为在函数内部定义了eggs因此函数认为这是一个局部变量,但在调用之前
#未定义
eggs="local"#局部变量
eggs="Global" #全局变量
foo()
五,函数的参数
1,参数的分类
巧记为:关键字参数传参和默认参数,都需要注意的是保证位置参数在前
命名关键字参数:命名关键(字)参数,即这个参数一定要传值,且以key-value的形式
2,用法举例
关键字参数
def func1(a,b,c):
print(a,b,c)
func1(2,c=3,b=4) #混用正确 位置参数在前面
func1(2,a=3,c=4)#报错 a为多个值
func1(a=1,b=2,3)#报错 位置参数在前。
默认参数的用法:位置形参数在前
def func(b,c,a=1): #func(a=1,b,c)会报错
print(a,b,c)
func(b=3,c=4)
func(a=8,b=3,c=5)
可变长参数*与**(*对应的是位置传参,所以对应的可选参数为参数构成的列表或元组,而**kwargs对应的是关键字传参,所以采用字典的形式)
def foo(x,y,z,*args):#保存成不可变的元组
print(x,y,z)
print(args)
foo(1,2,3,4,5,6) #args=(4,5,6)
foo(1,2,3) #args={}
****思考****
def foo(x,y=1,z=5,*args):
print(x,y,z)
print(args)
foo(3,(4,5,6))#这表示按参数位置传参,y=(4,5,6) 所以z=5,args为{}
foo(3,*(4,7,6))#这表示将(4,7,6)打散传入,y=4,z=7,args=(6)
def foo1(x,y,z,**kwargs):
print(x,y,z)
print(kwargs)
foo1(9,8,7,a=6,b=5,c=4) #kwargs={'a'=6,'b'=5,'c'=4}
foo1(9,8,7) #{}
#关键字命名
如果实参中加*、**表示打散,拆开【关键字:巧记为以相关键值传值】
def foo1(x,y,z,**kwargs):
print(x,y,z)
print(kwargs)
foo1(9,8,7,**{'a':6,'b':5,'c':4}) # kwargs={'a': 6, 'b': 5, 'c': 4}
***命名/关键字参数/的使用
def foo(x,y,*,z): #星号后面的参数就表示<带>关键字的参数,关键字参数必须得传值,而且以key-Value
#的方式。
print(x,y,z)
foo(2,4,z=1)
***重点****
def foo(x,y,*z)的区别,上面的*,z表示z为关键字参数,需要按照关键字传参的方式key-Value的方式,而*z类似于*args为可传可不传的参数,应该以列表或元组的方式传参。
个人总结
函数的用法,函数的三要素
传参的最难的一种情况举例:
def foo(x,y=1,*,z,m=2,**kwargs): print(x,y,z,kwargs) foo(1,z=3) #注意这里*后面的参数是命名关键字参数,所以用z=3,必须有的。至于**kwargs可传可不传