一 函数的特点
1. 避免代码冗余
2. 提高代码的可维护性
3. 提高代码的可重用性
4. 提高代码的灵活性
二 函数与语法
1. 非结构化编程 所有的逻辑,都写在一起,杂乱无章
2. 结构化编程
函数是结构化编程的代表
将重复的代码,或拥有独立功能的代码抽取出来
函数定义:函数是由一组代码组成,完成一个特定的任务
语法结构:
关键字:def def 函数名():
函数体(过程)
函数的调用:
函数名()
三 函数定义的位置
函数的定义(函数的创建) 函数定义(函数的概念)
1. 没有缩进(一行的行首),参考全局变量
2. 任何函数的内部,参考局部变量
四 函数的运行机制
运行流程
1. 编译错误(语法)
2. 运行时错误
执行到错误行,才会报错
流程:(运行)
1. 先执行函数调用处的代码
2. 根据函数名找到函数定义的位置
3. 执行函数内部的代码
4. **流程返回到函数的调用出
函数定义在函数调用之前
五 函数的结构
1. 函数的定义
函数的创建,函数的声明
def fun(参数):
2. 内容:
函数体,过程
3. 函数的返回值:
return 值 (默认填充return None)
六 函数的参数
参数的划分:
1. 形式参数:Parameter---简称形参
创建函数时,小括号内的参数
相当于函数内部的一个局部变量
传值的过程相当于赋值的过程
没有定义任何参数:无参
2. 实际参数:Argument---简称实参
调用函数时,小括号内传递的参数
一定是一个确定的值
注意:
1. 如果定义多个形参,要用逗号隔开
2. 所有的形式参数,在一次调用中只能被赋值一次
3. 函数的定义中,形参只能出现一次
七 位置参数
根据参数的位置,一一对应的传递参数(相对于形参和实参)
1. 如果定义了形式参数,则必须给出实际参数
2. 参数必须一一对应,不能多也不能少
3. 形参和实参之间注意顺序
def fun(a,b,c):
# a和b应该是个字符串, c是个列表
print(a,b,c)
fun(1,2,3)
八 关键字参数
定义了关键字的参数(相对实参)
1. 根据实参中定义的关键字,和形参中对应的参数一一对应
2. 不能多也不能少
3. 关键字参数不能重复的给某个形参赋值
def fun(a,b,c):
print(a,b,c)
fun(c=3,b=2,a=1)
def fun(a,b):
pass
fun(a=1,a=2) # 错误
九 默认参数
定义了默认值的参数(相对形参)
1. 默认参数会在形参的位置设置默认值
2. 如果传递了实际参数,则使用对应的实际参数
3. 如果没有传递实际参数,则使用默认参数
4. 注意:默认参数后不能出现位置参数
def fun(a=10,b=20,c=30):
print(a,b,c)
fun(1,2,c=3)
fun()
十 可变长参数
也称为收集参数
可以收集多个参数
区分于序列解包
1. *args
将参数获得,并打包成一个元组
实参以位置参数传递(只支持位置参数传值)
2. **kwargs
只支持使用关键字参数传值,并将结果打包成字典,切关键字作为字典的键,关键字对应的值作为字典的值
注意:可变长参数在定义中每种只能出现一个
def fun(*a):
print(a) # 元组
for i in a:
print(i)
fun(1,2,3,4,5)
==============================
def fun(**kwargs):
print(kwargs)
fun(a=1,b=2,c=3)
十一 混用形式
1. 关键字参数+位置参数:
位置参数只能出现在关键字参数之前
原因:编译器认为参数中第一次出现=号的形式,之后的所有参数都应该有=号
不能重复给某一个形参赋值
2. 位置参数+可变长参数:
位置参数可以写在可变长参数之后,但是此时必须通过关键字参数传递实参
3. 默认参数+可变长参数:
没有具体要求