-
函数的作用意义
方便代码重用;分解任务简化程序逻辑;使代码更加模块化
-
函数的定义
def 函数名(参数1,参数2,.....):
函数体
注意缩进
Python中使用缩进标注同一代码块
*参数,表示函数以元组的形式接受传进来的数据
**参数,表示函数以字典的形式接受传进来的数据
-
参数的拆包与装包
拆包:将集合参数分解成单独的个体,称为拆包;
装包:将传递进来的参数包装成一个集合,称为装包;
-
函数的返回值
return 你要返回的值
如果要返回多个元素,需要将其包装成一个集合,或者元组,或者字典,返回后进行拆包就可以了;
-
偏函数
概念:很多多参数函数大多数场景下大部分的参数可能不要改变,为了简便操作,我们重新定义一个新函数,指定需要使用的函数的某个参数为某个固定的值,这个新函数就称为“偏函数”,下面代码中test2 就是test的偏函数;
def test(a,b,c,d):
return a+b+c+c
def test2(a,b,c,d = 2)
test(a,b,c,d)
test2(a,b,c)
#还可以使用系统函数来创建偏函数
import functools
test2 = functools.partial(test, d = 2)
test2(a,b,c)
-
高阶函数
概念:当一个函数A的参数,就收的是另一个函数时,则把这个函数A称为是“高阶函数”,比如下图中的sorted函数接受了getkey这个函数为参数,那么sorted就是高阶函数;
l =[{"a":"aa", "b":24},{"a":"ab", "b":21},{"a":"ba", "b":64}]
def getkey(x):
return x["a"]
sorted(l, key = getkey)
-
返回函数
概念:函数内部的返回值是另外一个函数;
def f(flag):
def f1(a,b,c)
return a+b+c
def f2(a,d,c)
return a-b+c
if flag == "+"
return f1
else
return f2
result = f("+")
num = result(1,2,3)
-
匿名函数
概念:没有名字的函数;
语法:lambda 参数1,参数2,…:执行语句(执行语句只能有一句)
#使用方法一:
res = (lambda x,y : x+y)(1,2)
print(res)
#使用方法二:
newFunc = lambda x,y : x+y
res = newFunc(1,2)
print(res)
-
闭包
概念:函数嵌套的基础上,内层函数以及内层函数引用的外层变量整体称为“闭包”,下面案例中,inFunc(a,b)函数整体使用了外部函数的参数/变量,那么它整体就称为“闭包”;
#案例1
def outFunc(a,b)
def inFunc(a,b)
print(a+b)
#案例2
def outFunc()
a = 10
def inFunc()
nonlocal a
print(a)
#注意事项
1.若要在闭包内修改外部变量,需要使用nonlocal声明,否则为新变量定义
-
装饰器
概念:在函数名及函数体不改变的前提下,为函数附加一些额外的代码;装饰器是一种设计模式,只要满足在不修改原本函数的基础上,增加额外功能就可以称为装饰器;
在Python中可以直接在要装饰的函数之前使用“@”后面加上要装饰函数;
-
生成器函数
概念:是一种特殊的迭代器(抽象层次更高);生成器只会遍历一次;遇到return语句会抛出迭代器停止异常;
创建方式:
1.把列表推导式的[]换成():l = (i for i in range(1,100) if i % 2 == 0)
for i in l:
print(i)
2.生成器函数:#函数中要包含yield语句
#函数执行的结果就是一个生成器
def test():
print("xxx")
for i in range(1, 100):
yield i
print(i, "+yield")
g = test()
print(next(g))
print(next(g))
产生数据的方式:
通过访问迭代器的方式访问数据,三种方式:next(生成器), 生成器.-next-()和for in等三种方法;send(指定上一次挂起的yield语句的返回值)函数:
第一次调用时要传一个None进去;
相比于生成器.-next-(),send(参数)语句可以额外传递一个值给上一次操作被挂起的yield语句;关闭生成器:
生成器.close();
停止的原理是将生成器移动到最后一个来实现移动停止;