【测试开发】函数进阶-纯函数、内置函数、匿名函数、偏函数

 一、纯函数

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是丸子丫

大佬们来个1毛钱以资鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值