1.什么是函数:
函数就是具有某种功能的工具
2.函数的作用:
提高开发效率
减少代码冗余
提高程序的扩展性
3.如何定义一个函数
基本式:def+函数名(参数):
def:定义一个函数的关键字
函数名:函数名的命名规则变量名一致
a.不能用关键字命名
b.函数名的命名也要左到见名知意
def func(): pass
ps:函数体在定义阶段只检测语法,不执行代码
4.函数的调用:
基本式:函数名+括号
func()
ps:函数必须先定义在使用,定义了的函数可以在任意位置使用
函数名只要加了括号就会立即执行函数体代码
代码中遇到函数名加括号优先级最高,先执行函数再看下面的代码
5.函数的返回值
def my_len(): s = 'hello world' n = 0 for i in s: n += 1 print(n) res = my_len() print(res) # None
自己编写的函数没有返回值,只能执行固定的打印操作,只能固定的统计某一容器的长度,当我们需要对函数运行的结果进行处理时,这时候就需要一个和返回值
函数内想要有返回值必须用关键字return,其分为以下几种情况:
1.不写return
2.只写return
3.写return None
4.写return返回一个值
5.写return返回多个值
5.1不写return,函数默认返回None
def func(): print('hahaha') res = func() print(res) # None
5.2只写return:返回的时None,还有结束函数的作用
def func(): l = ['jason','egon','tank'] while True: for i in l: if i == '11': # 当i为11的时候 直接结束函数运行 # break return # print('asdasdkljlsjadl') # 这一行代码拥有都不会运行 print(i) res = func() print(res) # None
5.3写return None返回值时None,同时结束函数运行
def func(): a +=1 return None print('happy') # 不会执行,函数在return处直接结束 res = func() print(res) # None
5.4写return返回一个值,这个值可以时任何类型
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())
5.5写return返回多个值,返回值的形式为元组
def func(): return 1,2,3,4 res = func() print(res) # 返回的是(1, 2, 3, 4) def func1(): return 'a','b','c' res = func1() print(res) # ('a', 'b', 'c') def func2(): return [1,2,3],[1,2,3],[1,2,3] res1 = func2() print(res1) # ([1, 2, 3], [1, 2, 3], [1, 2, 3]) def func3(): return {'name':'zhang'},{'username':'wang'},{'user_name':'jia'} res2 = func3() print(res2) # ({'name':'zhang'},{'username':'wang'},{'user_name':'jia'})
5.6返回的多个值若不想return处理,可以自己手动加自己想要的数据类型
def func4(): return [[1,2,3,4],[1,2,3,4],[1,2,34]] res = func4() print(res) # [[1,2,3,4],[1,2,3,4],[1,2,34]]
6.函数的参数
6.1函数参数的两大类型
形参:在定义函数阶段,括号内的变量名
实参:在函数调用阶段括号内实际传入的值
6.2形参和实参的关系
形参相当于变量名,实参相当于变量的值
函数传参的过程及时给形参变量名赋值的过程
ps:形参和实参的绑定关系置在函数的调用阶段有效,函数运行结束关系自动解除,只在函数体内部有效,函数外部无任何影响
6.3一个完整函数的简易结构
def 函数名(形参1,形参2,形参3...):
'''
函数的注释(按住shift敲三个引号,然后回车,会自动出现)
在此处简述函数的作用
:param 形参1:对形参1的解释
:param 形参2:对形参2的解释
:param 形参3:对形参3的解释
:return:对函数返回值的解释
'''
函数体代码1 函数体代码2 ... return 函数的返回值
7.位置参数
7.1位置形参
位置形参:在函数定义阶段按照位置从左到右依次书写的变量名
ps:位置形参在定义阶段必须给其传值,且在调用函数阶段多一个实参或者少一个实参都不行
def my_max(x,y): print(x,y) if x > y: return x else: return y res = my_max(1) # 在调用函数的时候 少一个实参不行 res = my_max(1,2,3) # 在调用函数的时候 多一个实参也不行 res = my_max(20,10) # 20
7.2位置实参
位置实参:在函数调用阶段传入函数的参数会按照位置一一对应给形参
位置实参的几种方式:1.按位置传参
2.关键字传参
3.位置传参加关键字传参
def func(x,y,z): pass func(1,2,3) # 位置传参 func(x=1,y=2,z=3) # 关键字传参 func(1,z=3,y=2) # 混用 func(x=1,2,z=3) # 报错,位置传参必须在关键字传参前面
ps:在函数调用阶段,位置参数必须在关键字参数前面,且同一个形参不能被多次传值
8.默认值参数
默认值参数:在函数定义阶段,形参就已经被赋值了
ps:在调用阶段可以不给默认参数传值,因为在定义阶段就已经被赋值了。
如果在调用阶段给默认传输传值了,那么就用新传入的值
在定义阶段默认值参数必须放在位置形参后面
def func(x,y=100): pass def func1(y=100,x): # 报错,位置参数要在默认值参数之前 pass def func2(x,y=100): if x >= y: return x return y func2(20,10) # 20
9.可变长参数(*和**)
*:在形参中可以接收实参中溢出的位置实参,以元组的形式赋值给*后面的变量名
def func(x,y,*z): print(x,y,z) # z = (3, 4, 5, 6) func(1,2,3,4,5,6)
*:在实参中将列表,元组,集合中的元素打散成位置形参的形式传函数
def func(x,y,z): pass func(1,*[2,3]) # 将列表[2,3]打散传值给y,z *的内部可以看成是for循环
ps:*只能接收实参中的位置参数不能接收关键字参数
**:在形参中可以i接受溢出的关键字参数,以字典的形式赋值给**后面的变量名
def func(x,y,**z): print(x,y,z) # z = {'z': 1, 'a': 1, 'b': 2, 'c': 3} func(x=1,y=2,z=1,a=1,b=2,c=3) # **会接收所有多余的关键字参数 并将关键字参数 转换成字典的形式 字典的key就是关键字的名字字典的value就是关键字的名字指向的值 将字典交给**后面的变量名
**:在实参中会把字典才成key=value的形式按照关键字参数传给函数
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)等价