在Python中,lambda是一个有趣的关键字,它用于定义简单的匿名函数。匿名函数的概念,是指没有与特定变量绑定的函数。也就是除了定义的那一刻可以引用该函数之外,你无法通过任何方式再次引用它了。这类似于我们熟知的立即数,因此我给由lambda语法定义的匿名函数起了个新名字:立即函数。存在即是真理,Python中引入了lambda语法,引入了匿名函数的概念,它所坚持的真理又是什么呢?
        假设我们已经有了这样一个函数定义:

def func(x, y):
    print x, y

在我们调用一个函数或者说一个方法的时候,调用方式可以是这样的:

a, b = "Hello", 1
func(a, b)

也可以是这样的:

func("Hello", 1)

那么这两种调用方式有什么不同呢?是的,这个例子真的太简单了,以至于你会马上发现它们之间的不同,也正是由于它太简单了,你也会觉得比较两者的区别简直就是在钻牛角尖。别着急,这简单的背后隐含的内容可不简单。很明显,第一种调用方式比第二种多出了两个变量,也多出两个赋值的语句(statement),在函数调用的时候通过变量引用具体的值;而第二种方式则是直接以具体的值作为参数,没有变量与这些值绑定。如果"Hello"和1使用的次数不多,那么第二种直接的调用方式会更为高效,毕竟在某个(可能会是全局)范围内,你不需要将"Hello"和1绑定到某个变量,所开辟的内存空间也可以及早地被回收,更重要的是减少不必要的错误!在一个复杂的应用程序中,变量就如同于一个状态机,变量的改变有些时候是程序能够执行的驱动力,有时候则是程序正常执行的绊脚石。作为程序员,我们需要跟踪并熟知这些变量的状态(当前值是什么),否则就很容易编写出错误的程序,而在现实中,大多数程序错误都会来源于你所使用的变量值与你所预期的不一致。说到这里,你应该会想起使用Debugger调试程序的痛苦经历,也会想起为一些让人迷惑的变量增加一个个Watch以便确定它们某个状态值的繁琐过程,我想,你也应该明白“减少不必要的错误”指的是什么了:减少变量定义,减少statement,也就减少了side-effect,最终减少了程序员的负担。在这里,我们引出了另外一个需要关注的新概念——side-effect。
        其实side-effect的含义在上面的文字中已经隐约提到了(上文红色字的部分),以下是引用自Wikipedia的定义:In computer science, a function is said to produce a side-effect if it modifies some state other than its return value。side-effect是一把双刃剑,不同的语言对它有着不同的态度:Imperative programming Language(命令式编程语言,譬如C++、C#和汇编)是充分利用了side-effect来驱动程序的运行;而Declarative programming Language(声明式编程语言,譬如SQL和Haskell。Functional programming Language是它的重要组成部分)则是在最大程度上限制side-effect。这里又是三个新的概念,大家从给出例子中应该可以对这两种语言有一个感性的认识,我就不做解释了,以上给出的链接提供了更为详细的内容。
        对于命令式编程语言,大家肯定是最为熟悉的,因为我敢说99%的程序员都在使用命令式编程语言。那么你对以上提到的利用side-effect驱动程序的运行的理解又有多少呢?其实,这并非是一个深奥的问题,因为这在程序中几乎无所不在,一个很简单的例子就是循环中用于条件判断的变量,如果我们恰当地定义了循环的起始和终止条件,那么我们就会得到一个预期的有限次数的循环,一旦定义错误,死循环也就不可避免了。而对于声明式编程而言,大家可能就相对了解得比较少了,可能对Functional Programming Language了解得更多一些。Functional Programming Language所关注的是定义,也就是程序需要处理的内容,而不是如何去处理,关注的是what,而非how。在最为纯粹的Functional Programming中,定义就是程序的全部。说到这里,你或许会像我第一次接触Functional Programming的时候一样,觉得很诧异,光有定义的程序能够被执行吗?想想一条SQL的执行,解答疑惑也就有了线索。是的,当定义碰上分析定义的Engine,定义也就有了生命。限制side-effect是Functional Programming Language的重要特性之一,而限制side-effect的最简单手段就是减少变量的使用,减少statement。在真正纯粹的Function Programming Language中,是不会有statement存在的。
        好了,要提到的概念都陆续登场了,最开始提到的问题还是给出答案呢。啊,你忘了是什么问题啦?嗯,嗯,看来我真的太罗嗦了。不过,你在回头看看问题的时候,你的心里是不是也有了答案呢?
        在Python中OO机制虽然足够强大,但由于Python本身更加注重Functional Programming,function才是名副其实的first class。Python中的function几乎无所不能,一个Python程序的功能几乎都依赖于function的定义,而function本身更是可以操作其他function,甚至还能动态生成class!然而在没有lambda之前,function是离不开def的,def就相当于function的statement,阻碍着Python充当一个纯粹Functional Programming的角色。因此,利用lambda将function平民化,让function也能像上面"Hello"和1那样自然地扮演function参数的角色,这无疑是一个漂亮的设计。依靠lambda,Python可以做到最纯粹的Functional Programming——这就是问题的答案。以下这篇文章来自著名的Charming Python系列:Functional Programming In Pytthon,它会给你更多的启示。我相信你在阅读的过程中会惊喜的发现,程序原来也可以这样写的。
         说的都是概念,看完以后可别忘了练一练。:)

