函数
一、函数的定义与调用:
定义函数时发生的事情:
1、申请内存空间把函数体代码放进去
2、将函数内存地址绑定给函数名
强调:定义函数只检测语法,不执行代码
调用函数时发生的事情:
1、先通过函数名定位到函数的内存地址
2、函数内存地址()->触发函数体代码的运行
强调:调用函数才会执行函数体代码
1.1什么是函数:
函数就是盛放代码的容器
具备某一功能的工具->函数
事先准备工具的过程-》函数的定义
遇到应用场景拿来就用-》函数的调用
所以函数的使用原则:
先定义
后调用
1.2为什么要学函数:
解决下述问题:
1、代码组织结构不清晰、可读性差
2、可扩展性差
1.3如何用函数:
定义的语法:
def 函数名(参数1,参数2,参数3,...): #定义的方法
'''函数的文档注释'''
代码1
代码2
代码3
return 返回值
函数名(参数1,参数2,参数3,...) #调用的方法
二、定义函数和调用函数的的三种形式:
2.1定义函数的三种方式
1、无参(无需为代码块传值)
例:
def say(): #无参函数的定义,括号内可以不用写参数
print("hello")
say() #无参函数的调用,如果定义时没有参数那调用时也可以没有参数
2、有参(需要为代码块传值)
例:
def compare(x,y): #有参函数的定义,括号内写了参数
if x > y:
print(x)
else:
print(y)
compare(10,20) #有参函数的调用,定义时有参数那调用时应该也有参数
3、空
例:
def x(): #空函数的调用,多用与在建立功能结构时先占位,等以后再补充
pass
2.2调用函数的三种方式:
1、语句式
例:
len("hello")
2、表达式
例:
res=len("hello")*10
print(res)
3、可以当作参数传给另一个函数
例:
print(len("hello")
三、参数的形式:
3.1形参(在定义阶段,相当于变量名)
1、位置形参与默认值形参
例:
def func(x,y): #位置形参的定义,括号内的参数必须被赋值
print(x)
print(y)
func(10,20)
def func(x,y=20) #默认值形参的定义,在函数定义阶段就默认赋值了,在调用阶段可以不用为其赋值
print(x) 如果实参传入了新值那么代码块内所用的值为新值
print(y)
func(10)
ps:位置形参与默认形参可以混用,但是位置形参必须在关键字形参的前面
3.2实参(在调用阶段,相当于变量值)
1、位置实参与关键字实参
例:
def func(x,y):
print(x)
print(y)
func(10,20) #位置实参的定义,从左到右依次为形参赋值,不能多也不能少
func(y=20,x=10) #关键字实参的定义,以key:value的形式为形参传值,可以无需,不能多也不能少
ps:位置实参与关键字实参的方式可以混用,但是位置实参必须在关键字实参的前面
四、可变长参数:*与**在形参与实参中的作用
4.1*与**在形参中是一种汇总行为
例:
def func(x,*args) #*在形参中的作用:*会接收溢出的位置实参,组合成一个元祖,并赋值给args
print(x)
print(args)
func(1,2,3,4,5)
def func(x,**kwargs) #**在形参中的作用:**会接收溢出的关键字实参,组合成一个字典,并赋值给kwargs
print(x)
print(kwargs)
func(x=10,y=20,z=30)
4.2*与**在实参中是一种打散行为
例:
def func(x,y,z):
print(x)
print(y)
print(z)
func(*[1,2,3]) #*在实参中的作用:*后面可以跟一个能被for循环使用的值,*会将紧跟其后的值打散成位置实参
func(**{x=10,z=30,y=20) #**在实参中的作用:**后面只能跟一个字典,**会将字典打散成关键字实参
了解:命名关键字形参(用处不多,只用于了解)
例:
def func(x,*args,y=20,z,**kwargs) #在*与**之间的参数叫做命名关键字形参,这时y=20,z就叫命名关键字形参而不是关键字形参与位置形参
print(x) 如果z接在*后面那z永远不会被传值,所以顺序不能写反
print(args)
print(y)
print(z)
print(kwargs)
func(1,2,3,4,z=30,a=10,b=20,c=30)