Python成为专业人士笔记–函数式编程

“专业人士笔记”系列目录:

创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!

概述

函数式编程将问题分解为一组函数,理想情况下,函数只接受输入并产生输出,不具有影响给定输入产生的输出的任何内部状态。下面是许多语言通用的函数技术:例如lambda、map、reduce和filter

Lambda 匿名函数

用lambda定义的匿名内联函数:lambda的参数定义在冒号的左侧。函数体定义在冒号的右侧,运行函数体的结果将会隐式返回。

        s = lambda x: x * x
print(s(2))

#输出: 4 ,计算过程: 传入2, 计算2*2
      

Map 映射函数

Map接受一个函数参数和一个集合类型参数;它首先创建一个新的空集合,对原始集合中的每个项运行函数,并将每个返回值插入新集合中;最终返回新的集合类型变量

        name_lengths = map(len, ["Mary", "Isla", "Sam"])
print(list(name_lengths))

#注意:在python3中,map函数返回的为迭代器对象,可以强制转成任何集成类型
      

Reduce 归约函数

Reduce接受一个函数参数和一个集合类型参数。它返回一个通过集合参数中两两计算后的值

这是一个简单的reduce函数使用,它返回集合中两两计算的和 :

        from functools import reduce

total = reduce(lambda a, x: a + x, [0, 1, 2, 3, 4])
print(total)

# 10  ,计算过程 : 是两两相加,0+1+2+3+4
# 注意:参数不能超过2个
      

Filter 过滤函数

Filter接受一个函数参数和一个集合类型参数。它返回每一项符合过滤条件的集合类型元素

        arr = [1, 2, 3, 4, 5, 6]
print([i for i in filter(lambda x: x > 4, arr)])

#输出:[5, 6]
      

Partial 偏函数

如果你学过其它面向对象编程语言,那么可能知道抽象公共类并使用它创建自定义类是一种常用的做法;那么如果自定义一个抽象函数并将其定制化,以创建它的不同版本,情况会如何?可以认为这是一种函数继承,在这种继承中绑定特定的参数以使它们在特定场景中可靠

假设我们建立一个函数并求x的y次方,你将会这样写:

        def raise_power(x, y):
    return x**y

      

如果y变量的值变为若干个值会怎么样?

让我们假设y只能是[3,4,5]中的一个,并且假设不想向最终用户提供测试函数是否正确的可能性,因为指数运算是极其耗资源的。事实上,你可以提前检查y是否为一个有效值,并将函数重写为 :

        def raises(x, y):

    if y in (3, 4, 5):

        return x ** y

    raise Exception("你需要提供一个有效的指数值")


print(raises(2,8))

#报错:raise Exception("你需要提供一个有效的指数值")
      

是否有些混乱?让我们使用偏函数形式并将其指定为所有三种情况:

        def raises(x, y):

    if y in (3, 4, 5):

        return x ** y

    raise Exception("你需要提供一个有效的指数值")


from functools import partial

#下面都是基于raises抽象函数定制出来的
raise_to_three = partial(raises, y=3)
raise_to_four = partial(raises, y=4)
raise_to_five = partial(raises, y=5)


print(raise_to_three(2));
#调用此函数,将直接求出2的3次方且不可能有任何异常; 函数的调用会简单方便很多

      

这里发生了什么?我们固定了y参数,定义了三个不同的函数

现在,我们已经可以利用partial轻松的从抽象函数中生成自己的定制函数,能大大的简化函数的多次调用以及内部固定值判断的问题

今天的分享就到这里,禁止转载,违者必究

猜你喜欢

转载自blog.csdn.net/oSuiYing12/article/details/106211761