1.什么是函数
函数其实就相当于具有某一功能的工具
2.为什么要使用函数呢?
我们不使用函数的时候,往往会将全部的代码写到一起,这样会使得代码冗余,程序的结构不清晰,可读性比较差,可维护性和可扩展性也比较差。
3.如何使用函数
函数的使用必须遵循一个原则:先定义,再调用;
3.1 先定义(三种定义方式)
1)无参函数
2)有参函数--用来需要向函数内部传值
3)空函数--用来先构思函数
def 函数名(参数1,参数2...):
"""函数描述"""
函数体(pass就是空函数)
return 值
3.2 再调用(三种调用方式)
1)直接调用形式---函数名(参数)
2)表达式形式--将函数的返回值当成一个值进行加减乘除
3)函数调用可以在当成参数放到函数中
3.3 返回值(三种返回值形式)
return是函数结束的标志,函数执行遇到return会立刻终止函数的运行,并且会将return后面的值当做本次运行的结果返回出来。
细节:
1.返回none:函数体内没有return,或者return None
2.返回一个值:直接return 值
3.返回多个值: return 值1,值2
外界接受return值的时候是元组的形式
3.4 函数的参数
3.4.1 形参与实参
形参:在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名def func(x,y)
实参:在调用函数阶段传入的值,称之为实际参数,简称实参,相对于变量值func(1,2)
3.4.2 位置实参与关键字实参
位置形参,不可少传参,也不可多传参!在函数定义阶段,传参时实参按照从左到右的顺序给形参传值。
关键字传参:在函数调用阶段,按照key=value的形式传入的值
3.4.3 默认形参
在定义函数阶段,就已经被赋予值的形参,称之为默认形参
特点:在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值,如果赋值会替代形参赋予的值。
应用:当需要多次调用函数,而函数的参数有的不需要变动,只需要变动一个,那不变动的那个就可以采用默认形参的形式,这样在后续调用的时候比较方便!def func(x,y=3)
强调:1.默认形参必须在位置形参的后面
2.默认形参的值是在函数定义阶段被赋予的,准确的说是被赋予的值的内存地址
如:
m=33 #当m改完列表时m=[5,]
def func(x,y=m): #传递的是m的内存地址给y
print(x,y)
m = 22222 #m.append(88)
func(1)
调用打印的结果为:1 33 #此时的打印结果为 1 【5,88】
因为列表后面添加元素,不改变内存地址,而重新赋值会改变内存地址
3.4.4 可变长度参数(*与**的用法)
可变长度指的是,在调用函数时,传入的值(实参)的个数不确定。
一个星行参:用来接收溢出的位置实参,多出的参数会被*处理,然后赋值给形参名,溢出的部分是元祖的形式def func(x,y,*args)
**形参名:用来接收溢出的关键字实参,多出的参数会被两个*处理,然后赋值给形参名,溢出的部分是字典的形式def func(x,y,**kwargs)
*实参:用来将一个列表元素拆分打散,然后将其按照位置传参的方式,传到函数中。
小列子:思考输出的结果是什么?
def func(x,y,*args):
print(x,y,args)
func(*'hello')
**实参:后面只能是字典,把字典打散成关键字实参传给形参,字典中的key必须与形参定义的变量名一样,不要多也不能少,否则报错
func(*{'x':1,'y':2},'z':3) #打散之后是 func('x','y','z')
func(*{'x':1,'y':2},'z':3) #打散之后是func(x=1,y=2,z=3)
3.4.5 命名关键字参数
在定义函数时。*后定义的参数,我们称之为命名关键字参数,如下所示:
def func(x,y,*args,a,b) # a,b为命名关键字参数
特点:命名关键字参数必须按照key=value的形式为其传值
函数中传参的顺序:位置传参-->关键字传参--->*传参---->命名关键字传参