1.函数简介
1)函数是先定义后使用!!!!!!!
def funce(arg1,arg2.....):
"""描述信息"""
函数体
return value
我们为什么要用参数呢?在以后的编程过程当中,有大量的代码会重复被使用,使用函数会解决代码重复问题,能统一维护,程序的组织结构清晰,可读性强。
def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个‘:’,def 是固定的,必须是连续的def三个字母,空格是为了将def关键字和函数名分隔开,函数名只能包含字符串,下划线和数字且不能以数字开头。
2)定义函数可以分为三类:
无参函数、有参函数、空函数
2.reture关键字的作用
返回值有三种情况:没有返回值,返回值,返回多个值。
不写return:函数默认返回None.
def func(): print('hahaha') res = func() print(res)
只写return:return除了返回值之外,还可以直接结束整个函数的运行,返回值也是None
def func(): l = ['jason','egon','tank'] while True: for i in l: if i == 'egon': # 当i为egon的时候 直接结束函数运行 # break return # print('asdasdkljlsjadl') # 这一行代码拥有都不会运行 print(i) res = func() print(res)
写return none 跟上面的情况是一样的
写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())
写return返回值:return会自动将多个值以元组(函数不希望自己处理的结果被修改)的形式返回给调用者
def func(): return 1,2,3,4 # 返回的是(1,2,3,4) res = func() print(res) def func1(): return 'a','b','c' #返回值为('a','b','c') res = func1() print(res) def func2(): return [1,2,3],[1,2,3],[1,2,3] #返回值为([1,2,3],[1,2,3],[1,2,3]) res = func2() print(res) 字典也是同上面输出一样
返回多个值,并且不想让return帮你做处理,可以自己动手加上想要的类型
def func4(): return [[1,2,3],[1,2,3],[1,2,3]]#返回值为[[1, 2, 3], [1, 2, 3], [1, 2,3]] res = func4() print(res)
所有的函数都有返回值,无论写不写return ,python中所有的函数都有返回值,不写的情况下默认返回none。光写return和return none 并不是为了考虑返回值,而是为了结束函数的运行。
3.函数参数两大类型
形参:在函数的定义阶段,括号内写的是变量名,是该函数的形式参数。
实参:在函数的调用阶段,括号内实际传入的值,叫做实际参数
形参就相当于变量名,而实参就相当于变量的值,函数调用传参的过程就是给形参变量名赋值的过程,形参和实参的绑定关系只在函数的调用阶段有效,函数运行结束关系自动解除,只在函数内部有效,函数外部无任何影响。
4.位置参数
在函数定义阶段按照位置从左往右依次书写的变量名,叫做函数位置形参,位置参数在调用的时候,必须为其传值。
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)
位置实参:在函数的调用阶段,传入的参数会按照位置一一对应给形参
第一种直接按照位置传,一一对应。
第二种指名道姓的传,关键字传字。
my_max(y=20,x=10) my_max(10,y=20) # 位置和关键字混合使用 my_max(20,y=40)
在函数的调用阶段,位置参数和关键字参数可以混合使用,但是必须注意的是位置参数必须在关键字参数的前面(越短的越靠前,越长的越靠后),同一个形参不能被多次使用。
5.默认值参数
在函数的定义阶段,形参(变量名),就已经被赋值了,在调用的时候可以不为默认值形参传值,默认使用定义阶段就已经绑定的值,在调用的时候如果可以给默认值形参传值,传了那么就使用你传的值,在定义阶段,默认值形参必须放在位置形参的后面。
函数无论在什么地方被调用,都会跑到函数定义阶段去执行代码,形参中用到的值都是往函数定义阶段代码网上找。
6.可变长参数
站在调用函数传递实参的角度,实参的个数不固定的情况,也就意味着形参也不固定,站在形参的角度,可以用*和**来接收多余的位置参数和关键字参数。
站在形参的角度看*
形参中的*会将多余位置实参统一用元组的形式处理,传递给*后面的形参名
def func(x,y,*z): print(x,y,z) # z = (3, 4, 5, 6, 7, 8, 54, 43, 4, 5, 6, 6, 7, 8) func(1,2,3,4,5,6,7,8,54,43,4,5,6,6,7,8,)
站在实参角度看*
def func(x,y,z): print(x,y,z) func(a,b,c) func(*[1,2,3,4,5,6]) # *会将列表打散成位置实参一一传入等价于func(1,2,3,4,5,6)
站在形参的角度看**
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就是关键字的名字指向的值,将字典交给**后面的变量名
站在实参的角度看**
def func(x,y,z): print(x,y,z) func(12,3,4) func(x=1,y=2,z=3)
d = {'x':1,'y':1,'z',333}
func(**d) # 等价于func(1,1,333)
***会将字典拆成key = value的形式。
总结*与**
*在形参中能够接受多余的位置参数,组织成一个元组赋值给*后面的变量名
**在形参中能够接受多余的关键字参数,组织成一个字典赋值给**后面的变量名
*在实参中*能够将列表,元祖,集合,字符串打散成位置参数的形式传递给函数(看成for循环取值)
**在实参中,能将字典打散成key = value 的形式,按照关键字参数传递给函数