forked from wizardforcel/sicp-py-zh
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
4861f42
commit d56d123
Showing
2 changed files
with
104 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
# 2.1 引言 | ||
|
||
> 来源:[2.1 Introduction](http://www-inst.eecs.berkeley.edu/~cs61a/sp12/book/objects.html#introduction) | ||
> 译者:[飞龙](https://github.com/wizardforcel) | ||
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) | ||
在第一章中,我们专注于计算过程,以及程序设计中函数的作用。我们看到了如何使用原始数据(数值)和原始操作(算术运算),如何通过组合和控制来形式复合函数,以及如何通过给予过程名称来创建函数抽象。我们也看到了高阶函数通过操作通用计算方法来提升语言的威力。这是编程的本质。 | ||
|
||
这一章会专注于数据。数据允许我们通过使用已经获得的计算工具,表示和操作与世界有关的信息。脱离数据结构的编程可能会满足于探索数学特性,但是真实世界的情况,比如文档、关系、城市和气候模式,都拥有复杂的结构,它最好使用符合数据类型来表现。归功于互联网的高速发展,关于世界的大量结构信息可以免费从网上获得。 | ||
|
||
## 2.1.1 对象隐喻 | ||
|
||
在这门课的开始,我们区分了函数和数据:函数执行操作,而数据被操作。当我们在数据中包含函数值时,我们承认数据也拥有行为。函数可以像数据一样被操作,但是也可以被调用来执行计算。 | ||
|
||
在这门课中,对象作为我们对数据值的核心编程隐喻,它同样拥有行为。对象表示信息,但是同时和它们所表示的抽象概念行为一致。对象如何和其它对象交互的逻辑,和编码对象值的信息绑定在一起。在打印对象时,它直到如何以字母和数字把自己拼写出来。如果一个对象由几部分组成,它知道如何按照要求展示这些部分。对象即是信息也是过程,它们绑定在一起来展示复杂事物的属性、交互和行为。 | ||
|
||
Python 中所实现的对象隐喻具有特定的对象语法和相关的术语,我们会使用示例来介绍。日期(`date`)就是一种简单对象。 | ||
|
||
```py | ||
>>> from datetime import date | ||
``` | ||
|
||
`date`的名字绑定到了一个类上面。类表示一类对象。独立的日期叫做这个类的实例,它们可以通过像函数那样在参数上调用这个类来构造,这些参数描述了实例。 | ||
|
||
|
||
```py | ||
>>> today = date(2011, 9, 12) | ||
``` | ||
|
||
虽然`today`从原始数值中构造,它的行为就像日期那样。例如,将它与另一个日期相减会得到时间差,它可以通过调用`str`来展示为一行文本: | ||
|
||
```py | ||
>>> str(date(2011, 12, 2) - today) | ||
'81 days, 0:00:00' | ||
``` | ||
|
||
对象拥有属性,它们是带有名字的值,也是对象的一部分。Python 中,我们使用点运算符来访问对象属性: | ||
|
||
``` | ||
<expression> . <name> | ||
``` | ||
|
||
上面的`<expression>`求值为对象,`<name>`是对象的某个属性名称。 | ||
|
||
不像我们之前见过的名称,这些属性名称在一般的环境中不可用。反之,属性名称是点运算符之前的对象实例的特定部分。 | ||
|
||
```py | ||
>>> today.year | ||
2011 | ||
``` | ||
|
||
对象也拥有方法,它是值为函数的属性。在隐喻上,对象“知道”如何执行这些方法。方法从它们的参数和对象中计算出它们的结果。例如,`today`的`strftime`方法接受一个指定如何展示日期的参数(例如`%A`表示星期中天应该以全称拼写)。 | ||
|
||
```py | ||
>>> today.strftime('%A, %B %d') | ||
'Monday, September 12' | ||
``` | ||
|
||
计算`strftime`的返回值需要两个输入:描述输出格式的字符串,以及绑定到`today`的日期信息。这个方法使用日期特定的逻辑来产生结果。我们从不会说 2011 年九月十二日是星期一,但是知道一个人工作日的日期的一部分。通过绑定行为和信息,Python 对象提供了可靠、独立的日期抽象。 | ||
|
||
点运算符在 Python 中提供了另一种组合表达式。点运算符拥有定义好的求值过程。但是,点运算符如何求值的精确解释,要等到我们引入面向对象编程的完整范式,在几节之后。 | ||
|
||
即使我们还不能精确描述对象如何工作,我们还是可以开始将数据看做对象,因为 Python 中万物皆对象。 | ||
|
||
## 2.1.2 原始数据类型 | ||
|
||
Python 中每个对象都拥有一个类型。`type`函数可以让我们查看对象的类型。 | ||
|
||
```py | ||
>>> type(today) | ||
<class 'datetime.date'> | ||
``` | ||
|
||
目前为止,我们学过的唯一一种对象就是数值、函数、布尔值和现在的日期。我们也碰到了集合和字符串,我们需要更深入地学习它们。有许多其它的对象类型 -- 声音、图像、位置、数据连接等等 -- 它们的多数可以通过组合和抽象的手段来定义,我们在这一章会研究它们。Python 只有一小部分内建于语言的原始数据类型。 | ||
|
||
原始数据类型具有以下特性: | ||
|
||
1. 原始表达式可以计算这些类型的对象,叫做字面值。 | ||
2. 内建的函数、运算符和方法可以操作这些对象。 | ||
|
||
像我们看到的那样,数值是原始类型,数字字面值求值为数值,算术运算符操作数值对象: | ||
|
||
```py | ||
>>> 12 + 3000000000000000000000000 | ||
3000000000000000000000012 | ||
``` | ||
|
||
实际上,Python 包含了三个原始数值类型:整数(`int`)、实数(`float`)和复数(`complex`)。 | ||
|
||
```py | ||
>>> type(2) | ||
<class 'int'> | ||
>>> type(1.5) | ||
<class 'float'> | ||
>>> type(1+1j) | ||
<class 'complex'> | ||
``` | ||
|
||
名称`float`来源于实数在 Python 中表示的方式:“浮点”表示。虽然数值表示的细节不是这门课的话题,一些`int`和`float`对象的高层差异仍然很重要。特别是,`int`对象只能表示整数,但是表示得更精确,不带有任何近似。另一方面,`float`对象可以表示很大范围内的分数,但是不能表示所有有理数。然而,浮点对象通常用于近似表示实数和有理数,舍入到某个有效数字的数值。 | ||
|
||
**扩展阅读。**下面的章节介绍了更多的 Python 原始数据类型,专注于它们在创建使用数据抽象中的作用。Dive Into Python 3 中的[原始数据类型](http://diveintopython3.ep.io/native-datatypes.html)一章提供了所有 Python 数据类型的实用概览,以及如何高效使用它们,还包含了许多使用示例和实践提示。你现在并不需要阅读它,但是要考虑将它作为宝贵的参考。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
# 第二章 使用对象构建抽象 |