`

花式涵数编程

阅读更多

       

1 美人心计

今日向大家介绍后花园中的3位美人,分别是命令氏、面向对象氏、函数氏。

  • 命令氏,妃,贤妻良母,夫唱妇随,和她在一起四字可形容,简单粗暴;
  • 面向对象氏,嫔,聪明伶俐,足智多谋,心眼一个接着一个,省了我不少事情;
  • 函数氏,贵人,零零后,八面玲珑,火星语乱飞,女孩的心思你别猜。

她们国色天香,楚楚动人,大概是下面这个样子:

2 求和问题

我曾遇到“求和问题”,美人傍身各施其计。问题如下:

  1. 求x和y的和(测试用例:x=1,y=2)
  2. 求x和y的平方的和(测试用例:x=1,y=2)
  3. 求x的m次方和y的n次方的和(测试用例:x=1,y=2,m=3,n=4)

2.1 命令氏

命令氏的方法简单粗暴,可行且有效,但是有些笨拙。定义3个函数sum1sum2sum3,依次解决上面的3个问题。

 

2.2 面向对象氏

面向对象氏的方法要美得多,两个字“优雅”。所以,面向对象氏一直是枕边佳人,恩宠备至。封装、继承、多态是面向对象氏的特色,对于sum函数,传入不同的参数将会触发不同的计算过程。放到C++里描述,sum可以写成2个函数,int Sum::sum(void)int Sum::sum(int, int)

 

2.3 函数氏

函数氏的方法要奇特的多,乍一看有点笨,但却是完全不一样的思想。

解决了今日的“求和问题”,可能会遇到明天的“求差问题”,问题无穷匮也。而我们心中的困惑在于,如何确定编码的粒度,就像做一款产品,哪些功能该加,哪些功能不该加,哪些功能暂时不加,如果某一个功能以后要加,能不能很好的融入到已有的产品中。

3 翻牌函数氏

函数氏的功劳在于抽象出了sum的求解公式:$sum(x,y)=f(x)+g(y)$,非常有数学风啊哈。但是,方案还是有瑕疵。4个函数$f_1,f_2,f_3,f_4$分别用于计算$x_k,k \in \{1,2,3,4\}$。当我们需要计算$x_{k’},k’ \in [1,100]$怎么办?劳心者治人,我们可以做得更漂亮,比如这样。

如果又有一个新的问题,求x的1/m的n次方和y的和(测试用例:x=6,y=6,m=3,n=4),函数氏解决起来会更加酸爽。

可以看到,函数氏最大的魅力在于,函数和数据都可以作为输入,优势很明显,除了喂给你数据,还可以控制你如何吃数据,一切尽在掌握。

3.1 高阶函数(Higher-order Function)

generate_func着实帮了大忙,他可以动态生成函数,而无需人工蛮力定义。除了省时省力,最大的好处是生成的函数有无限个,这是人工所不能及的。

高阶函数就是generate_func这样的函数,要么输入中至少有一个函数,要么输出一个函数,至少满足两个条件中的一个。何谓高阶?高低是需要比较的,人比小兔子要高阶,大学数学比初中数学要高阶,我心里的她要比其他人高阶,这就是高阶。高阶函数比普通意义的函数高阶。

为什么高阶函数更牛逼?有一个词叫“泛化”,是从具体到抽象,抽象可以让我们站在更高的位置看待这芸芸众生,然后悟出什么人生道理。什么模块化、面向对象、设计模式blabla,我们不都是在追求抽象,追求“泛”吗?从一个函数生成无数个函数,这不就是四两拨千斤,一生二二生三嘛!

所以高阶函数实至名归。既然高阶函数这么“泛”,为啥不叫“泛函数”?

高阶函数在数学中也叫做算子(运算符)或泛函。

3.2 闭包(Closure)

当我们使用高阶函数来生成函数的时候,可以使用以下两种方法。方法一是将要生成的函数f写在高阶函数gen_f内部;方法二是将f写在外部。通常我们使用第一种,这就和定义局部变量差不多,在哪用就在哪定义,肥水不流外人田,减少对外界的污染。

一旦我们承认并习惯使用第一种方法的时候,就可能会写出以下风格的代码。

预料之外,情理之中,f就是闭包函数。func作为生成出来的函数,每次调用时都会往array里放一个数字1,而array是在外部的gen_f中定义的。这时就需要作出选择,是修改外部的array还是抛出一个找不到array的错误。支持闭包特性的编程语言选择的是前者。

闭包函数和其引用的变量将一同存在,所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

3.3 柯里化(Currying)

如果我们习惯了生成函数带来的快感,也很有可能写出以下代码。方法一和方法二都实现了同样的功能,不同之处在于方法一每次只传一个参数,而方法二一次性把所有参数传入进去。

尽管方法一看起来有点啰嗦,但这也意味函数氏在我们心中的地位大大提升。有点“后宫佳丽三千,却偏偏宠她一人”的感觉啊哈。

从方法二到方法一的变换称为柯里化,即把接受多个参数的函数变成每次只接受一个参数的函数,并返回接受余下的参数的函数。有点拗口,就是通过多次调用函数来代替一次传入多个参数。

柯里化的优势在于可以将抽象的函数具体化,比如打印日志。

其中,函数curry表示将输入的函数柯里化。

3.4 偏函数(Partial Function)

坏消息是Python并没有提供curry函数,好消息是有一些第三方的可以实现该效果,比如https://github.com/kachayev/fn.py,这个库可以给Python插上函数式编程的翅膀。

Python的内置functools模块提供了类似curry的功能,名曰偏函数。

柯里化和偏函数类似但不同,柯里化是将多参数函数转变为一系列单参数函数的链式调用,而偏函数是事先固定好一部分参数后面就无需重复传入了。两者都可以实现函数的具体化,固定函数的一部分参数来达到特定的应用。

3.5 匿名函数

使用函数原来可以如此之爽,恩,函数有意思。但是函数的定义着实是个麻烦,我们曾经写过以下代码。

烦。此时,匿名函数的威力便可发挥出来了,如下。lambda可以使我们达到快速定义并使用函数的效果,绿色无污染,干净利索,棒!

 

3.6 map、reduce、filter

map、reduce、filter是Python内置的高阶函数,通过传入函数可以实现某些特定的功能,通过使用这些函数可以让代码更加简洁,逼格更上一层楼。

 

参考

分享到:
评论

相关推荐

    基于PLC编程的花式喷泉毕业设计.doc

    基于PLC编程的花式喷泉毕业设计 本设计讲述了如何利用PLC控制喷泉喷水方式,产生各种样式,并给出了花式喷泉的喷水花样。PLC控制喷泉系统具有使用方便、运行可靠、控制程序设计简单等优点。使用梯形图方法编程,...

    花式喷泉的PLC控制毕业设计

    随着可编程控制器在我国的迅速发展,对花式喷泉的控制要求也越来越高,使得越来越多的控制部分需要可编程控制器来实现。 本文旨在设计一个基于PLC的花式喷泉控制系统,以S7-300系列PLC作为喷泉的控制器。通过对花式...

    花式喷水池装置PLC控制梯形图的设计与调试.pdf

    花式喷水池装置PLC控制梯形图的设计与调试 一、PLC控制系统的设计 PLC(Programmable Logic Controller)是一种可编程的逻辑控制器,广泛应用于工业自动化控制领域。PLC控制系统的设计是指根据控制要求,选择合适...

    基于PLC的花式喷水池控制

    基于PLC的花式喷水池控制 本文对基于PLC的花式喷水池控制系统进行了详细的设计和实现。该系统使用PLC控制器来控制花式喷水池的喷水顺序和 timing。系统主要由四个部分组成:硬件配置、输入/输出设备、PLC编程和系统...

    基于PLC的花式喷泉系统设计,花式喷泉池装置PLC程序设计论文

    基于给定文件的信息,本文将深入探讨“基于PLC的花式喷泉系统设计”的关键技术点,包括PLC(可编程逻辑控制器)的选择与配置、系统控制方案的确定、组态软件MCGS的应用以及系统梯形图的设计等方面。 ### 重要知识点...

    花式喷泉 PLC

    "花式喷泉 PLC" 根据提供的文件信息,我们可以总结出以下几个知识点: 1.坐标式机械手 PLC 控制系统的设计方法: 结合实验一坐标式机械手 PLC 控制程序设计与调试,我们可以掌握坐标式机械手 PLC 控制系统的设计...

    基于S7-200花式喷泉PLC控制设计的方法研究.pdf

    在花式喷泉控制应用中,S7-200 PLC通过编程可以精确控制喷泉的启动、停止、定时以及花样变化等功能。 在实施基于S7-200 PLC控制的花式喷泉项目时,首先需要确定控制要求,然后选择合适的控制原则。例如,根据花式...

    VC.net 开发的3D花式魔方,代码不完整.rar

     新增功能:花式魔方,在菜单中FigureCube可以使魔方旋转成多种花式。共有45中花式,参考了www.Rubiker.cn中的花式魔方公式。每点击一次菜单,就会显示下一种花式,45中花式循环显示。由于可能在整理时把花式公式弄...

    三菱PLC在花式喷泉控制系统中的应用.pdf

    三菱PLC(可编程逻辑控制器)因其强大的控制功能、高可靠性和良好的用户接口,在花式喷泉控制系统中得到了广泛应用。 在讨论三菱PLC在花式喷泉控制系统中的具体应用之前,首先需要了解PLC的基本原理和结构。PLC是一...

    花式喷泉的PLC控制及组态监控.pdf

    根据提供的文件信息,本文主要涉及了PLC(可编程逻辑控制器)在花式喷泉控制系统中的应用以及组态监控的作用。下面将分别介绍这些知识点: 1. 可编程控制器(PLC)简介 PLC是一种在工业环境中应用广泛的电子装置,...

    单片机LED灯花式闪烁电路图及程序

    单片机LED灯花式闪烁电路及程序设计涉及了硬件连接和软件编程两个方面,本文将围绕这两块内容展开讨论,详细解释相关知识点。 首先,在硬件电路连接方面,LED灯的控制是通过单片机的I/O端口实现的。在单片机系统中...

    毕业设计(论文)-花式喷水池的PLC控制系统设计.doc

    本文档讨论了花式喷水池控制系统的设计和实现,系统使用可编程控制器(PLC)作为主控制器,以实现对花式喷水池的全程控制。该系统结合气动装置、传感技术、位置控制等技术,具有自动化程度高、运行稳定、精度高、易...

    单片机控制系统的花式喷泉设计

    单片机控制系统的花式喷泉设计 本资源主要介绍基于单片机控制系统的花式喷泉设计,涵盖了单片机控制系统的软件、硬件设计方法和步骤,旨在提高思维逻辑判断能力,训练自我综合运用已学课程的基本知识,独立进行...

    PLC和变频器的花式喷泉设计.doc

    PLC在花式喷泉设计中扮演着核心控制器的角色,它可以根据用户的需求进行编程,从而实现对花式喷泉的自动控制。PLC可以控制水泵的启动和停止、喷水高度的调整、灯光的照明和灭暗等功能。同时,PLC也可以与变频器进行...

    毕业设计:花式喷泉的PLC控制设计(完整版)资料.doc

    毕业设计:花式喷泉的PLC控制设计(完整版)资料 毕业设计:花式喷泉的PLC控制设计(完整版)资料是关于毕业设计的花式喷泉PLC控制设计的详细报告。该报告分为八个章节,分别是绪论、系统控制方案的确定、系统硬件...

    3、智能小车指定花式动作_基于audrino小车的花式动作程序_

    基于audrino小车的花式动作包括多种观赏性的动作展示

    本科毕业论文---基于plc的花式喷泉设计.doc

    基于 PLC 的花式喷泉设计知识点总结 PLC(Programmable Logic Controller,程序化逻辑控制器)是一种广泛应用于工业自动化控制领域的设备。它可以根据用户的需求编程,实现各种自动控制任务。在本科毕业论文中,...

    学位论文—基于三菱plc控制的花式喷泉系统.doc

    该系统通过三菱PLC的控制功能,来满足人们对视觉的需求,实现了利用三菱PLC控制的花式喷泉的功能,具有接线简便、编程轻松、扩展容易等特点。 知识点: 1. PLC(Programmable Logic Controller):是一种专门为在...

    基于三菱PLC控制的花式喷泉系统毕业论文.doc

    基于三菱PLC控制的花式喷泉系统毕业论文 概述: 本文主要介绍了基于三菱PLC控制的花式喷泉系统的设计和实现。该系统的核心是三菱PLC,它可以通过控制各种类型的机械或生产过程来满足人们对视觉的需求。该系统具有...

Global site tag (gtag.js) - Google Analytics