一、函数简介
1.什么是函数?
函数是具有某个功能的工具
2.为什么要有函数?
1>.减少代码冗余
2>.提高开发效率
3>.提高程序拓展性
二、定义函数
函数的简易结构
def 函数名(形参1,形参2...):
'''函数的注释 用来描述该函数的作用以及各个形参的类型'''
函数体代码1
函数体代码2
...
return 函数的返回值
"""
def:定义函数的关键字
函数名:函数名的命名规则与变量名一致
1.不能以关键字命名
2.函数名要见名知意
函数在定义的时候只检测函数体语法,不执行函数体代码
def func():
print('hello')
调用函数的格式
函数名+括号
函数名只要遇到括号就回立刻执行函数体代码
代码中遇到函数名+括号 优先级别最高
先执行函数 再看下面的代码
函数必须先定义后再调用,定义了的函数可以在任意位置调用
三、函数的返回值
def func(): return('egon') res = func() print(res) # egon
函数内想要返回给调用者值,必须用关键字return
1.不写return:函数默认返回None
def func(): print('egon') res = func() print(res) # egon None
2.只写return:return除了可以返回值之外,还可以直接结束整个函数的运行
def func(): return('egon') res = func() print(res) # egon
3.写return None:返回的是None
def func(): return None res = func() print(res) # None
4.写return返回一个值:这个值可以是python任意数据类型
def func(): return '123' def func1(): return [1,2,3] def func2(): return {'name':'jason'} def func3(): return (1,) def func4(): return {1,2,3,4,5} def func5(): return True print(func(),func1(),func2(),func3(),func4(),func5()) # 123 [1, 2, 3] {'name': 'jason'} (1,) {1, 2, 3, 4, 5} True
5.写return返回多个值:return自动将多个值意元组的形式返回给调用者
def func(): return 1,2,3 res = func() print(res) # (1, 2, 3) def func1(): return[1,2,3],[4,5,6] res1 = func1() print(res1) # ([1, 2, 3], [4, 5, 6])
6.写return返回多个值,并且不想让return帮你做处理 ,自己手动加上你想返回的数据类型符号
def func(): return [[1,2,3,4],[1,2,3,4],[1,2,34]] res = func() print(res) # [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 34]]
四、函数参数的两大类型
1.形参:在定义函数时,括号内定义的函数,形参就相当于变量名
2.实参:在条用函数是,括号内传入的值,实参就是变量值
3.形参与实参的关系
形参就相当于变量名,实参就相当于变量值,
函数调用传参的过程中,就是给形参变量名复制的过程
注意:
实参与形参的绑定关系只在函数调用是才生效,在函数调用结束后立刻解除绑定
def func(x,y): # x,y 就是形参 print(x) print(y) func(1,2) # 1,2 就是实参
五、位置参数
位置参数分为两类:
1.位置形参:在定义函数时,按照位置从左往右依次书写变量名,叫做位置形参
注意:在调用函数时,必须为其传值
2.位置实参:在调用函数时,传入的参数会按照位置一一对应给形参
注意:位置实参与形参必须一一对应
def func(x,y,z): print(x,y,z) func(1,2,3) # 1 2 3
六、关键参数
定义:在调用函数时,按照key=value的形式定义的实参
注意:相当于指名道姓的为形参传值,意味着即使不按照顺序定义,仍然能为指定参数传值
def func(x,y,z): print(x,y,z) func(y=2,z=1,x=3) # 3 2 1
注意:
在函数调用阶段,位置参数可以与关键字参数混合使用,但是:
1.位置参数必须在关键字参数前面
2.不能为同一个形参重复传值
func(1,x=1,y=2,z=3) # 这是错误的
七、默认参数
在函数定义阶段,已经为某个形参赋值,那么该形参就称为默认参数
def register(name,age,sex='male'): print(name,age,sex) register('jason',19) register('egon',20) register('wxx',24,'female') # jason 19 male # egon 20 male # wxx 24 female
注意:
1.定义阶段已经有值,意味着调用阶段可以不传值
2.位置形参必须在默认参数的前面
3.默认参数的值只能在定义阶段赋值一次,形参中用到的值都是往函数定义阶段代码往上找
4.默认参数的值应该设为不可变类型
八、可变长参数
可变长度指的是参数的个数不固定,
实参有位置实参和关键字实参。
所以可变长度的实参指的是按照这两种形式定义的实参个数可以不固定
1.站在形参的角度去看 *
形参中的*会将溢出的实参全部接受,然后保存元组的形式赋值给args这个变量
def foo(x,y,z,*args): # args = (4,5,6) print(x,y,z,args) foo(1,2,3,4,5,6) # 1 2 3 (4, 5, 6)
2.站在实参的角度去看 *
def func(x,y,z): print(x,y,z) func(*[1,2,3]) # *会将列表打散成位置实参一一传入等价于func(1,2,3)
*只能将列表 元组 集合 字符串打散
# *的内部你可以看成是for循环
3.站在形参的角度去看**
**会将溢出的关键字实参全部接受,保存为字典的形式,赋值给kwargs
def func(x,y,z,**kwargs): print(x,y,z) print(kwargs) func(x = 1,y = 2,z = 3,a = 4,b = 5) # 1 2 3 # {'a': 4, 'b': 5}
4.站在实参的角度去看**
def func(x,y,z): print(x,y,z) d = {'x':1,'y':2,'z':333} func(**d) # 等价于func(x=1,y=2,z=333) # 1,2,333 # **会将字典拆封成 key = value的形式