`

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

阅读更多

        在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 楼 lanxiaoshuang 2007-06-13  
写的真好

相关推荐

    冒号课堂——编程范式与OOP思想

    编程范式是软件开发中的一个重要概念,它定义了如何组织代码和解决问题的风格。主要的编程范式有过程式、函数式、面向对象(OOP)以及声明式等。本讲义将深入探讨编程范式及其核心思想,尤其是重点讲解面向对象编程...

    《冒号课堂——编程范式与OOP思想》电子书.txt

    根据提供的文件信息,本文将对《冒号课堂——编程范式与OOP思想》电子书进行深入解析,重点探讨编程范式与面向对象编程(Object-Oriented Programming, OOP)的相关概念及其在实际开发中的应用。 ### 编程范式与OOP...

    39编程范式游记(10)- 逻辑编程范式1

    【39编程范式游记(10)- 逻辑编程范式1】这篇文章主要介绍了逻辑编程的概念,特别是以Prolog语言为例进行了深入探讨。逻辑编程是一种基于逻辑学理论的编程方式,它允许程序员定义规则并陈述事实,然后通过推理寻找...

    冒号课堂-mobi,azw3,pdf

    在《冒号课堂编程范式与OOP思想》这本书中,作者深入浅出地讲解了编程的基础概念和OOP的核心理念。编程范式是理解编程语言结构和设计方式的关键,它包括过程化编程、函数式编程、面向对象编程等多种模式。其中,OOP...

    【AI框架基础】系列第四篇!最后一篇啦,函数式编程和声明式编程有什么区别?AI到底应该用什么编程范式?

    本文将探讨两种主要的编程范式——函数式编程和声明式编程,以及它们在AI框架中的应用。 首先,我们要理解函数式编程和声明式编程的核心概念。函数式编程强调计算过程为纯函数,即无副作用,相同输入永远产生相同...

    HNU编程新技术实务实验一——Java语言编程

    【标题】"HNU编程新技术实务实验一——Java语言编程"揭示了这是一份与Java编程相关的学习资源,特别关注于湖南大学(HNU)的编程新技术实务课程中的实验项目。这个实验可能涵盖基础到进阶的Java编程概念,旨在帮助...

    零基础小白Python入门必看——编程基础概念.docx

    零基础小白 Python 入门必看——编程基础概念 Python 是一种高级的、interpreted 的编程语言,它支持面向对象、过程式编程和函数式编程等多种编程范式。Python 语言的设计目标是易于学习、易于使用、灵活、可扩展。...

    面向方法编程AOP学习之二 —— “原始时代”

    面向方法编程(Method-Oriented Programming,MOP)是一种编程范式,旨在通过将相关功能组织在一起,提高代码的可重用性和可维护性。在本文中,我们将深入探讨MOP的一个重要概念——“原始时代”,这个术语通常用来...

    007——5. LabVIEW编程:面向对象编程之入门.pdf

    面向对象编程(Object-Oriented Programming,简称OOP)是一种流行的编程范式,它强调将数据和操作数据的函数封装在一起,形成独立的实体——对象。这种编程方式源自1960年代,最初在MIT的人工智能研究中使用,后来...

    实战sap程序开发——从实例学sap abap编程

    ABAP是一种结构化编程语言,支持过程和面向对象的编程范式。它包含了多种数据类型、控制结构(如循环、条件语句)、函数模块和报表编写工具。在SAP系统中,ABAP被用来创建和修改业务逻辑,比如报表、屏幕、对话模块...

    编程——Java

    在Java中,可以使用类(Class)和对象(Object)来实现面向对象的编程范式。类是创建对象的模板,而对象则是类的具体实例。类通常包括属性(变量)和方法(函数),它们共同定义了类的行为和状态。理解面向对象的三...

    JavaScript 函数式编程精要 —— 签约作者安东尼知识分享

    函数响应式编程 FRP 是一个编程范式,指的是使用函数来描述异步编程模型。作者讲解了 FRP 的概念和实现方法,并讨论了 FRP 在 JavaScript 中的应用。 Observable Observable 是一个函数响应式编程 FRP 中的概念,...

    简单的C#编程——贪吃蛇——C#学习

    它的语法清晰,支持强类型、垃圾回收和多种编程范式。 在"贪吃蛇"项目中,我们需要创建几个关键的类: 1. **Snake类**:这是程序的核心,负责定义蛇的行为。它包含蛇的身体部分(通常是一个列表),以及蛇的移动...

    WPF编程宝典——C# 2010版.pdf

    WPF的出现标志着微软在图形用户界面(GUI)编程上的一次重大变革,引入了基于XAML(可扩展应用程序标记语言)的声明式编程范式,与传统的C#编程相结合,为开发者提供了前所未有的设计自由度和强大的视觉效果实现能力...

    计算机编程导论——Python程序设计-PPT课件和代码.rar

    Python支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。 在PPT课件中,你将找到关于以下主题的详细讲解: 1. **基础语法**:变量定义、数据类型(如整数、浮点数、字符串、布尔值、列表、元组、字典...

    泛型编程与STL——侯捷译

    泛型编程是一种编程范式,它允许程序员编写不依赖于特定数据类型的代码。这样,同一段代码可以应用于多种类型的数据,增强了代码的通用性。在C++中,泛型编程主要通过模板来实现。模板可以是函数模板或类模板,它们...

    C#_单元四——面向对象编程.pdf

    面向对象编程(Object-Oriented Programming,简称OOP)是现代软件开发中广泛采用的一种编程范式,它基于数据和操作这些数据的方法,强调通过类和对象来组织代码。C#语言是支持OOP概念的强大工具,常用于构建各种...

    C++ Builder 5高级编程技术——IDE与OOP编程

    其次,OOP(Object-Oriented Programming)是一种编程范式,强调数据结构(对象)与操作数据的方法(函数)紧密结合。C++ Builder 5充分利用了C++的面向对象特性,提供了以下关键OOP概念的支持: 1. **类与对象**:...

Global site tag (gtag.js) - Google Analytics