8月29日学习内容整理:函数参数,函数嵌套
补充:
1、函数要加注释,在定义下面
2、函数的作用:解决代码冗余;提高代码可读性;提高代码重用性;增强代码可扩展性
3、解耦:把大功能拆解成几个小功能,并且功能与功能之间的影响尽量见到最小;不宜把一个很复杂的功能写在一个函数里
一、参数
1、从函数定义的角度上:
(1)位置参数 (a,b) (1,2) 1对应a,2对应b
(2)关键字传参 (a,b) (a=1,b=2)
(3)位置和关键字混用的话必须按照先位置再关键字的顺序传递参数
2、从函数调用的角度上:
(1)按位置传参:必须要传
(2)默认参数:a) 是可以不传的,默认传递的就是设置值
b) 若传递,则变为传入的值
c) 默认参数为不可变数据类型:默认参数的值是函数定义(或者是函数定义上面的代码赋值的)时就确定下来的,不会随着外部代码对参数的改变而导致函数内部 参数的改变
d) 默认参数为可变数据类型(陷阱,要格外注意):这时候参数的值会随着函数的多次调用而发生改变,但要注意的是外部代码对参数的修改依然不会对函数内部 参数产生影响
(3)动态参数:传递多少个参数不知道的情况下
(a) 只针对按位置传参:1、*args 接受按位置传递过来的所有参数,组织成一个元组,*在定义角度上理解为把元素聚合为元组
2、把一整个列表传过来,需要在列表前面加上 *表示打散(函数调用角度)
(b) 只针对按关键子传参:1、 **kwargs 接受按关键字传递过来的所有参数,组织成一个字典,**在定义角度上理解为把关键字参数聚合为字典
2、把一整个字典传过来,需要在字典前面加上 ** 也表示打散(函数调用角度)
(c) 特殊现象:当把元组、字典打散经函数聚合返回后还是原来的元组、字典
(4)三种参数混用的话必须按照 位置参数、*args、默认参数、**kwargs 的顺序
二、函数嵌套
1、嵌套调用:外部函数定义里调用了一个内部函数,当外部函数被调用时内部函数也会被调用执行
2、嵌套定义:
(1)函数定义里又定义了一个内部函数
(2)要想内部函数也被执行,则要在外部函数里定义完后再调用内部函数
(3)新函数如果有参数,为了让它顺利执行,外部函数和调用内部函数的参数都用*args **kwargs表示,这样在调用外部函数时就可以直接传入内部函数需要的参数
举例:注意此种用法外部函数只是起传递作用,所有就用动态参数涵盖所有可能的参数就行了
def func(*args,**kwargs): print(args) #(1,2) --> 1,2,3 print(kwargs) #{'c': 3} def func_inner(a,b,c): print('func_inner',a,b,c) func_inner(*args,**kwargs) func(1,b = 2,c = 3)
(4)作用:为了某些有特定功能的函数不被随意调用