新書推薦:
《
中国官僚政治研究(一部洞悉中国政治制度演变的经典之作)
》
售價:NT$
286.0
《
锂电储能产品设计及案例详解
》
售價:NT$
505.0
《
首辅养成手册(全三册)
》
售價:NT$
551.0
《
清洁
》
售價:NT$
296.0
《
组队:超级个体时代的协作方式
》
售價:NT$
352.0
《
第十三位陪审员
》
售價:NT$
245.0
《
微观经济学(第三版)【2024诺贝尔经济学奖获奖者作品】
》
售價:NT$
709.0
《
Python贝叶斯深度学习
》
售價:NT$
407.0
|
編輯推薦: |
本书通过简单的计算任务(词频任务)来说明不同的编程风格,从而帮助读者更好地理解编写程序和设计系统的各种(不同)方式,新版增加了关于神经网络风格的部分。建议读者在阅读本书时,将之与在线代码库中提供的代码结合起来。本书以经常练习编程的人能够理解的方式解释和补充了原始代码。本书还可以用作计算机科学和软件工程专业的高级编程课程教材。
|
內容簡介: |
本书包含历史、基础风格、函数组合、对象和对象交互、反射和元编程、逆境、以数据为中心、并发、交互和神经网络十大部分,采用40种不同的编码风格实现同一词频任务。每一章都介绍一种编程风格,每章都先介绍编程风格的约束条件,然后给出示例程序代码,接着给出代码的详细解释。本书通过简单的计算任务来说明不同的编程风格,从而帮助读者更好地理解编写程序和设计系统的各种(不同)方式,可以用作计算机科学和软件工程专业的高级编程课程教材。本书以经常练习编程的人能够理解的方式对在线代码库中的原始代码进行了解释和补充。建议读者在阅读本书时,将之与在线代码库中提供的代码结合起来。本书的目标读者包括相关专业高年级本科生和研究生,以及其他对编程风格感兴趣的开发人员。
|
目錄:
|
目 录Contents
译者序
前言
第1版前言
导言
作者简介
第一部分 历史
第1章 往日的美好风格 3
1.1 约束条件 3
1.2 此编程风格的程序 4
1.3 评注 6
1.4 系统设计中的此编程风格 8
1.5 历史记录 8
1.6 延伸阅读 9
1.7 词汇表 9
1.8 练习 9
第2章 Forth风格 11
2.1 约束条件 11
2.2 此编程风格的程序 12
2.3 评注 14
2.4 历史记录 16
2.5 延伸阅读 16
2.6 词汇表 17
2.7 练习 17
第3章 数组风格 18
3.1 约束条件 18
3.2 此编程风格的程序 19
3.3 评注 20
3.4 系统设计中的此编程风格 22
3.5 历史记录 22
3.6 延伸阅读 22
3.7 词汇表 23
3.8 练习 23
第二部分 基础风格
第4章 单体风格 27
4.1 约束条件 27
4.2 此编程风格的程序 27
4.3 评注 28
4.4 系统设计中的此编程风格 30
4.5 延伸阅读 30
4.6 词汇表 31
4.7 练习 31
第5章 食谱风格 32
5.1 约束条件 32
5.2 此编程风格的程序 32
5.3 评注 34
5.4 系统设计中的此编程风格 35
5.5 历史记录 36
5.6 延伸阅读 36
5.7 词汇表 36
5.8 练习 37
第6章 流水线风格 38
6.1 约束条件 38
6.2 此编程风格的程序 39
6.3 评注 40
6.4 系统设计中的此编程风格 41
6.5 历史记录 42
6.6 延伸阅读 43
6.7 词汇表 44
6.8 练习 44
第7章 高尔夫风格 45
7.1 约束条件 45
7.2 此编程风格的程序 45
7.3 评注 46
7.4 系统设计中的此编程风格 46
7.5 历史记录 48
7.6 延伸阅读 48
7.7 词汇表 48
7.8 练习 48
第三部分 函数组合
第8章 无限反射风格 51
8.1 约束条件 51
8.2 此编程风格的程序 51
8.3 评注 52
8.4 历史记录 53
8.5 延伸阅读 53
8.6 词汇表 54
8.7 练习 54
第9章 Kick Forward风格 55
9.1 约束条件 55
9.2 此编程风格的程序 56
9.3 评注 57
9.4 系统设计中的此编程风格 57
9.5 历史记录 58
9.6 延伸阅读 58
9.7 词汇表 59
9.8 练习 59
第10章 The One风格 60
10.1 约束条件 60
10.2 此编程风格的程序 61
10.3 评注 62
10.4 历史记录 63
10.5 延伸阅读 63
10.6 词汇表 63
10.7 练习 64
第四部分 对象和对象交互
第11章 事物风格 67
11.1 约束条件 67
11.2 此编程风格的程序 68
11.3 评注 69
11.4 系统设计中的此编程风格 71
11.5 历史记录 72
11.6 延伸阅读 72
11.7 词汇表 72
11.8 练习 73
第12章 信箱风格 74
12.1 约束条件 74
12.2 此编程风格的程序 75
12.3 评注 76
12.4 系统设计中的此编程风格 77
12.5 历史记录 77
12.6 延伸阅读 78
12.7 词汇表 78
12.8 练习 78
第13章 闭映射风格 79
13.1 约束条件 79
13.2 此编程风格的程序 80
13.3 评注 81
13.4 历史记录 82
13.5 延伸阅读 82
13.6 词汇表 82
13.7 练习 83
第14章 抽象事物风格 84
14.1 约束条件 84
14.2 此编程风格的程序 85
14.3 评注 86
14.4 系统设计中的此编程风格 89
14.5 历史记录 89
14.6 延伸阅读 89
14.7 词汇表 90
14.8 练习 90
第15章 好莱坞风格 91
15.1 约束条件 91
15.2 此编程风格的程序 91
15.3 评注 93
15.4 系统设计中的此编程风格 95
15.5 历史记录 95
15.6 延伸阅读 95
15.7 词汇表 95
15.8 练习 96
第16章 公告板风格 97
16.1 约束条件 97
16.2 此编程风格的程序 98
16.3 评注 99
16.4 系统设计中的此编程风格 101
16.5 历史记录 101
16.6 延伸阅读 101
16.7 词汇表 101
16.8 练习 102
第五部分 反射和元编程
第17章 自省风格 105
17.1 约束条件 105
17.2 此编程风格的程序 106
17.3 评注 106
17.4 系统设计中的此编程风格 107
17.5 词汇表 107
17.6 练习 108
第18章 反射风格 109
18.1 约束条件 109
18.2 此编程风格的程序 109
18.3 评注 110
18.4 系统设计中的此编程风格 112
18.5 历史记录 112
18.6 延伸阅读 113
18.7 词汇表 113
18.8 练习 113
|
內容試閱:
|
导 言 Prologue
词频
就像Queneau的故事一样,本书中的计算任务很简单:给定一个文本文件,我们希望显示N(例如25)个出现频率最高的单词,以及它们对应的出现频率,并且按词频降序排列。我们应确保对单词的大小写进行规范并忽略诸如 “the”“for”等停用词。为了简单起见,我们不关心词频相同的单词的顺序。这个计算任务被称为词频分析任务。
以下是一个词频程序接收的输入文件,以及程序运行后产生的相应输出的示例:
输入:
输出:
如果对Gutenberg Collection上提供的简·奥斯汀的《傲慢与偏见》运行这个词频程序,我们将得到以下输出:
本书的所有示例程序都(分别)实现了这个词频分析任务。此外,每章都有一组练习,其中一个练习是使用相应的风格实现另一个简单的计算任务。下面我给出了一些建议。
练习中的这些计算任务足够简单,任何高年级学生都可以轻松解决。读者们不应该把解决算法上的困难作为关注点,相反,应该把关注点放在遵循每种风格的约束上。
单词索引
对于给定的文本文件,按字母顺序输出所有单词,以及它们在书中出现的页码。忽略出现超过100 次的所有单词。假设每页45行文字。例如,对于给定的《傲慢与偏见》,索引的前几个条目将是:
单词的上下文
对于给定的文本文件,按字母顺序显示某些单词和它的上下文,以及它们出现的页码。假设每页45行文字。假设上下文单词包含前面两个词及后面两个词。忽略标点符号。例如,对于给定的《傲慢与偏见》,单词“concealment”和“hurt”的上下文结果输出如下:
(给定单词的)上下文任务中的单词有:concealment、discontented、hurt、agitation、mortifying、reproach、unexpected、indignation、mistake和confusion。
Python主义
本书中使用的示例代码都是用Python编写的,但是理解这些风格并不需要Python专业知识。事实上,每章都有一个用其他语言编写示例程序的练习。因此,读者只需要能够阅读Python而无须使用Python编写程序。
Python相对容易阅读。然而,该编程语言的一些功能可能会使习惯其他编程语言的读者感到困惑。这里将解释其中的一些:
列表(List)。在Python中,列表是一种由专用语法支持的原始数据类型,该语法通常与类C语言中的数组相关联,例如mylist = [0, 1, 2, 3, 4, 5]。Python没有将数组作为原始数据类型,并且在大多数情况下,若在类C语言中使用数组,那么在Python 中将使用列表。
元组(Tuple)。元组是一个不可变的列表。元组也是由专用语法支持的原始数据类型,通常与类LISP语言中的列表相关联,例如mytuple = (0, 1, 2, 3, 4)。元组和列表的处理方式相似,只是元组是不可变的,因此更改列表的操作不适用于元组。
列表索引(List indexing)。列表和元组的元素通过索引的方式来访问,例如mylist[某个索引值]。列表的索引下界是0,和类C语言一样,列表的长度是len(mylist)。通过索引访问列表的表现力远比这个简单示例所呈现的更强。以下是更多示例:
mylist[0],列表的第一个元素;
mylist[-1],列表的最后一个元素;
mylist[-2],列表的倒数第二个元素;
mylist[1:],列表mylist中,索引1到列表结束对应的全部元素;
mylist[1:3],列表mylist中,索引1到索引3对应的全部元素;
mylist[::2],列表mylist中,从第一个元素开始,每隔一个元素获取一个元素,直到列表结束;
mylist[start:stop:step],列表mylist中,从索引start开始到索引stop结束每隔step个元素获取一个元素。
边界(Bound)。对超出列表长度的元素进行索引将产生IndexError。例如,如预期的一样,尝试访问包含3个元素的列表的第4个元素(例如 [10, 20, 30][3])会导致IndexError。然而,Python中许多针对列表(以及通用集合)的操作,在索引方面都是建构主义风格。例如,在只有3个元素的列表中获取索引3到100的元素组成的列表(例如 [10, 20, 30][3:100]),会生成空列表 ([]) 而不是导致IndexError。类似地,任何列表访问索引只要部分覆盖列表都会得到覆盖列表的部分的结果,不会导致IndexError(例如 [10, 20, 30][2:10]的结果为 [30])。对于习惯了严格语言的人来说,这种建构主义风格起初可能令人费解。
字典(Dictionary)。在Python中,字典或映射也是由专用语法支持的原始数据类型,例如mydict = {a : 1, b : 2}。这个特定的字典将两个字符串键映射到两个整数值。通常,键和值可以是任何类型的。在Java中,这些类型的字典对应HashMap类等形式,而在C 中,它们对应类模板map等形式。
self。在大多数面向对象的语言中,对象对自身的引用是通过特殊语法隐式实现的,例如Java和C 中的this、PHP中的$this或Ruby中的@。与这些语言不同,Python在这方面没有专门的语法。此外,实例方法只是将对象作为第一个参数的类方法。此时,第一个参数按照惯例称为self,但不是语言的特殊要求。以下是一个类定义的示例,其中包含2个实例方法:
这两个方法都有一个名为self且在第一个位置的参数,在它们的函数体中都会访问这个参数(self)。self这个词没有什么特别之处,方法可以使用任何其他名称,例如me或my甚至this,但是除self之外的任何词都不会被Python程序员接受。然而,在调用实例方法时,可能会很令人惊讶,因为省略了第一个参数(self):
这种参数数量上的不匹配是由Python中的点符号(.)导致的,它只是另一种更原始的方法调用的语法糖:
构造函数。在Python中,构造函数是名为__init__的常规方法。具有这个名称的方法会在对象创建后立即被Python运行时自动调用。下面是一个带有构造函数的类及其用法的示例:
|
|