说的都是概念——有关编程范式相关推荐

  1. 基于对象和面向对象编程范式辨析和主流编程语言中的应用

    基于对象和面向对象编程范式辨析和主流编程语言中的应用 前言 本文的目的是想告诉大家,为什么C++的模板这么强大.为什么Ruby的Duck Typing(像鸭子那样编程)这么强大! 基于对象和面向对象编 ...

  2. 如何写出更优雅的代码——编程范式简述

    <如何写出更优雅的代码--编程范式简述>源站链接,阅读体检更佳! 什么是程序? 1976年,瑞士计算机科学家,Algol W,Modula,Oberon 和 Pascal 语言的设计师 N ...

  3. python标准库很丰富支持多种编程范式_计算机考试简答题

    1 .简述 python 的特点: Python 具有简单易学,免费.开源,可扩展性.可嵌人性和可移植性强,代码规范.代 码具有较好可读性, Python 标准库很丰富,支持命令式编程.面向对象程序设 ...

  4. 编程范式,程序员的编程世界观

    编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式(Paradigm)以及编程范式等术语渐 ...

  5. 再谈编程范式-程序语言背后的思想

    link link 编程范式 托马斯.库尔提出"科学的革命"的范式论后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词.编程范式一般包括三个方面,以OOP ...

  6. 从零开始入门 K8s | Kubernetes API 编程范式

    作者 | 陈显鹭  阿里巴巴高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 23 讲,点击"阅读原文"直达课程页面. 关注"阿里 ...

  7. Flutter React编程范式实践

    作者:闲鱼技术-匠修 Flutter Widget的设计灵感来源于React,是一款原生就立足于响应式的UI框架.本文基于Flutter特点,试图结合闲鱼在Flutter的工程应用来谈下我们对Flut ...

  8. 编程范式,程序员的编程世界观(转)

    编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式(Paradigm)以及编程范式等术语渐 ...

  9. Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法...

    1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...

最新文章

  1. mongodb一致性协议_mongodb副本集用一致性快照方法添加从节点步骤
  2. MySQL慢查询日志ES索引模板
  3. requests用法
  4. 【数据库系统概论】考研第三部分重点分析【3.1】
  5. 如何显示Organization unit ID
  6. 计算机网断IP修改,修改计算机名、IP
  7. 俄罗斯将封杀LinkedIn 推动个人数据本地化
  8. 开源开放 | 细粒度可循证医学文档知识融合表示和推理(CCKS2021)
  9. “3D几何与视觉技术”全球在线研讨会第九期~识别3D中的物体和场景
  10. c语言学习-输入一个十进制数,输出其对应的八进制数据
  11. ssh远程连接不上linux
  12. Ciesz się Polską
  13. HttpURLConnection模拟form表单提交文件
  14. 【历史上的今天】11 月 22 日:PHP 创始人诞生;2020 年图灵奖得主出生;IE 2.0 发布
  15. DIRECTSHOW中的视频捕捉
  16. MAC怎样显示隐藏文件
  17. 排序(使用插入法对数组元素从小到大排序)
  18. YouTube embed gives “restricted from playback on certain sites” error despite API metadata indicatin
  19. python小白逆袭大神_python小白逆天(3),Python,小白逆袭,大神,三
  20. html做图片模糊效果,CSS3 filter(滤镜) 制作图片高斯模糊无需JS

热门文章

  1. 2 0 1 8 全球人工智能技术大会--邀请函
  2. Linux学习 Unit 12
  3. 墨卡托坐标转换成经纬度
  4. ../include/my_global.h:1107: 错误:对 C++ 内建类型‘bool’的重声明
  5. 用lambda对std::list排序 - 力为的技术博客 - C++博客
  6. 终于决定要写写东西了
  7. Google 开源 AdaNet:快速灵活的轻量级 AutoML 框架
  8. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
  9. iOS截取NSString字符串
  10. 也谈架构:百万pv项目与虚拟化