|
函数是python里组织代码的最小单元
一、定义
1、定义def fn(参数):
2、函数有输入(参数)和输出(返回值)
3、传入的参数与函数定义时要匹配
4、按照定义的顺序传入参数,这样的方法叫位置参数,和关键字参数混用时,必须在前面
5、按照定义时的变量名传递,叫关键字参数,和顺序无关
二、参数
1、参数默认值,带默认值的必须在不带的之后
def inc(x,y=1):
2、可变参数(函数定义时)
位置可变参数:参数前加一个星号,构成元祖,只能位置参数传参。
关键字可变参数:参数前加二个星号,构成字典,只能关键字参数传参。
可以一起使用,但是位置可变参数必须在前
3、通常来说
默认参数靠后
可变参数靠后
默认参数和可变参数不同时出现
三、参数解构(函数调用时)
1、add(星号t) #加一个星号可以把可迭代对象解构成位置参数
2、add(星号星号t) #加二个星号,可以把字典解构成关键字参数,key必选是str
四、keyword-only 参数(python3添加)
1、def fn(星号,x): #星号之后的参数只能通过关键字参数调用
2、可变位置参数之后的参数也是
3、可以有默认值,可以和默认值一起出现
五、函数的返回值
1、return除了返回值且结束函数
2、可以出现多个return,执行到那个返回那个且结束函数
3、当函数没有return语句时,隐式返回none
4、当函数需要返回多个值时,可以使用封装把返回值封装成元组
5、不返回值,可以用return即可。返回none,通常用于结束函数
六、函数可以嵌套定义
七、作用域
1、作用域是一个变量的可见范围,叫这个变量的作用域
2、函数内部是一个局部的作用域,不能直接使用全局作用域的变量
3、变量的作用域为定义此变量的作用域
4、上级作用域对下级作用域来说是只读可见
八、全局变量
1、global x #可以把x提升为全局变量,但是并没有定义变量
九、闭包
1、函数已经结束,但是函数内部变量的引用还在,python闭包可以用可变容器实现,这是python2的唯一方式
2、python3可以用nolocal标记一个变量由上级作用域定义,可读可写
十、函数也是对象,参数是函数对象的属性,所以函数参数的作用域伴随函数的整个生命周期
十一、函数的结束
1、定义在全局作用域的
重新定义、del删除、程序结束退出
2、局部作用域
重新定义、del删除、上级作用域被销毁
十二、递归函数
类似求斐波那契数列,非常消耗cpu,层次不能太深,尽量不使用。
sys.getrecursionlimit() #获取系统最大层次
def fn(n): if n < 2:
return 1
return fn(n-1) + fn(n-2)
十三、匿名函数
1、lanbda来定义
2、参数列表不需要小括号
3、冒号不是用来开启新的语句块
4、没有return,最后一个表达式的值即返回值
5、只有写在一行上,单行函数
6、普通函数所支持的变化,匿名函数也支持
十四、生成器
带yield语句的函数称之为生成器函数。生成器函数的返回值是生成器
1、生成器执行的时候不会执行函数体
2、当next生成器的时候,当前代码会执行到一个yield,会弹出值,并且暂停函数,当再次执行的时候,从上次暂停出继续,当没有多余yield,会抛出stopiteration异常,异常的值是函数返回值
3、生成器是惰性求值
4、计数器
def count(): def inc():
x=0
while True:
x += 1
yield x
c = inc()
return lambda:next(c)
5、用生成器解决递归问题
6、用生成器进行协成调度
十五、高阶函数
返回函数或者参数是函数的函数
1、python中函数是一等对象,也可以像普通对象一样赋值、作为参数、作为返回值
2、函数返回值,通常是用于闭包场景,需要封装一些变量
3、函数作为参数,通常用于逻辑固定,少部分逻辑不固定 |
|
|