函数
y = f(x) y是x的函数,x自变量
python函数
由若干的语句块,函数名称,参数列表构成,是组织代码的最小单元
作用是完成一定的功能
函数的作用
结构化编程的最基本封装,一般按照功能组织代码
封装为了复用,减少冗余代码
代码简洁美观,可读易懂
def语句定义函数
def 函数名(参数列表) <--参数列表不是列表
函数体(代码块)
[return 返回值]
函数名就是标识符,命名要求一样
语句块缩进 四个空格
python的函数没有return语句,返回None
定义的参数列表为形式参数,只是符号表达,简称形参,相当于占位符
调用
函数定义,只是声明函数,需调用才能执行
调用的方式,就是函数加上小括号,括号内写参数
调用的参数是实际参数,和形参位数相同
返回值也是值,None也是值,返回值可以用变量接收
定义要在调用前,否则NameError异常
callable测试是否是函数,测试时不要在函数名后加括号
print返回None,打印打印的话会返回None
函数的调用,输入参数时,动态语言的缺点,不能指定类型,除了程序解决,没有语法上的解决方案。
位置参数,一一对应,按照参数定义顺序传入
def f(x,y,z) 调用使用 f(1,3,5) 按照定义顺序传入参数
关键字参数,使用形参的名字传参,可以与定义顺序不同
def f(x,y,z) 调用使用 f(x=1,y=3,z=5)
传参
f(z=None,y=10,x=[1]) f((1,),z=6,y=4.1)
实参:位置参数要在关键字参数之前,位置参数按位置对应
形参:非缺省参数要在缺省参数之前
参数默认值,缺省值
定义时,在形参后跟上一个值
作用
参数的默认值可以在未传入足够的实参时,对未定义的参数赋值为默认值
简化函数调用
可变参数
def add(nums): sum = 0 for i in nums: sum += i return sum
传入可迭代对象,迭代元素求和
一个形参可以匹配任意个参数
*可变位置参数,可以接收多个实参
使用*封装成元组返回,收集的实参为一个tuple
空的返回空元组
**可变关键字参数
使用**符号,表示接受多个关键字参数
收集到的值和名称封装成字典dict
空的收集空字典
位置参数后放可变位置参数,再放keyword-only参数,最后边只能放可变关键字参数
keyword-only参数,只能通过关键字传参
在位置可变参数之后,出现参数,就不能在理解为位置参数,要理解为关键字参数
**kwargs只能在最后的位置
fn(*args,x,y),表示x,y是keyword-only参数,前边收位置参数
fn(*,x,y) 表示只要keyword-only参数,必须有
参数列表的一般顺序是,普通参数,缺省参数,可变位置参数,keyword-only参数(可带缺省值),可变关键字参数
def fn (x,y,z=3,*arg,m=4,n,**kwargs)
注意
代码应该易读易懂,按照书写习惯定义函数参数
解构
fn(*[4,5]) fn(*{4,5}) fn(*(4,5))
解开是fn(4,5)
*参数解构成位置参数,可以解开一层的结构,列表,元组,集合,字符串,字节,可以解开可迭代对象(range等)
add(**{'x':2,'y':4})
解开的参数是add(x=2,y=4)
**解开两层,解开字典构成关键字参数,产生的键值对组成的元组。二维结构,返回两层。
可变位置参数和参数解构要分清