函数就是实现某一个特定功能的代码的封装
函数就是将实现某一个或者某一类功能的代码打包,在需要使用这个功能的时候,直接调用包,直接使用封装的代码函数
函数的作用:将重复的操作封包,在使用的时候进行调用
函数的分类:
系统函数:系统创建的函数,本身自带的函数
自定义函数:程序员自己创建的函数
定义函数
语法:
def 函数名(形参列表):
函数说明文档
函数体
说明:
1)def-关键字;固定写法
2)函数名-由程序员自己命名;
两个要求:是标识符,不是关键字
三个规范:见名知义
所有的字母都小写,多个单词用下划线隔开
不使用系统的函数名,类名和模块
3)() —固定写法
4)形参列表-以’变量名1,变量名2,变量名3,…'的形式存在,根据情况变量名可以为0,也可以为多个
作用:将函数外部的数据传递到函数里面
确定形参的方法:看实现函数的功能需要不需要额外的数据,需要多少个数据
5)函数说明文档-多行注释,对函数功能进行解释
6)函数体-实现函数功能的代码
# 练习:定义一个函数,删除列表中所有的空值(包括None,和其他空值(比如空字符串、空列表、空元组等))
def del_None(list):
for i in list[:]:
# if bool(i)==0 and i!=0: 条件对应的表达式如果不是布尔,转换成布尔看结果是否为True
if (not i) and (i !=0 ):
list.remove(i)
print(list)
list1=[None,'',[],1,[123],{},0]
del_None(list1)
调用函数
语法:
函数名(实参列表)
说明:
1)函数名-明确调用哪个函数,必须是已经定义过的函数名
2)( ) --固定写法
3)实参列表 -以’数据1,数据2,数据3,…'的形式存在,每一个数据就是一个实参
定义函数不会执行函数体,调用函数的时候才会执行函数体
函数调用过程
每次在调用函数的时候,执行步骤为:
第一步:回到函数定义的位置
第二步:传参
第三步:执行函数体
第四步:确定函数返回值
第五步:回到函数调用的位置,接着往后执行
函数的参数
实参类型:
根据实参的提供方式,将实参分为位置参数和关键字参数
位置参数:以’实参1,实参2,实参3,…'的形式存在,让实参和形参一一对应,顺序改变,实参值改变
关键字参数:以’形参1=实参1,形参2=实参2,…‘的形式存在,通过’='号对应,顺序改变,实参值不会改变
注意:位置参数和关键字参数可以一起用,但位置参数的位置在关键字参数的前面
参数默认值:
定义函数的时候可以通过’形参名=数据’的方式给形参赋值默认值;在调用的时候,有默认值的形参,可以不用传参
如果需要跳过有默认值的参数,使用关键字参数传参
注意:在定义函数的时候,没有默认值的形参必须在有默认值的形参前面
def func2(x,y=10):
print(x,y)
func2(2) # x=2 y默认=10
func2(100,20) # x=100,y=20
参数类型说明:
对形参类型进行说明,可以在函数体里方便代码提示
没有默认值的参数类型说明,直接在形参后面加:类型名
存在默认值,默认值的类型就是形参的数据类型
返回值数据类型说明: -> 数据类型
*对应的不定长参数:
参数个数不确定的时候可以使用不确长参数
定义函数的时候,如果在某一个形参前面加*号,这个形参会变成不定长参数,可以传参0个或者多个参数
带*的不定长参数的本质是一个元组,接收到的所有的实参是这个元组的元素
def sumN(*nums):
sum1=0
for i in nums:
sum1+=i
print(sum1)
sumN(5,123,23)
sumN(45678,12231,5234)
定义函数的时候单独使用*号,调用函数的时候,*
号后面的参数必须使用关键字参数传参
def fun1(x,*,y,z)
pass
fun1(1,y=2,z=2)