`

关于动态函数的一点理解 — 《Dive Into Python》第十七章学习笔记

阅读更多

关于动态函数的一点理解  -  《Dive Into Python》第十七章学习笔记

平时的笔记都记录在书上,但这次的笔记太长,我准备打印出来用胶水粘到书上。

0. 写在前面

 

如果你有机会看到这一章,你会发现他的标题是“动态函数”。也就是说:“本章要讲述面向函数的编程”这一概念。如果你想学习python有没有看过这一章,我强烈推荐你去看。

Dive Into Python

先说句题外话,Java中函数只是函数,而不是数据,也因此我们无法使用Java语言进行面向函数的编程。反过来说:要想进行面向函数的变成,首先必须要具备的一个思想就是将函数视为数据。因为既然我们要动态函数,就不能像java一样仅仅去声明他,调用他,我们还要操纵他(我们通常管我们操纵的东西叫做数据)。

话题转来,开始对这样章的一个笔记(或者我自己的评论吧)

首先要说的是,关于函数我们需要了解的全部东西也无非就是:“我们可以怎样定义他?”和“你可以怎么持有(或者叫使用)他?”。下面我们就具体看一下python在这两个方面是如何动起来的。

 

1. 关于函数的持有(或者叫使用)方式

要面向函数编程,语言必须支持这样一个东西,我们可以把它当做函数来调用。而他也可以一会儿代表这个函数,一会儿代表那个函数。

C里面这个东西叫做函数指针。C++中你也可以使用”函数对象”的概念,重载运算符:()。
Java里面则没有类似的东西。
而在python中他就是一个函数对象,一个切切实实的对象。
包括python的很多动态语言都是这么做的,他们都已经将函数视为了数据,而不是Java中的与数据相区别的函数了。

2. 关于函数的定义(或者叫声明)方式。

现在我们已经有了“时而可以指向这个函数,时而可以指向那个函数”的东西。显然他在动态方面已经已经有了进步,然而这只是函数的持有方面,持有的手段已经动了起来,下面让我们看一看函数的定义方面。我认为这一部分相比前一部分更为精彩,虽然他们同样重要(好废的话。。。)

Java中,如果我们写下这样的一行代码:
        String str = "abc";


那么我们说,我们使用了字符串字面量"abc"来定义str,这个字面量是编译器直接就能懂的,在编译的时候就已经确定了的。当然,在java中我们要产生一个字符串的方法完全不局限于“字面量”,我们完全可以更动态得生成他。比如很多对象都有能够得到String的方法,最常见的恐怕就是toString()方法了,这种方法还有很多,他们都能动态得生成字符串。

然而Java中的函数呢? 很遗憾,如果和String做一个类比,那么我们可以说:在java中你只能使用“字面量函数”。也就是说如果你想拥有一个函数你就必须老老实实得在编译之前将它定义好。你没有办法得到没有被一字不差得敲入source文件中的任何函数(当然,使用面向切面的技术,使用动态代理,或者操作Java字节码文件除外)。这便是Java的函数不够动态得地方。

讨论了这么多java的函数,现在让我们看看python的函数吧。

 

2.1  lambda函数。

想让我们的代码更简洁吗?不想通篇充斥着只有一行的函数吗?
那么lambda正是我们的选择,他允许我们定义匿名函数,然后再将它赋值或者传递给别人。

是的,传统的函数(相当于字符串字面量的那种)要求必须被规规矩矩的,一板一眼的定义。然而我们要的是动态函数,Lambda函数正式为了改变这种不够动态的局面而生。他允许我们在任何我们想要一个函数的时候,任何我们想要一个函数的地方,去定义一个函数,然后传递或者使用他。(这些时空包括任何两行代码之间,或者一个表达式的内部等等。)

这的确使函数的概念充满了生机,然而这并不是最精彩的部分。当lambda函数遇见闭包的时候,他们将碰撞出更精彩得火花。

2.2  闭包(closure)


在开始闭包之前,让我们先做个停顿,回头看一下我们现在在哪儿。
得益于lambda函数,我们能够在任何地方,任何时候,定义我们自己的函数(插一句, 这个函数会是我们想要的吗? 我们想要的函数到底是一个什么样子呢? 或者还有别的样子吗?)。这是一件很美好的事情。我们现在到得地方就是这里,让我们站在这里想象一下,还有没有更美好的事情呢?

答案当然是“永远有”。如果我们能依赖当前的上下文来定义我们函数就更好了。因为这样的函数势必将更加有用。实际中的函数绝不会像计算a+b之和那么简单。如果定义函数的时候可以依赖上下文,那么我们便有了更强大的威力,去更灵活得定义函数。因为这样一来,我们能够容易得做到下面这些事情:
a. 在当前环境中的叫做language的变量的值是en,还是ch的时候,我所定义的函数表现会有所不同(处理多国语言)。
b. 比如当前环境中的一个叫rules变量不同时,返回将运用不同规则的函数等等。

让我们回到正题,上面所有需求的解决办法就是闭包:
所谓闭包(也有的叫闭合)是指:在一个动态函数中应用外部参数值的技术。

他还有其他的一些解释:所谓“闭包”指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

不管他的定义如何,他的目的都是“让我们能够将外部变量作为常量来定义我们的函数”。 典型的应用是我们会定义这样一写函数,他接受一些参数,而这些函数本身会根据这些参数的不同,构造出并返回不同的函数(他们是当前上下文所需要的函数,或者说是对当前上下文而言正确的函数)以供其他人使用。

 

3. 总结

本书的这一章以“将英文单词复数化的函数”为例,一共展示了六个版本。第一个版本是类似Java风格“传统方式”,重这一版本开始,一步一步得抽象,一步一步得去除重复,分离变化,直到最后使用动态函数的方式解决这一问题。

作者以这种方式告诉了读者:如何使用动态函数编写,更高抽象层次,更少重复,更少耦合,也更为可读得代码。

是的,动态函数并不是我们的目的,我们的目的依然是上面这些。为了他们我们要不遗余力。

 


4. 连接

[Dive Into Python]

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
1 楼 wjason 2009-08-10  
昨天看JavaScript,那里面管lambda叫函数直接量。

要是那个兄弟看到了就不好意思了,不对上面的帖子做更新了。

相关推荐

    《Dive Into Python 3中文版》PDF

    《Dive Into Python 3中文版》是一本深入学习Python 3编程语言的教程,适合初学者和有一定编程基础的开发者。这本书详细介绍了Python 3的各种特性,包括语法、数据结构、函数、类、模块、异常处理、输入/输出、网络...

    Dive into Python3

    《Dive into Python3》的压缩包文件名为diveintopython3-r860-2010-01-13,这可能表示它是2010年1月13日发布的第860个修订版。这个版本可能包含了作者对初版的修正和更新,以适应Python 3的最新发展。 通过阅读这...

    dive into python3 (中文版)

    首先,安装Python是学习Python语言的第一步。对于不同的操作系统,Python的安装方式略有不同。在GNU/Linux发行版中,虽然大多数默认安装了Python 2,但是许多发行版开始同时包含Python 3。对于MacOSX用户,可以使用...

    Dive Into Python 中文译文版

    《Dive Into Python》是一本深受程序员喜爱的Python编程教程,中文译文版的发布为中文读者提供了便利,尤其对于初学者来说,是学习Python语言的一份宝贵资源。该资源包含两个部分:PDF版本的译文和帮助文档,以及...

    DiveIntoPython

    《Dive Into Python》是一本深受编程初学者和有经验开发者喜爱的Python编程教程。这本书以其深入浅出的讲解方式,让学习者能够快速掌握Python编程语言的核心概念和实际应用,特别是对于想要涉足Web开发领域的读者,...

    Dive Into Python 2 中文版

    《Dive Into Python 2 中文版》是一本深度探讨Python编程语言的教程,适合已经有一定编程基础,希望深入理解Python特性和应用的读者。这本书以其详尽的解释和丰富的实例,为Python初学者和进阶者提供了全面的学习...

    dive-into-python3 (英文版)+深入python3(中文版)

    《Dive Into Python3》和《深入Python3》是两本深受Python爱好者欢迎的书籍,分别提供了英文和中文的学习资源,旨在帮助读者全面理解和掌握Python3编程语言。这两本书覆盖了Python3的基础语法、高级特性以及实际应用...

    Dive Into Python 3

    《深入Python 3》是一本全面且深入介绍Python 3编程语言的电子书籍,旨在帮助读者从...压缩包中的文件“diveintomark-diveintopython3-793871b”很可能是该书的源代码或HTML文件,可以配合阅读,加深对书中示例的理解。

    深入Python (Dive Into Python)

    深入python,深入Python (Dive Into Python) 译者序 by limodou 主页(http://phprecord.126.com) Python论坛 本书英文名字为《Dive Into Python》,其发布遵守 GNU 的自由文档许可证(Free Document Lience)的...

    diveintopython3

    在“diveintopython3-master”这个压缩包中,包含了这本书的所有源代码示例。通过这些代码,我们可以学习到以下关键知识点: 1. **Python基础**:包括变量、数据类型(如整型、浮点型、字符串、列表、元组、字典)...

    Dive Into Python V5.4

    《Dive Into Python V5.4》是一本深入学习Python编程语言的经典教程,以其详尽的解释和丰富的实例深受程序员们的喜爱。这个版本是官方提供的最新版本,它不仅包含了PDF格式的完整书籍,还附带了书中所有示例代码,为...

    Dive into python

    dive into python英文原版,Dive Into Python 3 covers Python 3 and its differences from Python 2. Compared to Dive Into Python, it’s about 20% revised and 80% new material. The book is now complete, ...

    Dive Into Python学习笔记

    【Python学习笔记】 《Dive Into Python》是一本广受欢迎的Python编程教程,专为已经具备其他编程语言经验的开发者设计。这本书通过实践的方式引导读者深入理解Python的各个方面,不仅覆盖了基础语法,还涉及到了...

    Dive Into Python 3 examples

    《Dive Into Python 3》是一本非常经典的Python编程教程,尤其适合初学者和有一定基础的程序员深入学习Python 3语言。这本书通过大量的实例来解释Python 3的关键概念和技术,帮助读者逐步掌握Python 3的核心知识。...

    《Dive Into Python》

    ### 《Dive Into Python》知识点总结 #### 第一章:了解Python ##### 1.1 入门 - **Python环境配置**:本节介绍了如何安装Python,并配置开发环境,以便于读者能够立即上手编写代码。 - **Python解释器使用**:...

    Dive Into Python 3 无水印pdf

    Dive Into Python 3 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

Global site tag (gtag.js) - Google Analytics