【测试开发】函数进阶-纯函数、内置函数、匿名函数、偏函数
一、纯函数
1、纯函数概念
一个函数的返回结果,只依赖于它的参数,并且在执行过程中没有副作用,此类函数叫纯函数
2、纯函数的原则
1、变量都只在函数作用域内获取,作为函数的参数传入
2、不会产生副作用(side effects),不会改变被传入的数据或者其他数据(全局变量)
3、相同的输入保证相同的输出
3、函数的副作用
副作用是指函数被调用,完成了函数既定的计算任务,但同时因为访问了外部数据,尤其是因为对外部数据进行了写操作,从而一定程度地改变了系统环境
4、举例代码
# 函数func1返回的结果为两个参数相加的结果
def func1(a, b):return a + b# 函数func2返回的结果为参数a和外部变量var1相加的结果
var1 = 100
def func2(a):reuturn var1+a
二、内置函数
1、map函数:会根据提供的函数对指定序列做映射
将返回值取出,根据返回值是true还是false,输出数据
将可迭代对象的数据拿出来,每一个元素都传入函数运行,将函数的返回值添加到新列表中,统一处理一批数据时,可用此函数
def fun(n):return n*2
li = [1,2,122,331,11,22,33,4,6,8]
res = map(fun, li)
print(list(res))
2、filter函数:函数用于过滤序列
def fun(n):return n<10
li = [1,2,122,331,11,22,33,4,6,8]
res = filter(fun, li) # 过滤作用,满足fun函数的过滤条件就输出
print(list(res))
3、zip函数:函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组
当列表长度不一时,取最短长度输出
res = zip([1,2,3],[11,22,33,44],[111,222,333])
print (list(res))
二、匿名函数lambda,适用场景:简单的函数定义,只有一个表达式
res = lambda a,b:a+b
print(res(11,22))
与filter同功能的写法
li = [1,2,122,331,11,22,33,4,6,8]
res = filter(lambda x:x<10, li)
print(list(res))
推导式写法
li = [(lambda x:x%5==0)(i) for i in range(10)]
print(li) #输出结果为True False
三、偏函数
当函数的参数个数太多,需要简化时,可以使用functools.partial创建一个新函数,此函数可以固定住原函数的部分参数,从而在调用时更简单
如filter,调用时传入2个参数,第一个函数,第二个是我们需要过滤的可迭代类型的数据
例题:
要获取如下各列表中数据中大于5的数据 li1 = [1,5,8,10,20] li2 = [2,22,33,44] li3 = [3,44,1,33,44,5]
写法一:直接使用 filter
# 要获取数据中大于5的数据
li1 = [1,5,8,10,20]
li2 = [2,22,33,44]
li3 = [3,44,1,33,44,5]# 写法1
res1 = filter(lambda x: x > 5, li1)
res2 = filter(lambda x: x > 5, li2)
res3 = filter(lambda x: x > 5, li3)
print(list(res1))
print(list(res2))
print(list(res3))
写法二 :自定义函数,在函数中调用filter
# 要获取数据中大于5的数据
li1 = [1,5,8,10,20]
li2 = [2,22,33,44]
li3 = [3,44,1,33,44,5]# 写法2
def filter2(iter):return filter(lambda x: x > 5, iter)
print(list(filter2(li1))) # 不加list返回的是filter迭代器
print(list(filter2(li2)))
print(type(filter2(li2)))
写法三:partial(filter, lambda 条件)
# 要获取数据中大于5的数据
li1 = [1,5,8,10,20]
li2 = [2,22,33,44]
li3 = [3,44,1,33,44,5]# 写法3
filter3 = partial(filter, lambda x: x > 5)
print(list(filter3(li1)))
四、三目运算符
a = 10
print(10) if a>10 else print(0)