为了给别人讲一下函数,就简单总结了一下,没什么用,懒得举例子了。(还有闭包和装饰器没有写到,有时间在写吧!)
一、函数的定义:
函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
def 函数名(参数,默认参数,长度可变参数):
"""注释(fun.__doc__)""" #可以不要,也可以在之后通过fun.__doc__ = ''赋值
函数体
二、函数的调用
fun()
python和其他语言一样,不允许在声明之前对其引用或者调用。
换句话说,只要在函数(变量)调用之前定义即可
三、函数的引用
fun
在python中,一切皆对象,函数也可以作为参数或者函数的返回值使用。
四、函数的参数
1.函数参数的分类:
(1)普通参数(位置参数)
列表,函数,字典都可以直接用一个参数表示
(2)默认值参数
fun(a=1,b=2):pass
(3)可变长度参数
非关键字可边长参数(元组)
def fun(*arg):pass
调用:
fun(0,1,2,3,)
关键字变量参数(字典)
def fun(**arg):pass
调用:
fun(x = 50,name = ‘tom’)
(4)关键字参数
关键字参数不是定义函数的时候的形参,而是指函数调用时,可以通过关键字参数,使实参传递给形参时摆脱位置的对照。
def fun(a,b,c):pass
通过关键字参数调用:
fun(b=1,c=5,a=6)
2.其他
(1)可以使用“函数名.__defaults__”查看所有默认参数的当前值,返回值为一个元组
(2)函数参数传递的时候,是‘=’操作,不是深浅拷贝,这就造成了在函数里改变原来的列表某一项的值,原来的列表中的值也会改变。
(3)传递参数时,可以通过在实参序列前加一个星号将其解包,然后传递给多个单变量形参。序列解包相当于位置参数,优先处理。(调用得时候的顺序为fun(*arg,位置参数,关键字参数,**arg))。
五、函数的返回值
函数的返回值有三种类型,
(1)没有 return 语句
调用函数返回值为None。
(2)有return语句,只有一个返回值
函数返回语句为:return a 调用后返回的类型为,如果a是列表,返回的就是列表,如果a是其它类型,返回的就是其他类型
(3)有return语句,有多个返回值
函数返回语句为:return a,b,c
调用后返回的类型为以a,b,c,为元素的元组:(a,b,c)
六、函数的作用域:
python中的作用域分4种情况:
L:local,局部作用域,即函数中定义的变量;
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:globa,全局变量,就是模块级别定义的变量;
B:built-in,系统固定模块里面的变量,比如int, bytearray等。
搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。
作用域小结
(1)只有模块、类、及函数才能引入新作用域;
(3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;
(4)内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字。nonlocal是python3新增的关键字。
七、递归函数:
(1)定义:
在一个函数的内部调用自身,就是递归函数
(2)特点:
1.必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)
4.所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。