前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >函数式编程(0)

函数式编程(0)

作者头像
云深无际
发布2021-04-14 11:07:09
4650
发布2021-04-14 11:07:09
举报
文章被收录于专栏:云深之无迹云深之无迹

函数式编程通过在函数中定义表达式和对表达式求值完成计算.它尽量避免由于状态变化和使用可变对象映入复杂性,让程序变得更加简洁明了.

关于编程范式来讲并没有统一得划分标准.主要把函数式和命令式编程来做比较.二者之间得特征区别就是状态.

在命令式语言中,计算得状态时通过不同的命名空间中变量来反应的.变量的值决定计算得当前状态,一条语句通过增加或改变(删除)变量来改变当前状态.

主要关注赋值语句以及它如何改变状态。理想状态下,每一条语句通过改变状态,推动计算从初始状态向期望的最终结果不断靠近。然而,这种“推动计算一步步向前”的模式难以验证。需要首先定义出最终状态,找到能达到该状态的语句,从而推导出达到该状态需要的前提条件,然后重复上述步骤,直到找到一个可接受的初始状态。

在函数式语言中,使用“对函数求值”这一更简单的概念代替改变变量值的“状态”,每次对函数求值都会在现有对象的基础上创建一个或多个新对象。

函数式程序即函数的组合,相应的开发过程是:首先设计一组易于理解的底层函数,然后在此基础上设计符合业务需求的高级函数。相比于由复杂的流程控制组成的指令集合,高级函数更容易可视化。

形式上,函数求值更接近算法的数学表达。以简单的代数形式设计算法,便于处理特殊情况和边界条件,而且函数更有可能按照预期工作,也便于编写单元测试用例。

请注意,通常函数式程序比功能相同的命令式(面向对象或者过程式的)程序更加简洁明了和高效,但这些优点并不是自然而然的,需要仔细地设计,但付出的努力通常少于设计功能类似的过程式程序。

这些代码是细分过程范式

很纯得一段代码,严格得过程式代码

面向对象编写的

纯粹得面向对象编写


前面3个例子都基于变量值显式确定程序的状态,使用赋值语句改变变量值,推动计算前进。我们可以在程序中插入assert语句,确保程序状态完全按照要求变化。

关键之处不是命令式编程存在某种缺陷,而是函数式编程是一种思维方式的转变,这种改变适用于许多场景。如何用函数式方法编写同一个算法,你会发现函数式编程并没有使算法显著变短或变快。

使用函数式范式

在函数式编程中,求3或5的倍数可分为两部分。

❏ 对一系列数值求和。

❏ 生成一个满足某个条件的序列,例如3或5的倍数组成的序列。

一个列表的和的递归形式定义如下。

代码语言:javascript
复制
 def sumr(seq):
            if len(seq) == 0: return 0
            return seq[0] + sumr(seq[1:])

可以把序列的和分为两种情况。基础形式:一个长度为0的序列,和为0。递归形式:序列的和等于序列中的第一个元素加上序列中后续元素的和。

由于递归形式的序列长度小于原序列,所以任何长度有限的序列最终都会退化为基础形式。

该函数运行示例如下。

代码语言:javascript
复制
        >>> sumr([7, 11])
        18
        >>> 7+sumr([11])
        18
        >>> 18+sumr([])
        0

第一个例子计算了包含多个值的列表之和。第二个例子演示了递归规则将第一个值seq[0]和后续所有值的和seq[1:]相加。最后一个计算包含了对空列表求和,其值定义为0。

这个例子中,代码最后一行的+运算符和初始值0表明其为求和。如果将运算符从+改为*,将初始值从0改为1,则表明其为序列乘积。

剩下得明天继续写,大家晚安



本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档